ERC-721
Overview
Max Total Supply
596 Knights
Holders
84
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
4 KnightsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Knights
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-28 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/escrow/Escrow.sol // OpenZeppelin Contracts v4.4.1 (utils/escrow/Escrow.sol) pragma solidity ^0.8.0; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its owner, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Ownable { using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public payable virtual onlyOwner { uint256 amount = msg.value; _deposits[payee] += amount; emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding all gas to the * recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public virtual onlyOwner { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } } // File: @openzeppelin/contracts/security/PullPayment.sol // OpenZeppelin Contracts v4.4.1 (security/PullPayment.sol) pragma solidity ^0.8.0; /** * @dev Simple implementation of a * https://consensys.github.io/smart-contract-best-practices/recommendations/#favor-pull-over-push-for-external-calls[pull-payment] * strategy, where the paying contract doesn't interact directly with the * receiver account, which must withdraw its payments itself. * * Pull-payments are often considered the best practice when it comes to sending * Ether, security-wise. It prevents recipients from blocking execution, and * eliminates reentrancy concerns. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * To use, derive from the `PullPayment` contract, and use {_asyncTransfer} * instead of Solidity's `transfer` function. Payees can query their due * payments with {payments}, and retrieve them with {withdrawPayments}. */ abstract contract PullPayment { Escrow private immutable _escrow; constructor() { _escrow = new Escrow(); } /** * @dev Withdraw accumulated payments, forwarding all gas to the recipient. * * Note that _any_ account can call this function, not just the `payee`. * This means that contracts unaware of the `PullPayment` protocol can still * receive funds this way, by having a separate account call * {withdrawPayments}. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee Whose payments will be withdrawn. */ function withdrawPayments(address payable payee) public virtual { _escrow.withdraw(payee); } /** * @dev Returns the payments owed to an address. * @param dest The creditor's address. */ function payments(address dest) public view returns (uint256) { return _escrow.depositsOf(dest); } /** * @dev Called by the payer to store the sent amount as credit to be pulled. * Funds sent in this way are stored in an intermediate {Escrow} contract, so * there is no danger of them being spent before withdrawal. * * @param dest The destination address of the funds. * @param amount The amount to transfer. */ function _asyncTransfer(address dest, uint256 amount) internal virtual { _escrow.deposit{value: amount}(dest); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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 TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/Knights.sol pragma solidity ^0.8.4; /** * @title Knights On Chain * @dev Developed by unicornfloor.eth, raysa.eth, sauli */ contract Knights is ERC721A, PullPayment { using Strings for uint256; //____ERC721A__Variables___________________________________________________________________________________________________________________ bool public mintEnabled = false; uint256 public mintCost = 0.015 ether; uint256 public maxSupply = 10000; uint256 public maxMintAmountPerTx = 5; string public uriPrefix = ''; string public uriSuffix = '.json'; //____Game__Variables___________________________________________________________________________________________________________________ address public owner; address private operator; WaitingRoomData[] private waitingRoom; uint256 private basePower = 70; uint256 public costPerBattle = 0.03 ether; bool public editingIsDisabled = false; bytes32 private merkleRoot; //____Game__Structs___________________________________________________________________________________________________________________ struct WaitingRoomData { uint256 knightId; address userAddress; uint256 playPrice; } struct Knight { uint256 id; uint256 level; string headType; string weaponType; } //____Game__Mappings___________________________________________________________________________________________________________________ mapping(uint256 => Knight) private db; mapping(string => mapping(string => uint16)) public weakness; //____Events___________________________________________________________________________________________________________________ event BattleResult( address indexed _winner, address indexed _loser, uint256 _winnerKnight, uint256 _loserKnight, uint256 _winnerDamage, uint256 _loserDamage, uint256 _ethEarned, uint256 _generatedRand ); event EtherReceived( address indexed _from, uint256 _value ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() ERC721A('Knights On Chain', 'Knights') { address msgSender = _msgSender(); owner = msgSender; } /** * @dev Receive from any account. */ receive() external payable { _asyncTransfer(owner, msg.value); emit EtherReceived(_msgSender(), msg.value); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner == _msgSender(), 'Ownable: caller is not the owner'); _; } modifier mintCompliance(uint256 _mintAmount) { require(mintEnabled, 'Minting is Not enabled'); require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, 'Invalid mint amount!'); require(totalSupply() + _mintAmount <= maxSupply, 'Max supply exceeded!'); _; } modifier mintPriceCompliance(uint256 _mintAmount) { if (_msgSender() != owner) { require(msg.value >= mintCost * _mintAmount, 'Insufficient funds!'); } _; } /** * @dev Get sender's value. */ function _msgValue() internal view returns (uint256) { return msg.value; } /** * @dev Update owner of the contract to a new account (`_newOwner`). * Can only be called by the current owner. */ function updateOwner(address _newOwner) public onlyOwner { // avoid burning ownership in case battle cost needs to be updated require(_newOwner != address(0), 'Ownable: new owner can not be the zero address'); owner = _newOwner; } function _getWinner(address _player1, address _player2, uint256 _damage1, uint256 _damage2) private view returns (address, uint) { uint8 diff = 50; uint reducedDamage1 = _damage1 - diff; uint reducedDamage2 = _damage2 - diff; // solhint-disable-next-line uint rand = uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, [_player1, _player2]))); uint index = rand % (reducedDamage1 + reducedDamage2); if(index > reducedDamage1) { return (_player2, index); } else { return (_player1, index); } } function updateBattlePrice(uint256 _newBattlePrice) public onlyOwner { require(_newBattlePrice > 0, 'Price: Battle price has to be more than 0'); if (waitingRoom.length > 0) { for (uint256 i = 0; i < waitingRoom.length; i++) { _asyncTransfer(waitingRoom[i].userAddress, waitingRoom[i].playPrice); } delete waitingRoom; } costPerBattle = _newBattlePrice; } function updateMintingPrice(uint256 _newMintingPrice) public onlyOwner { require(_newMintingPrice > 0, 'Mint: mint price has to be more than 0'); mintCost = _newMintingPrice; } function disableEditing() public onlyOwner { editingIsDisabled = true; } function setMintingState(bool _newState) public onlyOwner { mintEnabled = _newState; } function updateOperator(address _newOperator) public onlyOwner { operator = _newOperator; } function addKnightsToDB( uint16 initialId, string[] memory headTypes, string[] memory weaponTypes ) public { require(owner == _msgSender() || operator == _msgSender(), 'caller is not authorized'); require( headTypes.length == weaponTypes.length, 'headTypes and weaponTypes must have the same length.' ); require(initialId <= maxSupply, 'initialId must be less than maxSupply'); require(initialId >= _startTokenId(), 'initialId must be greater than or equal to _startTokenId'); require(!editingIsDisabled, 'Game can not be edited anymore'); for (uint16 i = 0; i < headTypes.length; i++) { uint16 id = initialId + i; db[id].id = id; db[id].headType = headTypes[i]; db[id].weaponType = weaponTypes[i]; } } function getKnightDB(uint256 id) public view returns (Knight memory) { if (_msgSender() != owner) { require(id <= totalSupply(), 'This Knight has not minted yet'); } return (db[id]); } function setWeaknesses( string[] memory _types, string[][] memory _weaknesses, uint16 _weaknessesValues ) public { require(owner == _msgSender() || operator == _msgSender(), 'caller is not authorized'); require(!editingIsDisabled, 'Game can not be edited anymore'); require(_types.length == _weaknesses.length, '_types and _weaknesses must have the same length.'); for (uint16 typeIndex = 0; typeIndex < _types.length; typeIndex++) { for (uint16 weaknessIndex = 0; weaknessIndex < _weaknesses[typeIndex].length; weaknessIndex++) { weakness[_types[typeIndex]][_weaknesses[typeIndex][weaknessIndex]] = _weaknessesValues; } } } function getEffect(string memory _type, string memory _effect) private view returns (uint16) { return weakness[_type][_effect]; } function getDamage( string memory _receiverHeadType, string memory _attackerHeadType, string memory _attackerAttackType, uint256 _attackerLevel ) private view returns (uint256) { uint16 enemyTypeEffect = getEffect(_receiverHeadType, _attackerHeadType); uint16 enemyAttackEffect = getEffect(_receiverHeadType, _attackerAttackType); return Math.max(Math.max(enemyTypeEffect, enemyAttackEffect), 1) * (basePower + _attackerLevel); } function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner { merkleRoot = _merkleRoot; } function getMerkleRoot() public view onlyOwner returns (bytes32) { return merkleRoot; } function battle(uint256 _knightId) public payable returns (bool battleSuccess) { require(_msgValue() >= costPerBattle, 'Price: error'); require(ownerOf(_knightId) == _msgSender(), 'owner: Your dont own that NFT'); if (waitingRoom.length >= 1) { uint256 contractFee = ((waitingRoom[0].playPrice + _msgValue()) / 100) * 2; _asyncTransfer(owner, contractFee); // Prize - contract fee uint256 winnerProfit = (waitingRoom[0].playPrice + _msgValue()) - contractFee; // Waiting player data string memory waitingPlayerHeadType = db[waitingRoom[0].knightId].headType; string memory waitingPlayerWeaponType = db[waitingRoom[0].knightId].weaponType; // New player data string memory newPlayerHeadType = db[_knightId].headType; string memory newPlayerWeaponType = db[_knightId].weaponType; uint256 newPlayerAttackDamage = getDamage( waitingPlayerHeadType, newPlayerHeadType, newPlayerWeaponType, db[_knightId].level ); uint256 waitingPlayerAttackDamage = getDamage( newPlayerHeadType, waitingPlayerHeadType, waitingPlayerWeaponType, db[waitingRoom[0].knightId].level ); (address winner, uint generatedRand) = _getWinner(_msgSender(), waitingRoom[0].userAddress, newPlayerAttackDamage, waitingPlayerAttackDamage); if (winner == waitingRoom[0].userAddress) { _asyncTransfer(waitingRoom[0].userAddress, winnerProfit); // increase winner level if (db[waitingRoom[0].knightId].level < 100) { db[waitingRoom[0].knightId].level += 1; } // emit battle result emit BattleResult( waitingRoom[0].userAddress, _msgSender(), waitingRoom[0].knightId, _knightId, waitingPlayerAttackDamage, newPlayerAttackDamage, winnerProfit, generatedRand ); } else { _asyncTransfer(_msgSender(), winnerProfit); // increase winner level if (db[_knightId].level < 100) { db[_knightId].level += 1; } // emit battle result emit BattleResult( _msgSender(), waitingRoom[0].userAddress, _knightId, waitingRoom[0].knightId, newPlayerAttackDamage, waitingPlayerAttackDamage, winnerProfit, generatedRand ); } waitingRoom.pop(); // battle did happen return true; } waitingRoom.push(WaitingRoomData(_knightId, _msgSender(), _msgValue())); return false; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = _startTokenId(); uint256 ownedTokenIndex = 0; address latestOwnerAddress; while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) { TokenOwnership memory ownership = _ownerships[currentTokenId]; if (!ownership.burned) { if (ownership.addr != address(0)) { latestOwnerAddress = ownership.addr; } if (latestOwnerAddress == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } } currentTokenId++; } return ownedTokenIds; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } // mint function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { _safeMint(_msgSender(), _mintAmount); _asyncTransfer(owner, msg.value); } // mintMerkle function mintMerkle(string[] memory _headType, string[] memory _weaponType, bytes32[][] calldata _merkleProof, uint8 _mintAmount) public payable mintCompliance(_mintAmount) mintPriceCompliance(_mintAmount) { uint256 initialIndex = _currentIndex; for (uint8 i = 0; i < _mintAmount; i++) { uint256 tokenId = initialIndex + i; bytes32 leaf = keccak256(abi.encodePacked(Strings.toString(tokenId), '-', _headType[i], '-', _weaponType[i])); require(MerkleProof.verify(_merkleProof[i], merkleRoot, leaf), 'Invalid proof!'); } _safeMint(_msgSender(), _mintAmount); _asyncTransfer(owner, msg.value); for (uint8 i = 0; i < _mintAmount; i++) { uint256 tokenId = initialIndex + i; db[tokenId].id = tokenId; db[tokenId].headType = _headType[i]; db[tokenId].weaponType = _weaponType[i]; } } // Reserve Knights function reserveKnights(address _receiver, uint256 _mintAmount) public onlyOwner { _safeMint(_receiver, _mintAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_winner","type":"address"},{"indexed":true,"internalType":"address","name":"_loser","type":"address"},{"indexed":false,"internalType":"uint256","name":"_winnerKnight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_loserKnight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_winnerDamage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_loserDamage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_ethEarned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_generatedRand","type":"uint256"}],"name":"BattleResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"EtherReceived","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"},{"inputs":[{"internalType":"uint16","name":"initialId","type":"uint16"},{"internalType":"string[]","name":"headTypes","type":"string[]"},{"internalType":"string[]","name":"weaponTypes","type":"string[]"}],"name":"addKnightsToDB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_knightId","type":"uint256"}],"name":"battle","outputs":[{"internalType":"bool","name":"battleSuccess","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"costPerBattle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableEditing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"editingIsDisabled","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":"getKnightDB","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"},{"internalType":"string","name":"headType","type":"string"},{"internalType":"string","name":"weaponType","type":"string"}],"internalType":"struct Knights.Knight","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_headType","type":"string[]"},{"internalType":"string[]","name":"_weaponType","type":"string[]"},{"internalType":"bytes32[][]","name":"_merkleProof","type":"bytes32[][]"},{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"mintMerkle","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":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"reserveKnights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_newState","type":"bool"}],"name":"setMintingState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_types","type":"string[]"},{"internalType":"string[][]","name":"_weaknesses","type":"string[][]"},{"internalType":"uint16","name":"_weaknessesValues","type":"uint16"}],"name":"setWeaknesses","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":"_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":"uint256","name":"_newBattlePrice","type":"uint256"}],"name":"updateBattlePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMintingPrice","type":"uint256"}],"name":"updateMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"updateOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"name":"weakness","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6008805460ff1916905566354a6ba7a18000600955612710600a556005600b5560c06040819052600060a08190526200003b91600c9162000175565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200006a91600d9162000175565b506046601155666a94d74f4300006012556013805460ff191690553480156200009257600080fd5b50604080518082018252601081526f25b734b3b43a399027b71021b430b4b760811b6020808301918252835180850190945260078452664b6e696768747360c81b908401528151919291620000ea9160029162000175565b5080516200010090600390602084019062000175565b5060016000555050604051620001169062000204565b604051809103906000f08015801562000133573d6000803e3d6000fd5b5060601b6001600160601b03191660805260006200014e3390565b600e80546001600160a01b0319166001600160a01b03929092169190911790555062000266565b828054620001839062000229565b90600052602060002090601f016020900481019282620001a75760008555620001f2565b82601f10620001c257805160ff1916838001178555620001f2565b82800160010185558215620001f2579182015b82811115620001f2578251825591602001919060010190620001d5565b506200020092915062000212565b5090565b6105f2806200422d83390190565b5b8082111562000200576000815560010162000213565b600181811c908216806200023e57607f821691505b602082108114156200026057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c613f9a620002936000396000818161089b01528181610d5c01526127ac0152613f9a6000f3fe60806040526004361061026b5760003560e01c80637ec4a65911610144578063bdb4b848116100b6578063d56405ec1161007a578063d56405ec1461075b578063d5abeb0114610771578063e2982c2114610787578063e8c26b8f146107a7578063e985e9c514610813578063f381baa61461085c57600080fd5b8063bdb4b848146106d6578063c87b56dd146106ec578063cb39665c1461070c578063d12397301461072c578063d42ccb501461074657600080fd5b806395d89b411161010857806395d89b411461062e5780639bbf832514610643578063a0712d6814610663578063a22cb46514610676578063ac7475ed14610696578063b88d4fde146106b657600080fd5b80637ec4a65914610598578063837da079146105b8578063880cdc31146105d85780638da5cb5b146105f857806394354fd01461061857600080fd5b806344cbab6e116101dd57806362b99ad4116101a157806362b99ad4146104f65780636352211e1461050b57806363e12a7b1461052b5780636df12fd91461053e57806370a08231146105585780637cb647591461057857600080fd5b806344cbab6e1461046c57806349590657146104995780635503a0e8146104ae5780635788ff36146104c35780635d6de796146104e357600080fd5b806316ba10e01161022f57806316ba10e01461039357806318160ddd146103b357806323b872dd146103df57806331b3eb94146103ff57806342842e0e1461041f578063438b63001461043f57600080fd5b806301ffc9a7146102c257806306fdde03146102f7578063081812fc14610319578063095ea7b314610351578063155ea24a1461037357600080fd5b366102bd57600e54610286906001600160a01b03163461087c565b60405134815233907f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b9060200160405180910390a2005b600080fd5b3480156102ce57600080fd5b506102e26102dd36600461389a565b6108fd565b60405190151581526020015b60405180910390f35b34801561030357600080fd5b5061030c61094f565b6040516102ee9190613c2a565b34801561032557600080fd5b50610339610334366004613881565b6109e1565b6040516001600160a01b0390911681526020016102ee565b34801561035d57600080fd5b5061037161036c366004613681565b610a25565b005b34801561037f57600080fd5b5061037161038e3660046136ad565b610ab3565b34801561039f57600080fd5b506103716103ae3660046138d4565b610cf1565b3480156103bf57600080fd5b506103d1600154600054036000190190565b6040519081526020016102ee565b3480156103eb57600080fd5b506103716103fa36600461358c565b610d32565b34801561040b57600080fd5b5061037161041a366004613536565b610d3d565b34801561042b57600080fd5b5061037161043a36600461358c565b610dbb565b34801561044b57600080fd5b5061045f61045a366004613536565b610dd6565b6040516102ee9190613be6565b34801561047857600080fd5b5061048c610487366004613881565b610f16565b6040516102ee9190613c72565b3480156104a557600080fd5b506103d1611119565b3480156104ba57600080fd5b5061030c61114d565b3480156104cf57600080fd5b506103716104de366004613881565b6111db565b6102e26104f1366004613881565b611269565b34801561050257600080fd5b5061030c611af6565b34801561051757600080fd5b50610339610526366004613881565b611b03565b610371610539366004613797565b611b15565b34801561054a57600080fd5b506013546102e29060ff1681565b34801561056457600080fd5b506103d1610573366004613536565b611ee3565b34801561058457600080fd5b50610371610593366004613881565b611f31565b3480156105a457600080fd5b506103716105b33660046138d4565b611f60565b3480156105c457600080fd5b506103716105d336600461396b565b611f9d565b3480156105e457600080fd5b506103716105f3366004613536565b612287565b34801561060457600080fd5b50600e54610339906001600160a01b031681565b34801561062457600080fd5b506103d1600b5481565b34801561063a57600080fd5b5061030c612340565b34801561064f57600080fd5b5061037161065e366004613866565b61234f565b610371610671366004613881565b61238c565b34801561068257600080fd5b5061037161069136600461364c565b612522565b3480156106a257600080fd5b506103716106b1366004613536565b6125b8565b3480156106c257600080fd5b506103716106d13660046135cd565b612604565b3480156106e257600080fd5b506103d160095481565b3480156106f857600080fd5b5061030c610707366004613881565b61264f565b34801561071857600080fd5b50610371610727366004613681565b61271d565b34801561073857600080fd5b506008546102e29060ff1681565b34801561075257600080fd5b50610371612751565b34801561076757600080fd5b506103d160125481565b34801561077d57600080fd5b506103d1600a5481565b34801561079357600080fd5b506103d16107a2366004613536565b61278a565b3480156107b357600080fd5b506108006107c2366004613908565b8151602081840181018051601682529282019482019490942091909352815180830184018051928152908401929093019190912091525461ffff1681565b60405161ffff90911681526020016102ee565b34801561081f57600080fd5b506102e261082e366004613553565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561086857600080fd5b50610371610877366004613881565b612828565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024016000604051808303818588803b1580156108e057600080fd5b505af11580156108f4573d6000803e3d6000fd5b50505050505050565b60006001600160e01b031982166380ac58cd60e01b148061092e57506001600160e01b03198216635b5e139f60e01b145b8061094957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461095e90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461098a90613e1f565b80156109d75780601f106109ac576101008083540402835291602001916109d7565b820191906000526020600020905b8154815290600101906020018083116109ba57829003601f168201915b5050505050905090565b60006109ec82612952565b610a09576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a3082611b03565b9050806001600160a01b0316836001600160a01b03161415610a655760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a855750610a83813361082e565b155b15610aa3576040516367d9dca160e11b815260040160405180910390fd5b610aae83838361298b565b505050565b600e546001600160a01b0316331480610ad65750600f546001600160a01b031633145b610b225760405162461bcd60e51b815260206004820152601860248201527718d85b1b195c881a5cc81b9bdd08185d5d1a1bdc9a5e995960421b60448201526064015b60405180910390fd5b60135460ff1615610b755760405162461bcd60e51b815260206004820152601e60248201527f47616d652063616e206e6f742062652065646974656420616e796d6f726500006044820152606401610b19565b8151835114610be05760405162461bcd60e51b815260206004820152603160248201527f5f747970657320616e64205f7765616b6e6573736573206d7573742068617665604482015270103a34329039b0b6b2903632b733ba341760791b6064820152608401610b19565b60005b83518161ffff161015610ceb5760005b838261ffff1681518110610c0957610c09613f0d565b6020026020010151518161ffff161015610cd857826016868461ffff1681518110610c3657610c36613f0d565b6020026020010151604051610c4b9190613a23565b9081526020016040518091039020858461ffff1681518110610c6f57610c6f613f0d565b60200260200101518361ffff1681518110610c8c57610c8c613f0d565b6020026020010151604051610ca19190613a23565b908152604051908190036020019020805461ffff9290921661ffff1990921691909117905580610cd081613e5a565b915050610bf3565b5080610ce381613e5a565b915050610be3565b50505050565b600e546001600160a01b03163314610d1b5760405162461bcd60e51b8152600401610b1990613c3d565b8051610d2e90600d906020840190613307565b5050565b610aae8383836129e7565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d990602401600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b5050505050565b610aae83838360405180602001604052806000815250612604565b60606000610de383611ee3565b90506000816001600160401b03811115610dff57610dff613f23565b604051908082528060200260200182016040528015610e28578160200160208202803683370190505b50905060016000805b8482108015610e41575060005483105b15610f0b57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610ef85780516001600160a01b031615610eb257805191505b876001600160a01b0316826001600160a01b03161415610ef85783858481518110610edf57610edf613f0d565b602090810291909101015282610ef481613e7c565b9350505b83610f0281613e7c565b94505050610e31565b509195945050505050565b610f416040518060800160405280600081526020016000815260200160608152602001606081525090565b600e546001600160a01b0316336001600160a01b031614610fbc57610f6d600154600054036000190190565b821115610fbc5760405162461bcd60e51b815260206004820152601e60248201527f54686973204b6e6967687420686173206e6f74206d696e7465642079657400006044820152606401610b19565b601560008381526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282018054610ffe90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461102a90613e1f565b80156110775780601f1061104c57610100808354040283529160200191611077565b820191906000526020600020905b81548152906001019060200180831161105a57829003601f168201915b5050505050815260200160038201805461109090613e1f565b80601f01602080910402602001604051908101604052809291908181526020018280546110bc90613e1f565b80156111095780601f106110de57610100808354040283529160200191611109565b820191906000526020600020905b8154815290600101906020018083116110ec57829003601f168201915b5050505050815250509050919050565b600e546000906001600160a01b031633146111465760405162461bcd60e51b8152600401610b1990613c3d565b5060145490565b600d805461115a90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461118690613e1f565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b505050505081565b600e546001600160a01b031633146112055760405162461bcd60e51b8152600401610b1990613c3d565b600081116112645760405162461bcd60e51b815260206004820152602660248201527f4d696e743a206d696e742070726963652068617320746f206265206d6f72652060448201526507468616e20360d41b6064820152608401610b19565b600955565b60006012546112753490565b10156112b25760405162461bcd60e51b815260206004820152600c60248201526b283934b1b29d1032b93937b960a11b6044820152606401610b19565b336112bc83611b03565b6001600160a01b0316146113125760405162461bcd60e51b815260206004820152601d60248201527f6f776e65723a20596f757220646f6e74206f776e2074686174204e46540000006044820152606401610b19565b601054600111611a78576000606434601060008154811061133557611335613f0d565b9060005260206000209060030201600201546113519190613d91565b61135b9190613da9565b611366906002613dbd565b600e5490915061137f906001600160a01b03168261087c565b60008134601060008154811061139757611397613f0d565b9060005260206000209060030201600201546113b39190613d91565b6113bd9190613ddc565b905060006015600060106000815481106113d9576113d9613f0d565b9060005260206000209060030201600001548152602001908152602001600020600201805461140790613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461143390613e1f565b80156114805780601f1061145557610100808354040283529160200191611480565b820191906000526020600020905b81548152906001019060200180831161146357829003601f168201915b5050505050905060006015600060106000815481106114a1576114a1613f0d565b906000526020600020906003020160000154815260200190815260200160002060030180546114cf90613e1f565b80601f01602080910402602001604051908101604052809291908181526020018280546114fb90613e1f565b80156115485780601f1061151d57610100808354040283529160200191611548565b820191906000526020600020905b81548152906001019060200180831161152b57829003601f168201915b50505050509050600060156000888152602001908152602001600020600201805461157290613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461159e90613e1f565b80156115eb5780601f106115c0576101008083540402835291602001916115eb565b820191906000526020600020905b8154815290600101906020018083116115ce57829003601f168201915b50505050509050600060156000898152602001908152602001600020600301805461161590613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461164190613e1f565b801561168e5780601f106116635761010080835404028352916020019161168e565b820191906000526020600020905b81548152906001019060200180831161167157829003601f168201915b5050505050905060006116b9858484601560008e815260200190815260200160002060010154612bd2565b905060006117048487876015600060106000815481106116db576116db613f0d565b906000526020600020906003020160000154815260200190815260200160002060010154612bd2565b905060008061174533601060008154811061172157611721613f0d565b60009182526020909120600160039092020101546001600160a01b03168686612c30565b91509150601060008154811061175d5761175d613f0d565b60009182526020909120600160039092020101546001600160a01b038381169116141561191c576117be601060008154811061179b5761179b613f0d565b60009182526020909120600160039092020101546001600160a01b03168a61087c565b60646015600060106000815481106117d8576117d8613f0d565b906000526020600020906003020160000154815260200190815260200160002060010154101561185457600160156000601060008154811061181c5761181c613f0d565b9060005260206000209060030201600001548152602001908152602001600020600101600082825461184e9190613d91565b90915550505b336001600160a01b0316601060008154811061187257611872613f0d565b60009182526020822060016003909202010154601080546001600160a01b03909216927f88a3f7850511d753dce8529ca89f8c639b5661df56bddb7008a02171a78b71d8926118c3576118c3613f0d565b9060005260206000209060030201600001548f87898f8860405161190f96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a3611a21565b611926338a61087c565b60008c8152601560205260409020600101546064111561196d576001601560008e815260200190815260200160002060010160008282546119679190613d91565b90915550505b601060008154811061198157611981613f0d565b60009182526020909120600390910201600101546001600160a01b0316336001600160a01b03167f88a3f7850511d753dce8529ca89f8c639b5661df56bddb7008a02171a78b71d88e60106000815481106119de576119de613f0d565b6000918252602091829020600390910201546040805193845291830152810188905260608101879052608081018d905260a0810185905260c00160405180910390a35b6010805480611a3257611a32613ef7565b600082815260208120600360001990930192830201818155600181810180546001600160a01b031916905560029091019190915591559c9b505050505050505050505050565b60106040518060600160405280848152602001611a923390565b6001600160a01b0316815260200134905281546001808201845560009384526020808520845160039094020192835583015190820180546001600160a01b0319166001600160a01b0390921691909117905560409091015160029091015592915050565b600c805461115a90613e1f565b6000611b0e82612d03565b5192915050565b60085460ff8083169116611b645760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc8139bdd08195b98589b195960521b6044820152606401610b19565b600081118015611b765750600b548111155b611bb95760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610b19565b600a5481611bce600154600054036000190190565b611bd89190613d91565b1115611c1d5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610b19565b600e5460ff8316906001600160a01b0316336001600160a01b031614611c905780600954611c4b9190613dbd565b341015611c905760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b19565b60008054905b8460ff168160ff161015611ddc576000611cb360ff831684613d91565b90506000611cc082612e2a565b8b8460ff1681518110611cd557611cd5613f0d565b60200260200101518b8560ff1681518110611cf257611cf2613f0d565b6020026020010151604051602001611d0c93929190613b03565b604051602081830303815290604052805190602001209050611d8a89898560ff16818110611d3c57611d3c613f0d565b9050602002810190611d4e9190613cc8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150849050612f27565b611dc75760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610b19565b50508080611dd490613e97565b915050611c96565b50611dea338560ff16612f3d565b600e54611e00906001600160a01b03163461087c565b60005b8460ff168160ff161015611ed8576000611e2060ff831684613d91565b60008181526015602052604090208190558a519091508a9060ff8416908110611e4b57611e4b613f0d565b6020026020010151601560008381526020019081526020016000206002019080519060200190611e7c929190613307565b50888260ff1681518110611e9257611e92613f0d565b6020026020010151601560008381526020019081526020016000206003019080519060200190611ec3929190613307565b50508080611ed090613e97565b915050611e03565b505050505050505050565b60006001600160a01b038216611f0c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600e546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610b1990613c3d565b601455565b600e546001600160a01b03163314611f8a5760405162461bcd60e51b8152600401610b1990613c3d565b8051610d2e90600c906020840190613307565b600e546001600160a01b0316331480611fc05750600f546001600160a01b031633145b6120075760405162461bcd60e51b815260206004820152601860248201527718d85b1b195c881a5cc81b9bdd08185d5d1a1bdc9a5e995960421b6044820152606401610b19565b80518251146120755760405162461bcd60e51b815260206004820152603460248201527f68656164547970657320616e6420776561706f6e5479706573206d757374206860448201527330bb32903a34329039b0b6b2903632b733ba341760611b6064820152608401610b19565b600a548361ffff1611156120d95760405162461bcd60e51b815260206004820152602560248201527f696e697469616c4964206d757374206265206c657373207468616e206d6178536044820152647570706c7960d81b6064820152608401610b19565b60018361ffff1610156121545760405162461bcd60e51b815260206004820152603860248201527f696e697469616c4964206d7573742062652067726561746572207468616e206f60448201527f7220657175616c20746f205f7374617274546f6b656e496400000000000000006064820152608401610b19565b60135460ff16156121a75760405162461bcd60e51b815260206004820152601e60248201527f47616d652063616e206e6f742062652065646974656420616e796d6f726500006044820152606401610b19565b60005b82518161ffff161015610ceb5760006121c38286613d6b565b61ffff808216600081815260156020526040902055855191925085919084169081106121f1576121f1613f0d565b6020026020010151601560008361ffff1681526020019081526020016000206002019080519060200190612226929190613307565b50828261ffff168151811061223d5761223d613f0d565b6020026020010151601560008361ffff1681526020019081526020016000206003019080519060200190612272929190613307565b5050808061227f90613e5a565b9150506121aa565b600e546001600160a01b031633146122b15760405162461bcd60e51b8152600401610b1990613c3d565b6001600160a01b03811661231e5760405162461bcd60e51b815260206004820152602e60248201527f4f776e61626c653a206e6577206f776e65722063616e206e6f7420626520746860448201526d65207a65726f206164647265737360901b6064820152608401610b19565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461095e90613e1f565b600e546001600160a01b031633146123795760405162461bcd60e51b8152600401610b1990613c3d565b6008805460ff1916911515919091179055565b600854819060ff166123d95760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc8139bdd08195b98589b195960521b6044820152606401610b19565b6000811180156123eb5750600b548111155b61242e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610b19565b600a5481612443600154600054036000190190565b61244d9190613d91565b11156124925760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610b19565b600e5482906001600160a01b0316336001600160a01b03161461250257806009546124bd9190613dbd565b3410156125025760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b19565b61250c3384612f3d565b600e54610aae906001600160a01b03163461087c565b6001600160a01b03821633141561254c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e546001600160a01b031633146125e25760405162461bcd60e51b8152600401610b1990613c3d565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61260f8484846129e7565b6001600160a01b0383163b15158015612631575061262f84848484612f57565b155b15610ceb576040516368d2bf6b60e11b815260040160405180910390fd5b606061265a82612952565b6126be5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b19565b60006126c861304b565b905060008151116126e85760405180602001604052806000815250612716565b806126f284612e2a565b600d60405160200161270693929190613a3f565b6040516020818303038152906040525b9392505050565b600e546001600160a01b031633146127475760405162461bcd60e51b8152600401610b1990613c3d565b610d2e8282612f3d565b600e546001600160a01b0316331461277b5760405162461bcd60e51b8152600401610b1990613c3d565b6013805460ff19166001179055565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a9060240160206040518083038186803b1580156127f057600080fd5b505afa158015612804573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094991906139de565b600e546001600160a01b031633146128525760405162461bcd60e51b8152600401610b1990613c3d565b600081116128b45760405162461bcd60e51b815260206004820152602960248201527f50726963653a20426174746c652070726963652068617320746f206265206d6f60448201526807265207468616e20360bc1b6064820152608401610b19565b6010541561294d5760005b6010548110156129405761292e601082815481106128df576128df613f0d565b906000526020600020906003020160010160009054906101000a90046001600160a01b03166010838154811061291757612917613f0d565b90600052602060002090600302016002015461087c565b8061293881613e7c565b9150506128bf565b5061294d6010600061338b565b601255565b600081600111158015612966575060005482105b8015610949575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129f282612d03565b9050836001600160a01b031681600001516001600160a01b031614612a295760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612a475750612a47853361082e565b80612a62575033612a57846109e1565b6001600160a01b0316145b905080612a8257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612aa957604051633a954ecd60e21b815260040160405180910390fd5b612ab56000848761298b565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612b89576000548214612b8957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610db4565b600080612bdf868661305a565b90506000612bed878661305a565b905083601154612bfd9190613d91565b612c19612c128461ffff168461ffff166130a4565b60016130a4565b612c239190613dbd565b925050505b949350505050565b600080603281612c408287613ddc565b90506000612c5160ff841687613ddc565b90506000444260405180604001604052808d6001600160a01b03166001600160a01b031681526020018c6001600160a01b03166001600160a01b0316815250604051602001612ca293929190613b5d565b60408051601f19818403018152919052805160209091012090506000612cc88385613d91565b612cd29083613eb7565b905083811115612ceb578996509450612cfa9350505050565b8a96509450612cfa9350505050565b94509492505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612d33575060005481105b15612e1157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612e0f5780516001600160a01b031615612da6579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612e0a579392505050565b612da6565b505b604051636f96cda160e11b815260040160405180910390fd5b606081612e4e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e785780612e6281613e7c565b9150612e719050600a83613da9565b9150612e52565b6000816001600160401b03811115612e9257612e92613f23565b6040519080825280601f01601f191660200182016040528015612ebc576020820181803683370190505b5090505b8415612c2857612ed1600183613ddc565b9150612ede600a86613eb7565b612ee9906030613d91565b60f81b818381518110612efe57612efe613f0d565b60200101906001600160f81b031916908160001a905350612f20600a86613da9565b9450612ec0565b600082612f3485846130bb565b14949350505050565b610d2e82826040518060200160405280600081525061312f565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f8c903390899088908890600401613ba9565b602060405180830381600087803b158015612fa657600080fd5b505af1925050508015612fd6575060408051601f3d908101601f19168201909252612fd3918101906138b7565b60015b613031573d808015613004576040519150601f19603f3d011682016040523d82523d6000602084013e613009565b606091505b508051613029576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c28565b6060600c805461095e90613e1f565b600060168360405161306c9190613a23565b9081526020016040518091039020826040516130889190613a23565b9081526040519081900360200190205461ffff16905092915050565b6000818310156130b45781612716565b5090919050565b600081815b84518110156131275760008582815181106130dd576130dd613f0d565b602002602001015190508083116131035760008381526020829052604090209250613114565b600081815260208490526040902092505b508061311f81613e7c565b9150506130c0565b509392505050565b610aae83838360016000546001600160a01b03851661316057604051622e076360e81b815260040160405180910390fd5b8361317e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561322f57506001600160a01b0387163b15155b156132b8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132806000888480600101955088612f57565b61329d576040516368d2bf6b60e11b815260040160405180910390fd5b808214156132355782600054146132b357600080fd5b6132fe565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156132b9575b50600055610db4565b82805461331390613e1f565b90600052602060002090601f016020900481019282613335576000855561337b565b82601f1061334e57805160ff191683800117855561337b565b8280016001018555821561337b579182015b8281111561337b578251825591602001919060010190613360565b506133879291506133af565b5090565b50805460008255600302906000526020600020908101906133ac91906133c4565b50565b5b8082111561338757600081556001016133b0565b5b808211156133875760008082556001820180546001600160a01b031916905560028201556003016133c5565b60006001600160401b0383111561340a5761340a613f23565b61341d601f8401601f1916602001613d18565b905082815283838301111561343157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261345957600080fd5b8135602061346e61346983613d48565b613d18565b80838252828201915082860187848660051b890101111561348e57600080fd5b6000805b868110156134d05782356001600160401b038111156134af578283fd5b6134bd8b88838d01016134f3565b8652509385019391850191600101613492565b509198975050505050505050565b803580151581146134ee57600080fd5b919050565b600082601f83011261350457600080fd5b612716838335602085016133f1565b803561ffff811681146134ee57600080fd5b803560ff811681146134ee57600080fd5b60006020828403121561354857600080fd5b813561271681613f39565b6000806040838503121561356657600080fd5b823561357181613f39565b9150602083013561358181613f39565b809150509250929050565b6000806000606084860312156135a157600080fd5b83356135ac81613f39565b925060208401356135bc81613f39565b929592945050506040919091013590565b600080600080608085870312156135e357600080fd5b84356135ee81613f39565b935060208501356135fe81613f39565b92506040850135915060608501356001600160401b0381111561362057600080fd5b8501601f8101871361363157600080fd5b613640878235602084016133f1565b91505092959194509250565b6000806040838503121561365f57600080fd5b823561366a81613f39565b9150613678602084016134de565b90509250929050565b6000806040838503121561369457600080fd5b823561369f81613f39565b946020939093013593505050565b6000806000606084860312156136c257600080fd5b83356001600160401b03808211156136d957600080fd5b6136e587838801613448565b94506020915081860135818111156136fc57600080fd5b8601601f8101881361370d57600080fd5b803561371b61346982613d48565b8082825285820191508584018b878560051b870101111561373b57600080fd5b6000805b8581101561377657823588811115613755578283fd5b6137638f8b838b0101613448565b865250938801939188019160010161373f565b50505080975050505050505061378e60408501613513565b90509250925092565b6000806000806000608086880312156137af57600080fd5b85356001600160401b03808211156137c657600080fd5b6137d289838a01613448565b965060208801359150808211156137e857600080fd5b6137f489838a01613448565b9550604088013591508082111561380a57600080fd5b818801915088601f83011261381e57600080fd5b81358181111561382d57600080fd5b8960208260051b850101111561384257600080fd5b60208301955080945050505061385a60608701613525565b90509295509295909350565b60006020828403121561387857600080fd5b612716826134de565b60006020828403121561389357600080fd5b5035919050565b6000602082840312156138ac57600080fd5b813561271681613f4e565b6000602082840312156138c957600080fd5b815161271681613f4e565b6000602082840312156138e657600080fd5b81356001600160401b038111156138fc57600080fd5b612c28848285016134f3565b6000806040838503121561391b57600080fd5b82356001600160401b038082111561393257600080fd5b61393e868387016134f3565b9350602085013591508082111561395457600080fd5b50613961858286016134f3565b9150509250929050565b60008060006060848603121561398057600080fd5b61398984613513565b925060208401356001600160401b03808211156139a557600080fd5b6139b187838801613448565b935060408601359150808211156139c757600080fd5b506139d486828701613448565b9150509250925092565b6000602082840312156139f057600080fd5b5051919050565b60008151808452613a0f816020860160208601613df3565b601f01601f19169290920160200192915050565b60008251613a35818460208701613df3565b9190910192915050565b600084516020613a528285838a01613df3565b855191840191613a658184848a01613df3565b8554920191600090600181811c9080831680613a8257607f831692505b858310811415613aa057634e487b7160e01b85526022600452602485fd5b808015613ab45760018114613ac557613af2565b60ff19851688528388019550613af2565b60008b81526020902060005b85811015613aea5781548a820152908401908801613ad1565b505083880195505b50939b9a5050505050505050505050565b60008451613b15818460208901613df3565b8083019050602d60f81b8082528551613b35816001850160208a01613df3565b60019201918201528351613b50816002840160208801613df3565b0160020195945050505050565b838152600060208481840152604083018460005b6002811015613b975781516001600160a01b031683529183019190830190600101613b71565b50505050608082019050949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bdc908301846139f7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b60208152600061271660208301846139f7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020815281516020820152602082015160408201526000604083015160806060840152613ca260a08401826139f7565b90506060840151601f19848303016080850152613cbf82826139f7565b95945050505050565b6000808335601e19843603018112613cdf57600080fd5b8301803591506001600160401b03821115613cf957600080fd5b6020019150600581901b3603821315613d1157600080fd5b9250929050565b604051601f8201601f191681016001600160401b0381118282101715613d4057613d40613f23565b604052919050565b60006001600160401b03821115613d6157613d61613f23565b5060051b60200190565b600061ffff808316818516808303821115613d8857613d88613ecb565b01949350505050565b60008219821115613da457613da4613ecb565b500190565b600082613db857613db8613ee1565b500490565b6000816000190483118215151615613dd757613dd7613ecb565b500290565b600082821015613dee57613dee613ecb565b500390565b60005b83811015613e0e578181015183820152602001613df6565b83811115610ceb5750506000910152565b600181811c90821680613e3357607f821691505b60208210811415613e5457634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613e7257613e72613ecb565b6001019392505050565b6000600019821415613e9057613e90613ecb565b5060010190565b600060ff821660ff811415613eae57613eae613ecb565b60010192915050565b600082613ec657613ec6613ee1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146133ac57600080fd5b6001600160e01b0319811681146133ac57600080fdfea264697066735822122078511b7721adc0d3b625962d4c3f7544d859cda63c2b25ba68b2d8f9bbbf738164736f6c63430008070033608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6105748061007e6000396000f3fe6080604052600436106100555760003560e01c806351cff8d91461005a578063715018a61461007c5780638da5cb5b14610091578063e3a9db1a146100be578063f2fde38b14610102578063f340fa0114610122575b600080fd5b34801561006657600080fd5b5061007a6100753660046104aa565b610135565b005b34801561008857600080fd5b5061007a6101d7565b34801561009d57600080fd5b506000546040516001600160a01b0390911681526020015b60405180910390f35b3480156100ca57600080fd5b506100f46100d93660046104aa565b6001600160a01b031660009081526001602052604090205490565b6040519081526020016100b5565b34801561010e57600080fd5b5061007a61011d3660046104aa565b61020d565b61007a6101303660046104aa565b6102a8565b6000546001600160a01b031633146101685760405162461bcd60e51b815260040161015f906104ce565b60405180910390fd5b6001600160a01b0381166000818152600160205260408120805491905590610190908261033c565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040516101cb91815260200190565b60405180910390a25050565b6000546001600160a01b031633146102015760405162461bcd60e51b815260040161015f906104ce565b61020b600061045a565b565b6000546001600160a01b031633146102375760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b03811661029c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161015f565b6102a58161045a565b50565b6000546001600160a01b031633146102d25760405162461bcd60e51b815260040161015f906104ce565b6001600160a01b0381166000908152600160205260408120805434928392916102fc908490610503565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4906020016101cb565b8047101561038c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161015f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146103d9576040519150601f19603f3d011682016040523d82523d6000602084013e6103de565b606091505b50509050806104555760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161015f565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156104bc57600080fd5b81356104c781610529565b9392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561052457634e487b7160e01b600052601160045260246000fd5b500190565b6001600160a01b03811681146102a557600080fdfea264697066735822122032cc0548414517fd9985f3674e8c50b69570b4d8742bafae07e3d77494d9a30664736f6c63430008070033
Deployed Bytecode
0x60806040526004361061026b5760003560e01c80637ec4a65911610144578063bdb4b848116100b6578063d56405ec1161007a578063d56405ec1461075b578063d5abeb0114610771578063e2982c2114610787578063e8c26b8f146107a7578063e985e9c514610813578063f381baa61461085c57600080fd5b8063bdb4b848146106d6578063c87b56dd146106ec578063cb39665c1461070c578063d12397301461072c578063d42ccb501461074657600080fd5b806395d89b411161010857806395d89b411461062e5780639bbf832514610643578063a0712d6814610663578063a22cb46514610676578063ac7475ed14610696578063b88d4fde146106b657600080fd5b80637ec4a65914610598578063837da079146105b8578063880cdc31146105d85780638da5cb5b146105f857806394354fd01461061857600080fd5b806344cbab6e116101dd57806362b99ad4116101a157806362b99ad4146104f65780636352211e1461050b57806363e12a7b1461052b5780636df12fd91461053e57806370a08231146105585780637cb647591461057857600080fd5b806344cbab6e1461046c57806349590657146104995780635503a0e8146104ae5780635788ff36146104c35780635d6de796146104e357600080fd5b806316ba10e01161022f57806316ba10e01461039357806318160ddd146103b357806323b872dd146103df57806331b3eb94146103ff57806342842e0e1461041f578063438b63001461043f57600080fd5b806301ffc9a7146102c257806306fdde03146102f7578063081812fc14610319578063095ea7b314610351578063155ea24a1461037357600080fd5b366102bd57600e54610286906001600160a01b03163461087c565b60405134815233907f1e57e3bb474320be3d2c77138f75b7c3941292d647f5f9634e33a8e94e0e069b9060200160405180910390a2005b600080fd5b3480156102ce57600080fd5b506102e26102dd36600461389a565b6108fd565b60405190151581526020015b60405180910390f35b34801561030357600080fd5b5061030c61094f565b6040516102ee9190613c2a565b34801561032557600080fd5b50610339610334366004613881565b6109e1565b6040516001600160a01b0390911681526020016102ee565b34801561035d57600080fd5b5061037161036c366004613681565b610a25565b005b34801561037f57600080fd5b5061037161038e3660046136ad565b610ab3565b34801561039f57600080fd5b506103716103ae3660046138d4565b610cf1565b3480156103bf57600080fd5b506103d1600154600054036000190190565b6040519081526020016102ee565b3480156103eb57600080fd5b506103716103fa36600461358c565b610d32565b34801561040b57600080fd5b5061037161041a366004613536565b610d3d565b34801561042b57600080fd5b5061037161043a36600461358c565b610dbb565b34801561044b57600080fd5b5061045f61045a366004613536565b610dd6565b6040516102ee9190613be6565b34801561047857600080fd5b5061048c610487366004613881565b610f16565b6040516102ee9190613c72565b3480156104a557600080fd5b506103d1611119565b3480156104ba57600080fd5b5061030c61114d565b3480156104cf57600080fd5b506103716104de366004613881565b6111db565b6102e26104f1366004613881565b611269565b34801561050257600080fd5b5061030c611af6565b34801561051757600080fd5b50610339610526366004613881565b611b03565b610371610539366004613797565b611b15565b34801561054a57600080fd5b506013546102e29060ff1681565b34801561056457600080fd5b506103d1610573366004613536565b611ee3565b34801561058457600080fd5b50610371610593366004613881565b611f31565b3480156105a457600080fd5b506103716105b33660046138d4565b611f60565b3480156105c457600080fd5b506103716105d336600461396b565b611f9d565b3480156105e457600080fd5b506103716105f3366004613536565b612287565b34801561060457600080fd5b50600e54610339906001600160a01b031681565b34801561062457600080fd5b506103d1600b5481565b34801561063a57600080fd5b5061030c612340565b34801561064f57600080fd5b5061037161065e366004613866565b61234f565b610371610671366004613881565b61238c565b34801561068257600080fd5b5061037161069136600461364c565b612522565b3480156106a257600080fd5b506103716106b1366004613536565b6125b8565b3480156106c257600080fd5b506103716106d13660046135cd565b612604565b3480156106e257600080fd5b506103d160095481565b3480156106f857600080fd5b5061030c610707366004613881565b61264f565b34801561071857600080fd5b50610371610727366004613681565b61271d565b34801561073857600080fd5b506008546102e29060ff1681565b34801561075257600080fd5b50610371612751565b34801561076757600080fd5b506103d160125481565b34801561077d57600080fd5b506103d1600a5481565b34801561079357600080fd5b506103d16107a2366004613536565b61278a565b3480156107b357600080fd5b506108006107c2366004613908565b8151602081840181018051601682529282019482019490942091909352815180830184018051928152908401929093019190912091525461ffff1681565b60405161ffff90911681526020016102ee565b34801561081f57600080fd5b506102e261082e366004613553565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561086857600080fd5b50610371610877366004613881565b612828565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f000000000000000000000000fa50006d7a5a2309f6a3c6e71772d1b7d8e10444169063f340fa019083906024016000604051808303818588803b1580156108e057600080fd5b505af11580156108f4573d6000803e3d6000fd5b50505050505050565b60006001600160e01b031982166380ac58cd60e01b148061092e57506001600160e01b03198216635b5e139f60e01b145b8061094957506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606002805461095e90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461098a90613e1f565b80156109d75780601f106109ac576101008083540402835291602001916109d7565b820191906000526020600020905b8154815290600101906020018083116109ba57829003601f168201915b5050505050905090565b60006109ec82612952565b610a09576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610a3082611b03565b9050806001600160a01b0316836001600160a01b03161415610a655760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610a855750610a83813361082e565b155b15610aa3576040516367d9dca160e11b815260040160405180910390fd5b610aae83838361298b565b505050565b600e546001600160a01b0316331480610ad65750600f546001600160a01b031633145b610b225760405162461bcd60e51b815260206004820152601860248201527718d85b1b195c881a5cc81b9bdd08185d5d1a1bdc9a5e995960421b60448201526064015b60405180910390fd5b60135460ff1615610b755760405162461bcd60e51b815260206004820152601e60248201527f47616d652063616e206e6f742062652065646974656420616e796d6f726500006044820152606401610b19565b8151835114610be05760405162461bcd60e51b815260206004820152603160248201527f5f747970657320616e64205f7765616b6e6573736573206d7573742068617665604482015270103a34329039b0b6b2903632b733ba341760791b6064820152608401610b19565b60005b83518161ffff161015610ceb5760005b838261ffff1681518110610c0957610c09613f0d565b6020026020010151518161ffff161015610cd857826016868461ffff1681518110610c3657610c36613f0d565b6020026020010151604051610c4b9190613a23565b9081526020016040518091039020858461ffff1681518110610c6f57610c6f613f0d565b60200260200101518361ffff1681518110610c8c57610c8c613f0d565b6020026020010151604051610ca19190613a23565b908152604051908190036020019020805461ffff9290921661ffff1990921691909117905580610cd081613e5a565b915050610bf3565b5080610ce381613e5a565b915050610be3565b50505050565b600e546001600160a01b03163314610d1b5760405162461bcd60e51b8152600401610b1990613c3d565b8051610d2e90600d906020840190613307565b5050565b610aae8383836129e7565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000fa50006d7a5a2309f6a3c6e71772d1b7d8e1044416906351cff8d990602401600060405180830381600087803b158015610da057600080fd5b505af1158015610db4573d6000803e3d6000fd5b5050505050565b610aae83838360405180602001604052806000815250612604565b60606000610de383611ee3565b90506000816001600160401b03811115610dff57610dff613f23565b604051908082528060200260200182016040528015610e28578160200160208202803683370190505b50905060016000805b8482108015610e41575060005483105b15610f0b57600083815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290610ef85780516001600160a01b031615610eb257805191505b876001600160a01b0316826001600160a01b03161415610ef85783858481518110610edf57610edf613f0d565b602090810291909101015282610ef481613e7c565b9350505b83610f0281613e7c565b94505050610e31565b509195945050505050565b610f416040518060800160405280600081526020016000815260200160608152602001606081525090565b600e546001600160a01b0316336001600160a01b031614610fbc57610f6d600154600054036000190190565b821115610fbc5760405162461bcd60e51b815260206004820152601e60248201527f54686973204b6e6967687420686173206e6f74206d696e7465642079657400006044820152606401610b19565b601560008381526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282018054610ffe90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461102a90613e1f565b80156110775780601f1061104c57610100808354040283529160200191611077565b820191906000526020600020905b81548152906001019060200180831161105a57829003601f168201915b5050505050815260200160038201805461109090613e1f565b80601f01602080910402602001604051908101604052809291908181526020018280546110bc90613e1f565b80156111095780601f106110de57610100808354040283529160200191611109565b820191906000526020600020905b8154815290600101906020018083116110ec57829003601f168201915b5050505050815250509050919050565b600e546000906001600160a01b031633146111465760405162461bcd60e51b8152600401610b1990613c3d565b5060145490565b600d805461115a90613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461118690613e1f565b80156111d35780601f106111a8576101008083540402835291602001916111d3565b820191906000526020600020905b8154815290600101906020018083116111b657829003601f168201915b505050505081565b600e546001600160a01b031633146112055760405162461bcd60e51b8152600401610b1990613c3d565b600081116112645760405162461bcd60e51b815260206004820152602660248201527f4d696e743a206d696e742070726963652068617320746f206265206d6f72652060448201526507468616e20360d41b6064820152608401610b19565b600955565b60006012546112753490565b10156112b25760405162461bcd60e51b815260206004820152600c60248201526b283934b1b29d1032b93937b960a11b6044820152606401610b19565b336112bc83611b03565b6001600160a01b0316146113125760405162461bcd60e51b815260206004820152601d60248201527f6f776e65723a20596f757220646f6e74206f776e2074686174204e46540000006044820152606401610b19565b601054600111611a78576000606434601060008154811061133557611335613f0d565b9060005260206000209060030201600201546113519190613d91565b61135b9190613da9565b611366906002613dbd565b600e5490915061137f906001600160a01b03168261087c565b60008134601060008154811061139757611397613f0d565b9060005260206000209060030201600201546113b39190613d91565b6113bd9190613ddc565b905060006015600060106000815481106113d9576113d9613f0d565b9060005260206000209060030201600001548152602001908152602001600020600201805461140790613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461143390613e1f565b80156114805780601f1061145557610100808354040283529160200191611480565b820191906000526020600020905b81548152906001019060200180831161146357829003601f168201915b5050505050905060006015600060106000815481106114a1576114a1613f0d565b906000526020600020906003020160000154815260200190815260200160002060030180546114cf90613e1f565b80601f01602080910402602001604051908101604052809291908181526020018280546114fb90613e1f565b80156115485780601f1061151d57610100808354040283529160200191611548565b820191906000526020600020905b81548152906001019060200180831161152b57829003601f168201915b50505050509050600060156000888152602001908152602001600020600201805461157290613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461159e90613e1f565b80156115eb5780601f106115c0576101008083540402835291602001916115eb565b820191906000526020600020905b8154815290600101906020018083116115ce57829003601f168201915b50505050509050600060156000898152602001908152602001600020600301805461161590613e1f565b80601f016020809104026020016040519081016040528092919081815260200182805461164190613e1f565b801561168e5780601f106116635761010080835404028352916020019161168e565b820191906000526020600020905b81548152906001019060200180831161167157829003601f168201915b5050505050905060006116b9858484601560008e815260200190815260200160002060010154612bd2565b905060006117048487876015600060106000815481106116db576116db613f0d565b906000526020600020906003020160000154815260200190815260200160002060010154612bd2565b905060008061174533601060008154811061172157611721613f0d565b60009182526020909120600160039092020101546001600160a01b03168686612c30565b91509150601060008154811061175d5761175d613f0d565b60009182526020909120600160039092020101546001600160a01b038381169116141561191c576117be601060008154811061179b5761179b613f0d565b60009182526020909120600160039092020101546001600160a01b03168a61087c565b60646015600060106000815481106117d8576117d8613f0d565b906000526020600020906003020160000154815260200190815260200160002060010154101561185457600160156000601060008154811061181c5761181c613f0d565b9060005260206000209060030201600001548152602001908152602001600020600101600082825461184e9190613d91565b90915550505b336001600160a01b0316601060008154811061187257611872613f0d565b60009182526020822060016003909202010154601080546001600160a01b03909216927f88a3f7850511d753dce8529ca89f8c639b5661df56bddb7008a02171a78b71d8926118c3576118c3613f0d565b9060005260206000209060030201600001548f87898f8860405161190f96959493929190958652602086019490945260408501929092526060840152608083015260a082015260c00190565b60405180910390a3611a21565b611926338a61087c565b60008c8152601560205260409020600101546064111561196d576001601560008e815260200190815260200160002060010160008282546119679190613d91565b90915550505b601060008154811061198157611981613f0d565b60009182526020909120600390910201600101546001600160a01b0316336001600160a01b03167f88a3f7850511d753dce8529ca89f8c639b5661df56bddb7008a02171a78b71d88e60106000815481106119de576119de613f0d565b6000918252602091829020600390910201546040805193845291830152810188905260608101879052608081018d905260a0810185905260c00160405180910390a35b6010805480611a3257611a32613ef7565b600082815260208120600360001990930192830201818155600181810180546001600160a01b031916905560029091019190915591559c9b505050505050505050505050565b60106040518060600160405280848152602001611a923390565b6001600160a01b0316815260200134905281546001808201845560009384526020808520845160039094020192835583015190820180546001600160a01b0319166001600160a01b0390921691909117905560409091015160029091015592915050565b600c805461115a90613e1f565b6000611b0e82612d03565b5192915050565b60085460ff8083169116611b645760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc8139bdd08195b98589b195960521b6044820152606401610b19565b600081118015611b765750600b548111155b611bb95760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610b19565b600a5481611bce600154600054036000190190565b611bd89190613d91565b1115611c1d5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610b19565b600e5460ff8316906001600160a01b0316336001600160a01b031614611c905780600954611c4b9190613dbd565b341015611c905760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b19565b60008054905b8460ff168160ff161015611ddc576000611cb360ff831684613d91565b90506000611cc082612e2a565b8b8460ff1681518110611cd557611cd5613f0d565b60200260200101518b8560ff1681518110611cf257611cf2613f0d565b6020026020010151604051602001611d0c93929190613b03565b604051602081830303815290604052805190602001209050611d8a89898560ff16818110611d3c57611d3c613f0d565b9050602002810190611d4e9190613cc8565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506014549150849050612f27565b611dc75760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b6044820152606401610b19565b50508080611dd490613e97565b915050611c96565b50611dea338560ff16612f3d565b600e54611e00906001600160a01b03163461087c565b60005b8460ff168160ff161015611ed8576000611e2060ff831684613d91565b60008181526015602052604090208190558a519091508a9060ff8416908110611e4b57611e4b613f0d565b6020026020010151601560008381526020019081526020016000206002019080519060200190611e7c929190613307565b50888260ff1681518110611e9257611e92613f0d565b6020026020010151601560008381526020019081526020016000206003019080519060200190611ec3929190613307565b50508080611ed090613e97565b915050611e03565b505050505050505050565b60006001600160a01b038216611f0c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b600e546001600160a01b03163314611f5b5760405162461bcd60e51b8152600401610b1990613c3d565b601455565b600e546001600160a01b03163314611f8a5760405162461bcd60e51b8152600401610b1990613c3d565b8051610d2e90600c906020840190613307565b600e546001600160a01b0316331480611fc05750600f546001600160a01b031633145b6120075760405162461bcd60e51b815260206004820152601860248201527718d85b1b195c881a5cc81b9bdd08185d5d1a1bdc9a5e995960421b6044820152606401610b19565b80518251146120755760405162461bcd60e51b815260206004820152603460248201527f68656164547970657320616e6420776561706f6e5479706573206d757374206860448201527330bb32903a34329039b0b6b2903632b733ba341760611b6064820152608401610b19565b600a548361ffff1611156120d95760405162461bcd60e51b815260206004820152602560248201527f696e697469616c4964206d757374206265206c657373207468616e206d6178536044820152647570706c7960d81b6064820152608401610b19565b60018361ffff1610156121545760405162461bcd60e51b815260206004820152603860248201527f696e697469616c4964206d7573742062652067726561746572207468616e206f60448201527f7220657175616c20746f205f7374617274546f6b656e496400000000000000006064820152608401610b19565b60135460ff16156121a75760405162461bcd60e51b815260206004820152601e60248201527f47616d652063616e206e6f742062652065646974656420616e796d6f726500006044820152606401610b19565b60005b82518161ffff161015610ceb5760006121c38286613d6b565b61ffff808216600081815260156020526040902055855191925085919084169081106121f1576121f1613f0d565b6020026020010151601560008361ffff1681526020019081526020016000206002019080519060200190612226929190613307565b50828261ffff168151811061223d5761223d613f0d565b6020026020010151601560008361ffff1681526020019081526020016000206003019080519060200190612272929190613307565b5050808061227f90613e5a565b9150506121aa565b600e546001600160a01b031633146122b15760405162461bcd60e51b8152600401610b1990613c3d565b6001600160a01b03811661231e5760405162461bcd60e51b815260206004820152602e60248201527f4f776e61626c653a206e6577206f776e65722063616e206e6f7420626520746860448201526d65207a65726f206164647265737360901b6064820152608401610b19565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805461095e90613e1f565b600e546001600160a01b031633146123795760405162461bcd60e51b8152600401610b1990613c3d565b6008805460ff1916911515919091179055565b600854819060ff166123d95760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1a5b99c81a5cc8139bdd08195b98589b195960521b6044820152606401610b19565b6000811180156123eb5750600b548111155b61242e5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610b19565b600a5481612443600154600054036000190190565b61244d9190613d91565b11156124925760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b6044820152606401610b19565b600e5482906001600160a01b0316336001600160a01b03161461250257806009546124bd9190613dbd565b3410156125025760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610b19565b61250c3384612f3d565b600e54610aae906001600160a01b03163461087c565b6001600160a01b03821633141561254c5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e546001600160a01b031633146125e25760405162461bcd60e51b8152600401610b1990613c3d565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61260f8484846129e7565b6001600160a01b0383163b15158015612631575061262f84848484612f57565b155b15610ceb576040516368d2bf6b60e11b815260040160405180910390fd5b606061265a82612952565b6126be5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b19565b60006126c861304b565b905060008151116126e85760405180602001604052806000815250612716565b806126f284612e2a565b600d60405160200161270693929190613a3f565b6040516020818303038152906040525b9392505050565b600e546001600160a01b031633146127475760405162461bcd60e51b8152600401610b1990613c3d565b610d2e8282612f3d565b600e546001600160a01b0316331461277b5760405162461bcd60e51b8152600401610b1990613c3d565b6013805460ff19166001179055565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301526000917f000000000000000000000000fa50006d7a5a2309f6a3c6e71772d1b7d8e104449091169063e3a9db1a9060240160206040518083038186803b1580156127f057600080fd5b505afa158015612804573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061094991906139de565b600e546001600160a01b031633146128525760405162461bcd60e51b8152600401610b1990613c3d565b600081116128b45760405162461bcd60e51b815260206004820152602960248201527f50726963653a20426174746c652070726963652068617320746f206265206d6f60448201526807265207468616e20360bc1b6064820152608401610b19565b6010541561294d5760005b6010548110156129405761292e601082815481106128df576128df613f0d565b906000526020600020906003020160010160009054906101000a90046001600160a01b03166010838154811061291757612917613f0d565b90600052602060002090600302016002015461087c565b8061293881613e7c565b9150506128bf565b5061294d6010600061338b565b601255565b600081600111158015612966575060005482105b8015610949575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129f282612d03565b9050836001600160a01b031681600001516001600160a01b031614612a295760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480612a475750612a47853361082e565b80612a62575033612a57846109e1565b6001600160a01b0316145b905080612a8257604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416612aa957604051633a954ecd60e21b815260040160405180910390fd5b612ab56000848761298b565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116612b89576000548214612b8957805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610db4565b600080612bdf868661305a565b90506000612bed878661305a565b905083601154612bfd9190613d91565b612c19612c128461ffff168461ffff166130a4565b60016130a4565b612c239190613dbd565b925050505b949350505050565b600080603281612c408287613ddc565b90506000612c5160ff841687613ddc565b90506000444260405180604001604052808d6001600160a01b03166001600160a01b031681526020018c6001600160a01b03166001600160a01b0316815250604051602001612ca293929190613b5d565b60408051601f19818403018152919052805160209091012090506000612cc88385613d91565b612cd29083613eb7565b905083811115612ceb578996509450612cfa9350505050565b8a96509450612cfa9350505050565b94509492505050565b60408051606081018252600080825260208201819052918101919091528180600111158015612d33575060005481105b15612e1157600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff16151591810182905290612e0f5780516001600160a01b031615612da6579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612e0a579392505050565b612da6565b505b604051636f96cda160e11b815260040160405180910390fd5b606081612e4e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612e785780612e6281613e7c565b9150612e719050600a83613da9565b9150612e52565b6000816001600160401b03811115612e9257612e92613f23565b6040519080825280601f01601f191660200182016040528015612ebc576020820181803683370190505b5090505b8415612c2857612ed1600183613ddc565b9150612ede600a86613eb7565b612ee9906030613d91565b60f81b818381518110612efe57612efe613f0d565b60200101906001600160f81b031916908160001a905350612f20600a86613da9565b9450612ec0565b600082612f3485846130bb565b14949350505050565b610d2e82826040518060200160405280600081525061312f565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612f8c903390899088908890600401613ba9565b602060405180830381600087803b158015612fa657600080fd5b505af1925050508015612fd6575060408051601f3d908101601f19168201909252612fd3918101906138b7565b60015b613031573d808015613004576040519150601f19603f3d011682016040523d82523d6000602084013e613009565b606091505b508051613029576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c28565b6060600c805461095e90613e1f565b600060168360405161306c9190613a23565b9081526020016040518091039020826040516130889190613a23565b9081526040519081900360200190205461ffff16905092915050565b6000818310156130b45781612716565b5090919050565b600081815b84518110156131275760008582815181106130dd576130dd613f0d565b602002602001015190508083116131035760008381526020829052604090209250613114565b600081815260208490526040902092505b508061311f81613e7c565b9150506130c0565b509392505050565b610aae83838360016000546001600160a01b03851661316057604051622e076360e81b815260040160405180910390fd5b8361317e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561322f57506001600160a01b0387163b15155b156132b8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46132806000888480600101955088612f57565b61329d576040516368d2bf6b60e11b815260040160405180910390fd5b808214156132355782600054146132b357600080fd5b6132fe565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156132b9575b50600055610db4565b82805461331390613e1f565b90600052602060002090601f016020900481019282613335576000855561337b565b82601f1061334e57805160ff191683800117855561337b565b8280016001018555821561337b579182015b8281111561337b578251825591602001919060010190613360565b506133879291506133af565b5090565b50805460008255600302906000526020600020908101906133ac91906133c4565b50565b5b8082111561338757600081556001016133b0565b5b808211156133875760008082556001820180546001600160a01b031916905560028201556003016133c5565b60006001600160401b0383111561340a5761340a613f23565b61341d601f8401601f1916602001613d18565b905082815283838301111561343157600080fd5b828260208301376000602084830101529392505050565b600082601f83011261345957600080fd5b8135602061346e61346983613d48565b613d18565b80838252828201915082860187848660051b890101111561348e57600080fd5b6000805b868110156134d05782356001600160401b038111156134af578283fd5b6134bd8b88838d01016134f3565b8652509385019391850191600101613492565b509198975050505050505050565b803580151581146134ee57600080fd5b919050565b600082601f83011261350457600080fd5b612716838335602085016133f1565b803561ffff811681146134ee57600080fd5b803560ff811681146134ee57600080fd5b60006020828403121561354857600080fd5b813561271681613f39565b6000806040838503121561356657600080fd5b823561357181613f39565b9150602083013561358181613f39565b809150509250929050565b6000806000606084860312156135a157600080fd5b83356135ac81613f39565b925060208401356135bc81613f39565b929592945050506040919091013590565b600080600080608085870312156135e357600080fd5b84356135ee81613f39565b935060208501356135fe81613f39565b92506040850135915060608501356001600160401b0381111561362057600080fd5b8501601f8101871361363157600080fd5b613640878235602084016133f1565b91505092959194509250565b6000806040838503121561365f57600080fd5b823561366a81613f39565b9150613678602084016134de565b90509250929050565b6000806040838503121561369457600080fd5b823561369f81613f39565b946020939093013593505050565b6000806000606084860312156136c257600080fd5b83356001600160401b03808211156136d957600080fd5b6136e587838801613448565b94506020915081860135818111156136fc57600080fd5b8601601f8101881361370d57600080fd5b803561371b61346982613d48565b8082825285820191508584018b878560051b870101111561373b57600080fd5b6000805b8581101561377657823588811115613755578283fd5b6137638f8b838b0101613448565b865250938801939188019160010161373f565b50505080975050505050505061378e60408501613513565b90509250925092565b6000806000806000608086880312156137af57600080fd5b85356001600160401b03808211156137c657600080fd5b6137d289838a01613448565b965060208801359150808211156137e857600080fd5b6137f489838a01613448565b9550604088013591508082111561380a57600080fd5b818801915088601f83011261381e57600080fd5b81358181111561382d57600080fd5b8960208260051b850101111561384257600080fd5b60208301955080945050505061385a60608701613525565b90509295509295909350565b60006020828403121561387857600080fd5b612716826134de565b60006020828403121561389357600080fd5b5035919050565b6000602082840312156138ac57600080fd5b813561271681613f4e565b6000602082840312156138c957600080fd5b815161271681613f4e565b6000602082840312156138e657600080fd5b81356001600160401b038111156138fc57600080fd5b612c28848285016134f3565b6000806040838503121561391b57600080fd5b82356001600160401b038082111561393257600080fd5b61393e868387016134f3565b9350602085013591508082111561395457600080fd5b50613961858286016134f3565b9150509250929050565b60008060006060848603121561398057600080fd5b61398984613513565b925060208401356001600160401b03808211156139a557600080fd5b6139b187838801613448565b935060408601359150808211156139c757600080fd5b506139d486828701613448565b9150509250925092565b6000602082840312156139f057600080fd5b5051919050565b60008151808452613a0f816020860160208601613df3565b601f01601f19169290920160200192915050565b60008251613a35818460208701613df3565b9190910192915050565b600084516020613a528285838a01613df3565b855191840191613a658184848a01613df3565b8554920191600090600181811c9080831680613a8257607f831692505b858310811415613aa057634e487b7160e01b85526022600452602485fd5b808015613ab45760018114613ac557613af2565b60ff19851688528388019550613af2565b60008b81526020902060005b85811015613aea5781548a820152908401908801613ad1565b505083880195505b50939b9a5050505050505050505050565b60008451613b15818460208901613df3565b8083019050602d60f81b8082528551613b35816001850160208a01613df3565b60019201918201528351613b50816002840160208801613df3565b0160020195945050505050565b838152600060208481840152604083018460005b6002811015613b975781516001600160a01b031683529183019190830190600101613b71565b50505050608082019050949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613bdc908301846139f7565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613c1e57835183529284019291840191600101613c02565b50909695505050505050565b60208152600061271660208301846139f7565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020815281516020820152602082015160408201526000604083015160806060840152613ca260a08401826139f7565b90506060840151601f19848303016080850152613cbf82826139f7565b95945050505050565b6000808335601e19843603018112613cdf57600080fd5b8301803591506001600160401b03821115613cf957600080fd5b6020019150600581901b3603821315613d1157600080fd5b9250929050565b604051601f8201601f191681016001600160401b0381118282101715613d4057613d40613f23565b604052919050565b60006001600160401b03821115613d6157613d61613f23565b5060051b60200190565b600061ffff808316818516808303821115613d8857613d88613ecb565b01949350505050565b60008219821115613da457613da4613ecb565b500190565b600082613db857613db8613ee1565b500490565b6000816000190483118215151615613dd757613dd7613ecb565b500290565b600082821015613dee57613dee613ecb565b500390565b60005b83811015613e0e578181015183820152602001613df6565b83811115610ceb5750506000910152565b600181811c90821680613e3357607f821691505b60208210811415613e5457634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613e7257613e72613ecb565b6001019392505050565b6000600019821415613e9057613e90613ecb565b5060010190565b600060ff821660ff811415613eae57613eae613ecb565b60010192915050565b600082613ec657613ec6613ee1565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146133ac57600080fd5b6001600160e01b0319811681146133ac57600080fdfea264697066735822122078511b7721adc0d3b625962d4c3f7544d859cda63c2b25ba68b2d8f9bbbf738164736f6c63430008070033
Deployed Bytecode Sourcemap
53559:14655:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55952:5;;55937:32;;-1:-1:-1;;;;;55952:5:0;55959:9;55937:14;:32::i;:::-;55985:38;;56013:9;15875:25:1;;6602:10:0;;55985:38;;15863:2:1;15848:18;55985:38:0;;;;;;;53559:14655;;;;;35647:305;;;;;;;;;;-1:-1:-1;35647:305:0;;;;;:::i;:::-;;:::i;:::-;;;15702:14:1;;15695:22;15677:41;;15665:2;15650:18;35647:305:0;;;;;;;;38760:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;40263:204::-;;;;;;;;;;-1:-1:-1;40263:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;14139:32:1;;;14121:51;;14109:2;14094:18;40263:204:0;13975:203:1;39826:371:0;;;;;;;;;;-1:-1:-1;39826:371:0;;;;;:::i;:::-;;:::i;:::-;;60078:751;;;;;;;;;;-1:-1:-1;60078:751:0;;;;;:::i;:::-;;:::i;65168:106::-;;;;;;;;;;-1:-1:-1;65168:106:0;;;;;:::i;:::-;;:::i;34896:303::-;;;;;;;;;;;;66759:1;35150:12;34940:7;35134:13;:28;-1:-1:-1;;35134:46:0;;34896:303;;;;15875:25:1;;;15863:2;15848:18;34896:303:0;15729:177:1;41128:170:0;;;;;;;;;;-1:-1:-1;41128:170:0;;;;;:::i;:::-;;:::i;21881:106::-;;;;;;;;;;-1:-1:-1;21881:106:0;;;;;:::i;:::-;;:::i;41369:185::-;;;;;;;;;;-1:-1:-1;41369:185:0;;;;;:::i;:::-;;:::i;65706:953::-;;;;;;;;;;-1:-1:-1;65706:953:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59841:229::-;;;;;;;;;;-1:-1:-1;59841:229:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;61610:101::-;;;;;;;;;;;;;:::i;53990:33::-;;;;;;;;;;;;;:::i;58418:201::-;;;;;;;;;;-1:-1:-1;58418:201:0;;;;;:::i;:::-;;:::i;61719:3209::-;;;;;;:::i;:::-;;:::i;53955:28::-;;;;;;;;;;;;;:::i;38568:125::-;;;;;;;;;;-1:-1:-1;38568:125:0;;;;;:::i;:::-;;:::i;67066:980::-;;;;;;:::i;:::-;;:::i;54361:37::-;;;;;;;;;;-1:-1:-1;54361:37:0;;;;;;;;36016:206;;;;;;;;;;-1:-1:-1;36016:206:0;;;;;:::i;:::-;;:::i;61498:104::-;;;;;;;;;;-1:-1:-1;61498:104:0;;;;;:::i;:::-;;:::i;65054:106::-;;;;;;;;;;-1:-1:-1;65054:106:0;;;;;:::i;:::-;;:::i;58942:891::-;;;;;;;;;;-1:-1:-1;58942:891:0;;;;;:::i;:::-;;:::i;57057:262::-;;;;;;;;;;-1:-1:-1;57057:262:0;;;;;:::i;:::-;;:::i;54174:20::-;;;;;;;;;;-1:-1:-1;54174:20:0;;;;-1:-1:-1;;;;;54174:20:0;;;53909:37;;;;;;;;;;;;;;;;38929:104;;;;;;;;;;;;;:::i;58721:100::-;;;;;;;;;;-1:-1:-1;58721:100:0;;;;;:::i;:::-;;:::i;66789:250::-;;;;;;:::i;:::-;;:::i;40539:287::-;;;;;;;;;;-1:-1:-1;40539:287:0;;;;;:::i;:::-;;:::i;58829:105::-;;;;;;;;;;-1:-1:-1;58829:105:0;;;;;:::i;:::-;;:::i;41625:369::-;;;;;;;;;;-1:-1:-1;41625:369:0;;;;;:::i;:::-;;:::i;53826:37::-;;;;;;;;;;;;;;;;65282:416;;;;;;;;;;-1:-1:-1;65282:416:0;;;;;:::i;:::-;;:::i;68078:133::-;;;;;;;;;;-1:-1:-1;68078:133:0;;;;;:::i;:::-;;:::i;53786:31::-;;;;;;;;;;-1:-1:-1;53786:31:0;;;;;;;;58627:86;;;;;;;;;;;;;:::i;54313:41::-;;;;;;;;;;;;;;;;53870:32;;;;;;;;;;;;;;;;22111:112;;;;;;;;;;-1:-1:-1;22111:112:0;;;;;:::i;:::-;;:::i;55020:60::-;;;;;;;;;;-1:-1:-1;55020:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24149:6:1;24137:19;;;24119:38;;24107:2;24092:18;55020:60:0;23975:188:1;40897:164:0;;;;;;;;;;-1:-1:-1;40897:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;41018:25:0;;;40994:4;41018:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;40897:164;57954:456;;;;;;;;;;-1:-1:-1;57954:456:0;;;;;:::i;:::-;;:::i;22592:126::-;22674:36;;-1:-1:-1;;;22674:36:0;;-1:-1:-1;;;;;14139:32:1;;;22674:36:0;;;14121:51:1;22674:7:0;:15;;;;22697:6;;14094:18:1;;22674:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22592:126;;:::o;35647:305::-;35749:4;-1:-1:-1;;;;;;35786:40:0;;-1:-1:-1;;;35786:40:0;;:105;;-1:-1:-1;;;;;;;35843:48:0;;-1:-1:-1;;;35843:48:0;35786:105;:158;;;-1:-1:-1;;;;;;;;;;25647:40:0;;;35908:36;35766:178;35647:305;-1:-1:-1;;35647:305:0:o;38760:100::-;38814:13;38847:5;38840:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38760:100;:::o;40263:204::-;40331:7;40356:16;40364:7;40356;:16::i;:::-;40351:64;;40381:34;;-1:-1:-1;;;40381:34:0;;;;;;;;;;;40351:64;-1:-1:-1;40435:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;40435:24:0;;40263:204::o;39826:371::-;39899:13;39915:24;39931:7;39915:15;:24::i;:::-;39899:40;;39960:5;-1:-1:-1;;;;;39954:11:0;:2;-1:-1:-1;;;;;39954:11:0;;39950:48;;;39974:24;;-1:-1:-1;;;39974:24:0;;;;;;;;;;;39950:48;6602:10;-1:-1:-1;;;;;40015:21:0;;;;;;:63;;-1:-1:-1;40041:37:0;40058:5;6602:10;40897:164;:::i;40041:37::-;40040:38;40015:63;40011:138;;;40102:35;;-1:-1:-1;;;40102:35:0;;;;;;;;;;;40011:138;40161:28;40170:2;40174:7;40183:5;40161:8;:28::i;:::-;39888:309;39826:371;;:::o;60078:751::-;60242:5;;-1:-1:-1;;;;;60242:5:0;6602:10;60242:21;;:49;;-1:-1:-1;60267:8:0;;-1:-1:-1;;;;;60267:8:0;6602:10;60267:24;60242:49;60234:86;;;;-1:-1:-1;;;60234:86:0;;21660:2:1;60234:86:0;;;21642:21:1;21699:2;21679:18;;;21672:30;-1:-1:-1;;;21718:18:1;;;21711:54;21782:18;;60234:86:0;;;;;;;;;60340:17;;;;60339:18;60331:61;;;;-1:-1:-1;;;60331:61:0;;21301:2:1;60331:61:0;;;21283:21:1;21340:2;21320:18;;;21313:30;21379:32;21359:18;;;21352:60;21429:18;;60331:61:0;21099:354:1;60331:61:0;60428:11;:18;60411:6;:13;:35;60403:97;;;;-1:-1:-1;;;60403:97:0;;18568:2:1;60403:97:0;;;18550:21:1;18607:2;18587:18;;;18580:30;18646:34;18626:18;;;18619:62;-1:-1:-1;;;18697:18:1;;;18690:47;18754:19;;60403:97:0;18366:413:1;60403:97:0;60518:16;60513:309;60552:6;:13;60540:9;:25;;;60513:309;;;60600:20;60595:216;60642:11;60654:9;60642:22;;;;;;;;;;:::i;:::-;;;;;;;:29;60626:13;:45;;;60595:216;;;60778:17;60709:8;60718:6;60725:9;60718:17;;;;;;;;;;:::i;:::-;;;;;;;60709:27;;;;;;:::i;:::-;;;;;;;;;;;;;60737:11;60749:9;60737:22;;;;;;;;;;:::i;:::-;;;;;;;60760:13;60737:37;;;;;;;;;;:::i;:::-;;;;;;;60709:66;;;;;;:::i;:::-;;;;;;;;;;;;;;:86;;;;;;;-1:-1:-1;;60709:86:0;;;;;;;;;60673:15;;;;:::i;:::-;;;;60595:216;;;-1:-1:-1;60567:11:0;;;;:::i;:::-;;;;60513:309;;;;60078:751;;;:::o;65168:106::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;65244:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;65168:106:::0;:::o;41128:170::-;41262:28;41272:4;41278:2;41282:7;41262:9;:28::i;21881:106::-;21956:23;;-1:-1:-1;;;21956:23:0;;-1:-1:-1;;;;;14139:32:1;;;21956:23:0;;;14121:51:1;21956:7:0;:16;;;;14094:18:1;;21956:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21881:106;:::o;41369:185::-;41507:39;41524:4;41530:2;41534:7;41507:39;;;;;;;;;;;;:16;:39::i;65706:953::-;65766:16;65795:23;65821:17;65831:6;65821:9;:17::i;:::-;65795:43;;65849:30;65896:15;-1:-1:-1;;;;;65882:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65882:30:0;-1:-1:-1;65849:63:0;-1:-1:-1;66759:1:0;65923:22;;66051:568;66076:15;66058;:33;:67;;;;;66112:13;;66095:14;:30;66058:67;66051:568;;;66142:31;66176:27;;;:11;:27;;;;;;;;;66142:61;;;;;;;;;-1:-1:-1;;;;;66142:61:0;;;;-1:-1:-1;;;66142:61:0;;-1:-1:-1;;;;;66142:61:0;;;;;;;;-1:-1:-1;;;66142:61:0;;;;;;;;;;;;;;66220:355;;66266:14;;-1:-1:-1;;;;;66266:28:0;;66262:112;;66340:14;;;-1:-1:-1;66262:112:0;66420:6;-1:-1:-1;;;;;66398:28:0;:18;-1:-1:-1;;;;;66398:28:0;;66394:166;;;66484:14;66451:13;66465:15;66451:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;66523:17;;;;:::i;:::-;;;;66394:166;66591:16;;;;:::i;:::-;;;;66127:492;66051:568;;;-1:-1:-1;66638:13:0;;65706:953;-1:-1:-1;;;;;65706:953:0:o;59841:229::-;59895:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59895:13:0;59941:5;;-1:-1:-1;;;;;59941:5:0;6602:10;-1:-1:-1;;;;;59925:21:0;;59921:116;;59977:13;66759:1;35150:12;34940:7;35134:13;:28;-1:-1:-1;;35134:46:0;;34896:303;59977:13;59971:2;:19;;59963:62;;;;-1:-1:-1;;;59963:62:0;;18986:2:1;59963:62:0;;;18968:21:1;19025:2;19005:18;;;18998:30;19064:32;19044:18;;;19037:60;19114:18;;59963:62:0;18784:354:1;59963:62:0;60055:2;:6;60058:2;60055:6;;;;;;;;;;;60047:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59841:229;;;:::o;61610:101::-;56164:5;;61666:7;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;-1:-1:-1;61693:10:0::1;::::0;61610:101;:::o;53990:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58418:201::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;58527:1:::1;58508:16;:20;58500:71;;;::::0;-1:-1:-1;;;58500:71:0;;19345:2:1;58500:71:0::1;::::0;::::1;19327:21:1::0;19384:2;19364:18;;;19357:30;19423:34;19403:18;;;19396:62;-1:-1:-1;;;19474:18:1;;;19467:36;19520:19;;58500:71:0::1;19143:402:1::0;58500:71:0::1;58584:8;:27:::0;58418:201::o;61719:3209::-;61778:18;61832:13;;61817:11;56891:9;;56820:88;61817:11;:28;;61809:53;;;;-1:-1:-1;;;61809:53:0;;18227:2:1;61809:53:0;;;18209:21:1;18266:2;18246:18;;;18239:30;-1:-1:-1;;;18285:18:1;;;18278:42;18337:18;;61809:53:0;18025:336:1;61809:53:0;6602:10;61881:18;61889:9;61881:7;:18::i;:::-;-1:-1:-1;;;;;61881:34:0;;61873:76;;;;-1:-1:-1;;;61873:76:0;;17869:2:1;61873:76:0;;;17851:21:1;17908:2;17888:18;;;17881:30;17947:31;17927:18;;;17920:59;17996:18;;61873:76:0;17667:353:1;61873:76:0;61966:11;:18;61988:1;-1:-1:-1;61962:2852:0;;62006:19;62072:3;56891:9;62030:11;62042:1;62030:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;:38;;;;:::i;:::-;62029:46;;;;:::i;:::-;62028:52;;62079:1;62028:52;:::i;:::-;62110:5;;62006:74;;-1:-1:-1;62095:34:0;;-1:-1:-1;;;;;62110:5:0;62006:74;62095:14;:34::i;:::-;62183:20;62249:11;56891:9;62207:11;62219:1;62207:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;:38;;;;:::i;:::-;62206:54;;;;:::i;:::-;62183:77;;62313:35;62351:2;:27;62354:11;62366:1;62354:14;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;62351:27;;;;;;;;;;;:36;;62313:74;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62402:37;62442:2;:27;62445:11;62457:1;62445:14;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;62442:27;;;;;;;;;;;:38;;62402:78;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62529:31;62563:2;:13;62566:9;62563:13;;;;;;;;;;;:22;;62529:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62600:33;62636:2;:13;62639:9;62636:13;;;;;;;;;;;:24;;62600:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62677:29;62709:176;62737:21;62777:17;62813:19;62851:2;:13;62854:9;62851:13;;;;;;;;;;;:19;;;62709:9;:176::i;:::-;62677:208;;62900:33;62936:194;62964:17;63000:21;63040:23;63082:2;:27;63085:11;63097:1;63085:14;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;63082:27;;;;;;;;;;;:33;;;62936:9;:194::i;:::-;62900:230;-1:-1:-1;63148:14:0;;63186:102;6602:10;63211:11;63223:1;63211:14;;;;;;;;:::i;:::-;;;;;;;;;:26;:14;;;;;:26;;-1:-1:-1;;;;;63211:26:0;63239:21;63262:25;63186:10;:102::i;:::-;63147:141;;;;63317:11;63329:1;63317:14;;;;;;;;:::i;:::-;;;;;;;;;:26;:14;;;;;:26;;-1:-1:-1;;;;;63307:36:0;;;63317:26;;63307:36;63303:1406;;;63364:56;63379:11;63391:1;63379:14;;;;;;;;:::i;:::-;;;;;;;;;:26;:14;;;;;:26;;-1:-1:-1;;;;;63379:26:0;63407:12;63364:14;:56::i;:::-;63523:3;63487:2;:27;63490:11;63502:1;63490:14;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;63487:27;;;;;;;;;;;:33;;;:39;63483:126;;;63588:1;63551:2;:27;63554:11;63566:1;63554:14;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;63551:27;;;;;;;;;;;:33;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;63483:126:0;6602:10;-1:-1:-1;;;;;63673:356:0;63708:11;63720:1;63708:14;;;;;;;;:::i;:::-;;;;;;;;:26;:14;;;;;:26;;63792:11;:14;;-1:-1:-1;;;;;63708:26:0;;;;63673:356;;63792:14;;;;:::i;:::-;;;;;;;;;;;:23;;;63838:9;63870:25;63918:21;63962:12;63997:13;63673:356;;;;;;;;;;24637:25:1;;;24693:2;24678:18;;24671:34;;;;24736:2;24721:18;;24714:34;;;;24779:2;24764:18;;24757:34;24822:3;24807:19;;24800:35;24866:3;24851:19;;24844:35;24624:3;24609:19;;24350:535;63673:356:0;;;;;;;;63303:1406;;;64070:42;6602:10;64099:12;64070:14;:42::i;:::-;64179:13;;;;:2;:13;;;;;:19;;;64201:3;-1:-1:-1;64175:98:0;;;64252:1;64229:2;:13;64232:9;64229:13;;;;;;;;;;;:19;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;64175:98:0;64407:11;64419:1;64407:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;64407:26:0;6602:10;-1:-1:-1;;;;;64337:356:0;;64456:9;64488:11;64500:1;64488:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:23;64337:356;;;24637:25:1;;;24678:18;;;24671:34;24721:18;;24714:34;;;24779:2;24764:18;;24757:34;;;24822:3;24807:19;;24800:35;;;24866:3;24851:19;;24844:35;;;24624:3;24609:19;64337:356:0;;;;;;;63303:1406;64725:11;:17;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;64725:17:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64725:17:0;;;;;;;;;;;;;;61719:3209;-1:-1:-1;;;;;;;;;;;;61719:3209:0:o;61962:2852::-;64826:11;64843:53;;;;;;;;64859:9;64843:53;;;;64870:12;6602:10;;6522:98;64870:12;-1:-1:-1;;;;;64843:53:0;;;;;56891:9;64843:53;;64826:71;;;;;;;;-1:-1:-1;64826:71:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64826:71:0;-1:-1:-1;;;;;64826:71:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;61719:3209:0:o;53955:28::-;;;;;;;:::i;38568:125::-;38632:7;38659:21;38672:7;38659:12;:21::i;:::-;:26;;38568:125;-1:-1:-1;;38568:125:0:o;67066:980::-;56314:11;;56250:302;;;;;56314:11;56306:46;;;;-1:-1:-1;;;56306:46:0;;20534:2:1;56306:46:0;;;20516:21:1;20573:2;20553:18;;;20546:30;-1:-1:-1;;;20592:18:1;;;20585:52;20654:18;;56306:46:0;20332:346:1;56306:46:0;56385:1;56371:11;:15;:52;;;;;56405:18;;56390:11;:33;;56371:52;56363:85;;;;-1:-1:-1;;;56363:85:0;;17520:2:1;56363:85:0;;;17502:21:1;17559:2;17539:18;;;17532:30;-1:-1:-1;;;17578:18:1;;;17571:50;17638:18;;56363:85:0;17318:344:1;56363:85:0;56498:9;;56483:11;56467:13;66759:1;35150:12;34940:7;35134:13;:28;-1:-1:-1;;35134:46:0;;34896:303;56467:13;:27;;;;:::i;:::-;:40;;56459:73;;;;-1:-1:-1;;;56459:73:0;;22419:2:1;56459:73:0;;;22401:21:1;22458:2;22438:18;;;22431:30;-1:-1:-1;;;22477:18:1;;;22470:50;22537:18;;56459:73:0;22217:344:1;56459:73:0;56641:5:::1;::::0;56560:201:::1;::::0;::::1;::::0;-1:-1:-1;;;;;56641:5:0::1;6602:10:::0;-1:-1:-1;;;;;56625:21:0::1;;56621:121;;56695:11;56684:8;;:22;;;;:::i;:::-;56671:9;:35;;56663:67;;;::::0;-1:-1:-1;;;56663:67:0;;23178:2:1;56663:67:0::1;::::0;::::1;23160:21:1::0;23217:2;23197:18;;;23190:30;-1:-1:-1;;;23236:18:1;;;23229:49;23295:18;;56663:67:0::1;22976:343:1::0;56663:67:0::1;67324:20:::2;67347:13:::0;;;67371:320:::2;67393:11;67389:15;;:1;:15;;;67371:320;;;67426:15;67444:16;;::::0;::::2;:12:::0;:16:::2;:::i;:::-;67426:34;;67475:12;67517:25;67534:7;67517:16;:25::i;:::-;67549:9;67559:1;67549:12;;;;;;;;;;:::i;:::-;;;;;;;67568:11;67580:1;67568:14;;;;;;;;;;:::i;:::-;;;;;;;67500:83;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67490:94;;;;;;67475:109;;67607:53;67626:12;;67639:1;67626:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;67607:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;67643:10:0::2;::::0;;-1:-1:-1;67655:4:0;;-1:-1:-1;67607:18:0::2;:53::i;:::-;67599:80;;;::::0;-1:-1:-1;;;67599:80:0;;17177:2:1;67599:80:0::2;::::0;::::2;17159:21:1::0;17216:2;17196:18;;;17189:30;-1:-1:-1;;;17235:18:1;;;17228:44;17289:18;;67599:80:0::2;16975:338:1::0;67599:80:0::2;67411:280;;67406:3;;;;;:::i;:::-;;;;67371:320;;;-1:-1:-1::0;67703:36:0::2;6602:10:::0;67727:11:::2;67703:36;;:9;:36::i;:::-;67765:5;::::0;67750:32:::2;::::0;-1:-1:-1;;;;;67765:5:0::2;67772:9;67750:14;:32::i;:::-;67800:7;67795:244;67817:11;67813:15;;:1;:15;;;67795:244;;;67850:15;67868:16;;::::0;::::2;:12:::0;:16:::2;:::i;:::-;67899:11;::::0;;;:2:::2;:11;::::0;;;;:24;;;67961:12;;67850:34;;-1:-1:-1;67961:9:0;;:12:::2;::::0;::::2;::::0;;::::2;;;;;:::i;:::-;;;;;;;67938:2;:11;67941:7;67938:11;;;;;;;;;;;:20;;:35;;;;;;;;;;;;:::i;:::-;;68013:11;68025:1;68013:14;;;;;;;;;;:::i;:::-;;;;;;;67988:2;:11;67991:7;67988:11;;;;;;;;;;;:22;;:39;;;;;;;;;;;;:::i;:::-;;67835:204;67830:3;;;;;:::i;:::-;;;;67795:244;;;;67313:733;56543:1:::1;67066:980:::0;;;;;;:::o;36016:206::-;36080:7;-1:-1:-1;;;;;36104:19:0;;36100:60;;36132:28;;-1:-1:-1;;;36132:28:0;;;;;;;;;;;36100:60;-1:-1:-1;;;;;;36186:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;36186:27:0;;36016:206::o;61498:104::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;61570:10:::1;:24:::0;61498:104::o;65054:106::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;65130:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;58942:891::-:0;59100:5;;-1:-1:-1;;;;;59100:5:0;6602:10;59100:21;;:49;;-1:-1:-1;59125:8:0;;-1:-1:-1;;;;;59125:8:0;6602:10;59125:24;59100:49;59092:86;;;;-1:-1:-1;;;59092:86:0;;21660:2:1;59092:86:0;;;21642:21:1;21699:2;21679:18;;;21672:30;-1:-1:-1;;;21718:18:1;;;21711:54;21782:18;;59092:86:0;21458:348:1;59092:86:0;59231:11;:18;59211:9;:16;:38;59189:140;;;;-1:-1:-1;;;59189:140:0;;19752:2:1;59189:140:0;;;19734:21:1;19791:2;19771:18;;;19764:30;19830:34;19810:18;;;19803:62;-1:-1:-1;;;19881:18:1;;;19874:50;19941:19;;59189:140:0;19550:416:1;59189:140:0;59361:9;;59348;:22;;;;59340:72;;;;-1:-1:-1;;;59340:72:0;;22013:2:1;59340:72:0;;;21995:21:1;22052:2;22032:18;;;22025:30;22091:34;22071:18;;;22064:62;-1:-1:-1;;;22142:18:1;;;22135:35;22187:19;;59340:72:0;21811:401:1;59340:72:0;66759:1;59431:9;:28;;;;59423:97;;;;-1:-1:-1;;;59423:97:0;;16752:2:1;59423:97:0;;;16734:21:1;16791:2;16771:18;;;16764:30;16830:34;16810:18;;;16803:62;16901:26;16881:18;;;16874:54;16945:19;;59423:97:0;16550:420:1;59423:97:0;59540:17;;;;59539:18;59531:61;;;;-1:-1:-1;;;59531:61:0;;21301:2:1;59531:61:0;;;21283:21:1;21340:2;21320:18;;;21313:30;21379:32;21359:18;;;21352:60;21429:18;;59531:61:0;21099:354:1;59531:61:0;59610:8;59605:221;59628:9;:16;59624:1;:20;;;59605:221;;;59666:9;59678:13;59690:1;59678:9;:13;:::i;:::-;59706:14;;;;:6;;;;:2;:6;;;;;:14;59753:12;;59666:25;;-1:-1:-1;59753:9:0;;:12;;;;;;;;;;:::i;:::-;;;;;;;59735:2;:6;59738:2;59735:6;;;;;;;;;;;;;:15;;:30;;;;;;;;;;;;:::i;:::-;;59800:11;59812:1;59800:14;;;;;;;;;;:::i;:::-;;;;;;;59780:2;:6;59783:2;59780:6;;;;;;;;;;;;;:17;;:34;;;;;;;;;;;;:::i;:::-;;59651:175;59646:3;;;;;:::i;:::-;;;;59605:221;;57057:262;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57209:23:0;::::1;57201:82;;;::::0;-1:-1:-1;;;57201:82:0;;16337:2:1;57201:82:0::1;::::0;::::1;16319:21:1::0;16376:2;16356:18;;;16349:30;16415:34;16395:18;;;16388:62;-1:-1:-1;;;16466:18:1;;;16459:44;16520:19;;57201:82:0::1;16135:410:1::0;57201:82:0::1;57294:5;:17:::0;;-1:-1:-1;;;;;;57294:17:0::1;-1:-1:-1::0;;;;;57294:17:0;;;::::1;::::0;;;::::1;::::0;;57057:262::o;38929:104::-;38985:13;39018:7;39011:14;;;;;:::i;58721:100::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;58790:11:::1;:23:::0;;-1:-1:-1;;58790:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;58721:100::o;66789:250::-;56314:11;;66881;;56314;;56306:46;;;;-1:-1:-1;;;56306:46:0;;20534:2:1;56306:46:0;;;20516:21:1;20573:2;20553:18;;;20546:30;-1:-1:-1;;;20592:18:1;;;20585:52;20654:18;;56306:46:0;20332:346:1;56306:46:0;56385:1;56371:11;:15;:52;;;;;56405:18;;56390:11;:33;;56371:52;56363:85;;;;-1:-1:-1;;;56363:85:0;;17520:2:1;56363:85:0;;;17502:21:1;17559:2;17539:18;;;17532:30;-1:-1:-1;;;17578:18:1;;;17571:50;17638:18;;56363:85:0;17318:344:1;56363:85:0;56498:9;;56483:11;56467:13;66759:1;35150:12;34940:7;35134:13;:28;-1:-1:-1;;35134:46:0;;34896:303;56467:13;:27;;;;:::i;:::-;:40;;56459:73;;;;-1:-1:-1;;;56459:73:0;;22419:2:1;56459:73:0;;;22401:21:1;22458:2;22438:18;;;22431:30;-1:-1:-1;;;22477:18:1;;;22470:50;22537:18;;56459:73:0;22217:344:1;56459:73:0;56641:5:::1;::::0;66923:11;;-1:-1:-1;;;;;56641:5:0::1;6602:10:::0;-1:-1:-1;;;;;56625:21:0::1;;56621:121;;56695:11;56684:8;;:22;;;;:::i;:::-;56671:9;:35;;56663:67;;;::::0;-1:-1:-1;;;56663:67:0;;23178:2:1;56663:67:0::1;::::0;::::1;23160:21:1::0;23217:2;23197:18;;;23190:30;-1:-1:-1;;;23236:18:1;;;23229:49;23295:18;;56663:67:0::1;22976:343:1::0;56663:67:0::1;66952:36:::2;6602:10:::0;66976:11:::2;66952:9;:36::i;:::-;67014:5;::::0;66999:32:::2;::::0;-1:-1:-1;;;;;67014:5:0::2;67021:9;66999:14;:32::i;40539:287::-:0;-1:-1:-1;;;;;40638:24:0;;6602:10;40638:24;40634:54;;;40671:17;;-1:-1:-1;;;40671:17:0;;;;;;;;;;;40634:54;6602:10;40701:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;40701:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;40701:53:0;;;;;;;;;;40770:48;;15677:41:1;;;40701:42:0;;6602:10;40770:48;;15650:18:1;40770:48:0;;;;;;;40539:287;;:::o;58829:105::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;58903:8:::1;:23:::0;;-1:-1:-1;;;;;;58903:23:0::1;-1:-1:-1::0;;;;;58903:23:0;;;::::1;::::0;;;::::1;::::0;;58829:105::o;41625:369::-;41792:28;41802:4;41808:2;41812:7;41792:9;:28::i;:::-;-1:-1:-1;;;;;41835:13:0;;10794:19;:23;;41835:76;;;;;41855:56;41886:4;41892:2;41896:7;41905:5;41855:30;:56::i;:::-;41854:57;41835:76;41831:156;;;41935:40;;-1:-1:-1;;;41935:40:0;;;;;;;;;;;65282:416;65356:13;65390:17;65398:8;65390:7;:17::i;:::-;65382:77;;;;-1:-1:-1;;;65382:77:0;;20885:2:1;65382:77:0;;;20867:21:1;20924:2;20904:18;;;20897:30;20963:34;20943:18;;;20936:62;-1:-1:-1;;;21014:18:1;;;21007:45;21069:19;;65382:77:0;20683:411:1;65382:77:0;65472:28;65503:10;:8;:10::i;:::-;65472:41;;65575:1;65550:14;65544:28;:32;:146;;;;;;;;;;;;;;;;;65620:14;65636:19;:8;:17;:19::i;:::-;65657:9;65603:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65544:146;65524:166;65282:416;-1:-1:-1;;;65282:416:0:o;68078:133::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;68170:33:::1;68180:9;68191:11;68170:9;:33::i;58627:86::-:0;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;58681:17:::1;:24:::0;;-1:-1:-1;;58681:24:0::1;58701:4;58681:24;::::0;;58627:86::o;22111:112::-;22191:24;;-1:-1:-1;;;22191:24:0;;-1:-1:-1;;;;;14139:32:1;;;22191:24:0;;;14121:51:1;22164:7:0;;22191;:18;;;;;;14094::1;;22191:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;57954:456::-;56164:5;;-1:-1:-1;;;;;56164:5:0;6602:10;56164:21;56156:66;;;;-1:-1:-1;;;56156:66:0;;;;;;;:::i;:::-;58060:1:::1;58042:15;:19;58034:73;;;::::0;-1:-1:-1;;;58034:73:0;;22768:2:1;58034:73:0::1;::::0;::::1;22750:21:1::0;22807:2;22787:18;;;22780:30;22846:34;22826:18;;;22819:62;-1:-1:-1;;;22897:18:1;;;22890:39;22946:19;;58034:73:0::1;22566:405:1::0;58034:73:0::1;58124:11;:18:::0;:22;58120:239:::1;;58168:9;58163:152;58187:11;:18:::0;58183:22;::::1;58163:152;;;58231:68;58246:11;58258:1;58246:14;;;;;;;;:::i;:::-;;;;;;;;;;;:26;;;;;;;;;;-1:-1:-1::0;;;;;58246:26:0::1;58274:11;58286:1;58274:14;;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;58231:14;:68::i;:::-;58207:3:::0;::::1;::::0;::::1;:::i;:::-;;;;58163:152;;;-1:-1:-1::0;58329:18:0::1;58336:11;;58329:18;:::i;:::-;58371:13;:31:::0;57954:456::o;42249:174::-;42306:4;42349:7;66759:1;42330:26;;:53;;;;;42370:13;;42360:7;:23;42330:53;:85;;;;-1:-1:-1;;42388:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;42388:27:0;;;;42387:28;;42249:174::o;50406:196::-;50521:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;50521:29:0;-1:-1:-1;;;;;50521:29:0;;;;;;;;;50566:28;;50521:24;;50566:28;;;;;;;50406:196;;;:::o;45349:2130::-;45464:35;45502:21;45515:7;45502:12;:21::i;:::-;45464:59;;45562:4;-1:-1:-1;;;;;45540:26:0;:13;:18;;;-1:-1:-1;;;;;45540:26:0;;45536:67;;45575:28;;-1:-1:-1;;;45575:28:0;;;;;;;;;;;45536:67;45616:22;6602:10;-1:-1:-1;;;;;45642:20:0;;;;:73;;-1:-1:-1;45679:36:0;45696:4;6602:10;40897:164;:::i;45679:36::-;45642:126;;;-1:-1:-1;6602:10:0;45732:20;45744:7;45732:11;:20::i;:::-;-1:-1:-1;;;;;45732:36:0;;45642:126;45616:153;;45787:17;45782:66;;45813:35;;-1:-1:-1;;;45813:35:0;;;;;;;;;;;45782:66;-1:-1:-1;;;;;45863:16:0;;45859:52;;45888:23;;-1:-1:-1;;;45888:23:0;;;;;;;;;;;45859:52;46032:35;46049:1;46053:7;46062:4;46032:8;:35::i;:::-;-1:-1:-1;;;;;46363:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;46363:31:0;;;-1:-1:-1;;;;;46363:31:0;;;-1:-1:-1;;46363:31:0;;;;;;;46409:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;46409:29:0;;;;;;;;;;;46489:20;;;:11;:20;;;;;;46524:18;;-1:-1:-1;;;;;;46557:49:0;;;;-1:-1:-1;;;46590:15:0;46557:49;;;;;;;;;;46880:11;;46940:24;;;;;46983:13;;46489:20;;46940:24;;46983:13;46979:384;;47193:13;;47178:11;:28;47174:174;;47231:20;;47300:28;;;;-1:-1:-1;;;;;47274:54:0;-1:-1:-1;;;47274:54:0;-1:-1:-1;;;;;;47274:54:0;;;-1:-1:-1;;;;;47231:20:0;;47274:54;;;;47174:174;46338:1036;;;47410:7;47406:2;-1:-1:-1;;;;;47391:27:0;47400:4;-1:-1:-1;;;;;47391:27:0;;;;;;;;;;;47429:42;60078:751;60988:502;61197:7;61217:22;61242:47;61252:17;61271;61242:9;:47::i;:::-;61217:72;;61300:24;61327:49;61337:17;61356:19;61327:9;:49::i;:::-;61300:76;;61467:14;61455:9;;:26;;;;:::i;:::-;61394:57;61403:44;61412:15;61403:44;;61429:17;61403:44;;:8;:44::i;:::-;61449:1;61394:8;:57::i;:::-;:88;;;;:::i;:::-;61387:95;;;;60988:502;;;;;;;:::o;57327:619::-;57441:7;;57480:2;57441:7;57515:15;57480:2;57515:8;:15;:::i;:::-;57493:37;-1:-1:-1;57541:19:0;57563:15;;;;:8;:15;:::i;:::-;57541:37;;57627:9;57671:16;57689:15;57654:73;;;;;;;;57707:8;-1:-1:-1;;;;;57654:73:0;-1:-1:-1;;;;;57654:73:0;;;;;57717:8;-1:-1:-1;;;;;57654:73:0;-1:-1:-1;;;;;57654:73:0;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57654:73:0;;;;;;;;;57644:84;;57654:73;57644:84;;;;;-1:-1:-1;57639:90:0;57761:31;57778:14;57761;:31;:::i;:::-;57753:40;;:4;:40;:::i;:::-;57740:53;;57815:14;57807:5;:22;57804:135;;;57854:8;;-1:-1:-1;57864:5:0;-1:-1:-1;57846:24:0;;-1:-1:-1;;;;57846:24:0;57804:135;57911:8;;-1:-1:-1;57921:5:0;-1:-1:-1;57903:24:0;;-1:-1:-1;;;;57903:24:0;57327:619;;;;;;;;:::o;37397:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;37508:7:0;;66759:1;37557:23;;:47;;;;;37591:13;;37584:4;:20;37557:47;37553:886;;;37625:31;37659:17;;;:11;:17;;;;;;;;;37625:51;;;;;;;;;-1:-1:-1;;;;;37625:51:0;;;;-1:-1:-1;;;37625:51:0;;-1:-1:-1;;;;;37625:51:0;;;;;;;;-1:-1:-1;;;37625:51:0;;;;;;;;;;;;;;37695:729;;37745:14;;-1:-1:-1;;;;;37745:28:0;;37741:101;;37809:9;37397:1109;-1:-1:-1;;;37397:1109:0:o;37741:101::-;-1:-1:-1;;;38184:6:0;38229:17;;;;:11;:17;;;;;;;;;38217:29;;;;;;;;;-1:-1:-1;;;;;38217:29:0;;;;;-1:-1:-1;;;38217:29:0;;-1:-1:-1;;;;;38217:29:0;;;;;;;;-1:-1:-1;;;38217:29:0;;;;;;;;;;;;;38277:28;38273:109;;38345:9;37397:1109;-1:-1:-1;;;37397:1109:0:o;38273:109::-;38144:261;;;37606:833;37553:886;38467:31;;-1:-1:-1;;;38467:31:0;;;;;;;;;;;4084:723;4140:13;4361:10;4357:53;;-1:-1:-1;;4388:10:0;;;;;;;;;;;;-1:-1:-1;;;4388:10:0;;;;;4084:723::o;4357:53::-;4435:5;4420:12;4476:78;4483:9;;4476:78;;4509:8;;;;:::i;:::-;;-1:-1:-1;4532:10:0;;-1:-1:-1;4540:2:0;4532:10;;:::i;:::-;;;4476:78;;;4564:19;4596:6;-1:-1:-1;;;;;4586:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4586:17:0;;4564:39;;4614:154;4621:10;;4614:154;;4648:11;4658:1;4648:11;;:::i;:::-;;-1:-1:-1;4717:10:0;4725:2;4717:5;:10;:::i;:::-;4704:24;;:2;:24;:::i;:::-;4691:39;;4674:6;4681;4674:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4674:56:0;;;;;;;;-1:-1:-1;4745:11:0;4754:2;4745:11;;:::i;:::-;;;4614:154;;2253:190;2378:4;2431;2402:25;2415:5;2422:4;2402:12;:25::i;:::-;:33;;2253:190;-1:-1:-1;;;;2253:190:0:o;42431:104::-;42500:27;42510:2;42514:8;42500:27;;;;;;;;;;;;:9;:27::i;51094:667::-;51278:72;;-1:-1:-1;;;51278:72:0;;51257:4;;-1:-1:-1;;;;;51278:36:0;;;;;:72;;6602:10;;51329:4;;51335:7;;51344:5;;51278:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51278:72:0;;;;;;;;-1:-1:-1;;51278:72:0;;;;;;;;;;;;:::i;:::-;;;51274:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51512:13:0;;51508:235;;51558:40;;-1:-1:-1;;;51558:40:0;;;;;;;;;;;51508:235;51701:6;51695:13;51686:6;51682:2;51678:15;51671:38;51274:480;-1:-1:-1;;;;;;51397:55:0;-1:-1:-1;;;51397:55:0;;-1:-1:-1;51390:62:0;;64936:110;64996:13;65029:9;65022:16;;;;;:::i;60837:143::-;60922:6;60948:8;60957:5;60948:15;;;;;;:::i;:::-;;;;;;;;;;;;;60964:7;60948:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;60837:143:0;;;;:::o;355:107::-;413:7;445:1;440;:6;;:14;;453:1;440:14;;;-1:-1:-1;449:1:0;;433:21;-1:-1:-1;355:107:0:o;2805:675::-;2888:7;2931:4;2888:7;2946:497;2970:5;:12;2966:1;:16;2946:497;;;3004:20;3027:5;3033:1;3027:8;;;;;;;;:::i;:::-;;;;;;;3004:31;;3070:12;3054;:28;3050:382;;3556:13;3606:15;;;3642:4;3635:15;;;3689:4;3673:21;;3182:57;;3050:382;;;3556:13;3606:15;;;3642:4;3635:15;;;3689:4;3673:21;;3359:57;;3050:382;-1:-1:-1;2984:3:0;;;;:::i;:::-;;;;2946:497;;;-1:-1:-1;3460:12:0;2805:675;-1:-1:-1;;;2805:675:0:o;42898:163::-;43021:32;43027:2;43031:8;43041:5;43048:4;43459:20;43482:13;-1:-1:-1;;;;;43510:16:0;;43506:48;;43535:19;;-1:-1:-1;;;43535:19:0;;;;;;;;;;;43506:48;43569:13;43565:44;;43591:18;;-1:-1:-1;;;43591:18:0;;;;;;;;;;;43565:44;-1:-1:-1;;;;;43960:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;44019:49:0;;-1:-1:-1;;;;;43960:44:0;;;;;;;44019:49;;;;-1:-1:-1;;43960:44:0;;;;;;44019:49;;;;;;;;;;;;;;;;44085:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;44135:66:0;;;;-1:-1:-1;;;44185:15:0;44135:66;;;;;;;;;;44085:25;44282:23;;;44326:4;:23;;;;-1:-1:-1;;;;;;44334:13:0;;10794:19;:23;;44334:15;44322:641;;;44370:314;44401:38;;44426:12;;-1:-1:-1;;;;;44401:38:0;;;44418:1;;44401:38;;44418:1;;44401:38;44467:69;44506:1;44510:2;44514:14;;;;;;44530:5;44467:30;:69::i;:::-;44462:174;;44572:40;;-1:-1:-1;;;44572:40:0;;;;;;;;;;;44462:174;44679:3;44663:12;:19;;44370:314;;44765:12;44748:13;;:29;44744:43;;44779:8;;;44744:43;44322:641;;;44828:120;44859:40;;44884:14;;;;;-1:-1:-1;;;;;44859:40:0;;;44876:1;;44859:40;;44876:1;;44859:40;44943:3;44927:12;:19;;44828:120;;44322:641;-1:-1:-1;44977:13:0;:28;45027:60;60078:751;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:865::-;478:5;531:3;524:4;516:6;512:17;508:27;498:55;;549:1;546;539:12;498:55;585:6;572:20;611:4;635:69;651:52;700:2;651:52;:::i;:::-;635:69;:::i;:::-;726:3;750:2;745:3;738:15;778:2;773:3;769:12;762:19;;813:2;805:6;801:15;865:3;860:2;854;851:1;847:10;839:6;835:23;831:32;828:41;825:61;;;882:1;879;872:12;825:61;904:1;925;935:326;951:2;946:3;943:11;935:326;;;1032:3;1019:17;-1:-1:-1;;;;;1055:11:1;1052:35;1049:55;;;1100:1;1097;1090:12;1049:55;1129:57;1182:3;1177:2;1163:11;1155:6;1151:24;1147:33;1129:57;:::i;:::-;1117:70;;-1:-1:-1;1207:12:1;;;;1239;;;;973:1;964:11;935:326;;;-1:-1:-1;1279:5:1;;425:865;-1:-1:-1;;;;;;;;425:865:1:o;1295:160::-;1360:20;;1416:13;;1409:21;1399:32;;1389:60;;1445:1;1442;1435:12;1389:60;1295:160;;;:::o;1460:221::-;1503:5;1556:3;1549:4;1541:6;1537:17;1533:27;1523:55;;1574:1;1571;1564:12;1523:55;1596:79;1671:3;1662:6;1649:20;1642:4;1634:6;1630:17;1596:79;:::i;1686:159::-;1753:20;;1813:6;1802:18;;1792:29;;1782:57;;1835:1;1832;1825:12;1850:156;1916:20;;1976:4;1965:16;;1955:27;;1945:55;;1996:1;1993;1986:12;2011:247;2070:6;2123:2;2111:9;2102:7;2098:23;2094:32;2091:52;;;2139:1;2136;2129:12;2091:52;2178:9;2165:23;2197:31;2222:5;2197:31;:::i;2523:388::-;2591:6;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2707:9;2694:23;2726:31;2751:5;2726:31;:::i;:::-;2776:5;-1:-1:-1;2833:2:1;2818:18;;2805:32;2846:33;2805:32;2846:33;:::i;:::-;2898:7;2888:17;;;2523:388;;;;;:::o;2916:456::-;2993:6;3001;3009;3062:2;3050:9;3041:7;3037:23;3033:32;3030:52;;;3078:1;3075;3068:12;3030:52;3117:9;3104:23;3136:31;3161:5;3136:31;:::i;:::-;3186:5;-1:-1:-1;3243:2:1;3228:18;;3215:32;3256:33;3215:32;3256:33;:::i;:::-;2916:456;;3308:7;;-1:-1:-1;;;3362:2:1;3347:18;;;;3334:32;;2916:456::o;3377:794::-;3472:6;3480;3488;3496;3549:3;3537:9;3528:7;3524:23;3520:33;3517:53;;;3566:1;3563;3556:12;3517:53;3605:9;3592:23;3624:31;3649:5;3624:31;:::i;:::-;3674:5;-1:-1:-1;3731:2:1;3716:18;;3703:32;3744:33;3703:32;3744:33;:::i;:::-;3796:7;-1:-1:-1;3850:2:1;3835:18;;3822:32;;-1:-1:-1;3905:2:1;3890:18;;3877:32;-1:-1:-1;;;;;3921:30:1;;3918:50;;;3964:1;3961;3954:12;3918:50;3987:22;;4040:4;4032:13;;4028:27;-1:-1:-1;4018:55:1;;4069:1;4066;4059:12;4018:55;4092:73;4157:7;4152:2;4139:16;4134:2;4130;4126:11;4092:73;:::i;:::-;4082:83;;;3377:794;;;;;;;:::o;4176:315::-;4241:6;4249;4302:2;4290:9;4281:7;4277:23;4273:32;4270:52;;;4318:1;4315;4308:12;4270:52;4357:9;4344:23;4376:31;4401:5;4376:31;:::i;:::-;4426:5;-1:-1:-1;4450:35:1;4481:2;4466:18;;4450:35;:::i;:::-;4440:45;;4176:315;;;;;:::o;4496:::-;4564:6;4572;4625:2;4613:9;4604:7;4600:23;4596:32;4593:52;;;4641:1;4638;4631:12;4593:52;4680:9;4667:23;4699:31;4724:5;4699:31;:::i;:::-;4749:5;4801:2;4786:18;;;;4773:32;;-1:-1:-1;;;4496:315:1:o;4816:1452::-;4987:6;4995;5003;5056:2;5044:9;5035:7;5031:23;5027:32;5024:52;;;5072:1;5069;5062:12;5024:52;5112:9;5099:23;-1:-1:-1;;;;;5182:2:1;5174:6;5171:14;5168:34;;;5198:1;5195;5188:12;5168:34;5221:60;5273:7;5264:6;5253:9;5249:22;5221:60;:::i;:::-;5211:70;;5300:2;5290:12;;5355:2;5344:9;5340:18;5327:32;5384:2;5374:8;5371:16;5368:36;;;5400:1;5397;5390:12;5368:36;5423:24;;5478:4;5470:13;;5466:27;-1:-1:-1;5456:55:1;;5507:1;5504;5497:12;5456:55;5543:2;5530:16;5566:69;5582:52;5631:2;5582:52;:::i;5566:69::-;5657:3;5681:2;5676:3;5669:15;5709:2;5704:3;5700:12;5693:19;;5740:2;5736;5732:11;5788:7;5783:2;5777;5774:1;5770:10;5766:2;5762:19;5758:28;5755:41;5752:61;;;5809:1;5806;5799:12;5752:61;5831:1;5852;5862:320;5878:2;5873:3;5870:11;5862:320;;;5959:3;5946:17;5995:2;5982:11;5979:19;5976:39;;;6011:1;6008;6001:12;5976:39;6040:67;6099:7;6094:2;6080:11;6076:2;6072:20;6068:29;6040:67;:::i;:::-;6028:80;;-1:-1:-1;6128:12:1;;;;6160;;;;5900:1;5891:11;5862:320;;;5866:3;;;6201:5;6191:15;;;;;;;;6225:37;6258:2;6247:9;6243:18;6225:37;:::i;:::-;6215:47;;4816:1452;;;;;:::o;6273:1183::-;6481:6;6489;6497;6505;6513;6566:3;6554:9;6545:7;6541:23;6537:33;6534:53;;;6583:1;6580;6573:12;6534:53;6623:9;6610:23;-1:-1:-1;;;;;6693:2:1;6685:6;6682:14;6679:34;;;6709:1;6706;6699:12;6679:34;6732:60;6784:7;6775:6;6764:9;6760:22;6732:60;:::i;:::-;6722:70;;6845:2;6834:9;6830:18;6817:32;6801:48;;6874:2;6864:8;6861:16;6858:36;;;6890:1;6887;6880:12;6858:36;6913:62;6967:7;6956:8;6945:9;6941:24;6913:62;:::i;:::-;6903:72;;7028:2;7017:9;7013:18;7000:32;6984:48;;7057:2;7047:8;7044:16;7041:36;;;7073:1;7070;7063:12;7041:36;7111:8;7100:9;7096:24;7086:34;;7158:7;7151:4;7147:2;7143:13;7139:27;7129:55;;7180:1;7177;7170:12;7129:55;7220:2;7207:16;7246:2;7238:6;7235:14;7232:34;;;7262:1;7259;7252:12;7232:34;7315:7;7310:2;7300:6;7297:1;7293:14;7289:2;7285:23;7281:32;7278:45;7275:65;;;7336:1;7333;7326:12;7275:65;7367:2;7363;7359:11;7349:21;;7389:6;7379:16;;;;;7414:36;7446:2;7435:9;7431:18;7414:36;:::i;:::-;7404:46;;6273:1183;;;;;;;;:::o;7461:180::-;7517:6;7570:2;7558:9;7549:7;7545:23;7541:32;7538:52;;;7586:1;7583;7576:12;7538:52;7609:26;7625:9;7609:26;:::i;7646:180::-;7705:6;7758:2;7746:9;7737:7;7733:23;7729:32;7726:52;;;7774:1;7771;7764:12;7726:52;-1:-1:-1;7797:23:1;;7646:180;-1:-1:-1;7646:180:1:o;7831:245::-;7889:6;7942:2;7930:9;7921:7;7917:23;7913:32;7910:52;;;7958:1;7955;7948:12;7910:52;7997:9;7984:23;8016:30;8040:5;8016:30;:::i;8081:249::-;8150:6;8203:2;8191:9;8182:7;8178:23;8174:32;8171:52;;;8219:1;8216;8209:12;8171:52;8251:9;8245:16;8270:30;8294:5;8270:30;:::i;8335:322::-;8404:6;8457:2;8445:9;8436:7;8432:23;8428:32;8425:52;;;8473:1;8470;8463:12;8425:52;8513:9;8500:23;-1:-1:-1;;;;;8538:6:1;8535:30;8532:50;;;8578:1;8575;8568:12;8532:50;8601;8643:7;8634:6;8623:9;8619:22;8601:50;:::i;8662:543::-;8750:6;8758;8811:2;8799:9;8790:7;8786:23;8782:32;8779:52;;;8827:1;8824;8817:12;8779:52;8867:9;8854:23;-1:-1:-1;;;;;8937:2:1;8929:6;8926:14;8923:34;;;8953:1;8950;8943:12;8923:34;8976:50;9018:7;9009:6;8998:9;8994:22;8976:50;:::i;:::-;8966:60;;9079:2;9068:9;9064:18;9051:32;9035:48;;9108:2;9098:8;9095:16;9092:36;;;9124:1;9121;9114:12;9092:36;;9147:52;9191:7;9180:8;9169:9;9165:24;9147:52;:::i;:::-;9137:62;;;8662:543;;;;;:::o;9210:685::-;9356:6;9364;9372;9425:2;9413:9;9404:7;9400:23;9396:32;9393:52;;;9441:1;9438;9431:12;9393:52;9464:28;9482:9;9464:28;:::i;:::-;9454:38;;9543:2;9532:9;9528:18;9515:32;-1:-1:-1;;;;;9607:2:1;9599:6;9596:14;9593:34;;;9623:1;9620;9613:12;9593:34;9646:60;9698:7;9689:6;9678:9;9674:22;9646:60;:::i;:::-;9636:70;;9759:2;9748:9;9744:18;9731:32;9715:48;;9788:2;9778:8;9775:16;9772:36;;;9804:1;9801;9794:12;9772:36;;9827:62;9881:7;9870:8;9859:9;9855:24;9827:62;:::i;:::-;9817:72;;;9210:685;;;;;:::o;10085:184::-;10155:6;10208:2;10196:9;10187:7;10183:23;10179:32;10176:52;;;10224:1;10221;10214:12;10176:52;-1:-1:-1;10247:16:1;;10085:184;-1:-1:-1;10085:184:1:o;10274:257::-;10315:3;10353:5;10347:12;10380:6;10375:3;10368:19;10396:63;10452:6;10445:4;10440:3;10436:14;10429:4;10422:5;10418:16;10396:63;:::i;:::-;10513:2;10492:15;-1:-1:-1;;10488:29:1;10479:39;;;;10520:4;10475:50;;10274:257;-1:-1:-1;;10274:257:1:o;10536:276::-;10667:3;10705:6;10699:13;10721:53;10767:6;10762:3;10755:4;10747:6;10743:17;10721:53;:::i;:::-;10790:16;;;;;10536:276;-1:-1:-1;;10536:276:1:o;10817:1527::-;11041:3;11079:6;11073:13;11105:4;11118:51;11162:6;11157:3;11152:2;11144:6;11140:15;11118:51;:::i;:::-;11232:13;;11191:16;;;;11254:55;11232:13;11191:16;11276:15;;;11254:55;:::i;:::-;11398:13;;11331:20;;;11371:1;;11458;11480:18;;;;11533;;;;11560:93;;11638:4;11628:8;11624:19;11612:31;;11560:93;11701:2;11691:8;11688:16;11668:18;11665:40;11662:167;;;-1:-1:-1;;;11728:33:1;;11784:4;11781:1;11774:15;11814:4;11735:3;11802:17;11662:167;11845:18;11872:110;;;;11996:1;11991:328;;;;11838:481;;11872:110;-1:-1:-1;;11907:24:1;;11893:39;;11952:20;;;;-1:-1:-1;11872:110:1;;11991:328;25990:1;25983:14;;;26027:4;26014:18;;12086:1;12100:169;12114:8;12111:1;12108:15;12100:169;;;12196:14;;12181:13;;;12174:37;12239:16;;;;12131:10;;12100:169;;;12104:3;;12300:8;12293:5;12289:20;12282:27;;11838:481;-1:-1:-1;12335:3:1;;10817:1527;-1:-1:-1;;;;;;;;;;;10817:1527:1:o;12349:960::-;12778:3;12816:6;12810:13;12832:53;12878:6;12873:3;12866:4;12858:6;12854:17;12832:53;:::i;:::-;12916:6;12911:3;12907:16;12894:29;;-1:-1:-1;;;12968:2:1;12961:5;12954:17;13002:6;12996:13;13018:65;13074:8;13070:1;13063:5;13059:13;13052:4;13044:6;13040:17;13018:65;:::i;:::-;13146:1;13102:20;;13138:10;;;13131:22;13178:13;;13200:62;13178:13;13249:1;13241:10;;13234:4;13222:17;;13200:62;:::i;:::-;13282:17;13301:1;13278:25;;12349:960;-1:-1:-1;;;;;12349:960:1:o;13314:656::-;13557:6;13552:3;13545:19;13527:3;13583:2;13615:6;13610:2;13605:3;13601:12;13594:28;13653:2;13648:3;13644:12;13702:6;13726:1;13736:199;13750:4;13747:1;13744:11;13736:199;;;13815:13;;-1:-1:-1;;;;;13811:39:1;13797:54;;13873:14;;;;13910:15;;;;13847:1;13763:9;13736:199;;;13740:3;;;;13960;13955;13951:13;13944:20;;13314:656;;;;;;:::o;14407:488::-;-1:-1:-1;;;;;14676:15:1;;;14658:34;;14728:15;;14723:2;14708:18;;14701:43;14775:2;14760:18;;14753:34;;;14823:3;14818:2;14803:18;;14796:31;;;14601:4;;14844:45;;14869:19;;14861:6;14844:45;:::i;:::-;14836:53;14407:488;-1:-1:-1;;;;;;14407:488:1:o;14900:632::-;15071:2;15123:21;;;15193:13;;15096:18;;;15215:22;;;15042:4;;15071:2;15294:15;;;;15268:2;15253:18;;;15042:4;15337:169;15351:6;15348:1;15345:13;15337:169;;;15412:13;;15400:26;;15481:15;;;;15446:12;;;;15373:1;15366:9;15337:169;;;-1:-1:-1;15523:3:1;;14900:632;-1:-1:-1;;;;;;14900:632:1:o;15911:219::-;16060:2;16049:9;16042:21;16023:4;16080:44;16120:2;16109:9;16105:18;16097:6;16080:44;:::i;19971:356::-;20173:2;20155:21;;;20192:18;;;20185:30;20251:34;20246:2;20231:18;;20224:62;20318:2;20303:18;;19971:356::o;23324:646::-;23501:2;23490:9;23483:21;23546:6;23540:13;23535:2;23524:9;23520:18;23513:41;23608:2;23600:6;23596:15;23590:22;23585:2;23574:9;23570:18;23563:50;23464:4;23660:2;23652:6;23648:15;23642:22;23700:4;23695:2;23684:9;23680:18;23673:32;23728:51;23774:3;23763:9;23759:19;23745:12;23728:51;:::i;:::-;23714:65;;23828:2;23820:6;23816:15;23810:22;23902:2;23898:7;23886:9;23878:6;23874:22;23870:36;23863:4;23852:9;23848:20;23841:66;23924:40;23957:6;23941:14;23924:40;:::i;:::-;23916:48;23324:646;-1:-1:-1;;;;;23324:646:1:o;24890:545::-;24983:4;24989:6;25049:11;25036:25;25143:2;25139:7;25128:8;25112:14;25108:29;25104:43;25084:18;25080:68;25070:96;;25162:1;25159;25152:12;25070:96;25189:33;;25241:20;;;-1:-1:-1;;;;;;25273:30:1;;25270:50;;;25316:1;25313;25306:12;25270:50;25349:4;25337:17;;-1:-1:-1;25400:1:1;25396:14;;;25380;25376:35;25366:46;;25363:66;;;25425:1;25422;25415:12;25363:66;24890:545;;;;;:::o;25440:275::-;25511:2;25505:9;25576:2;25557:13;;-1:-1:-1;;25553:27:1;25541:40;;-1:-1:-1;;;;;25596:34:1;;25632:22;;;25593:62;25590:88;;;25658:18;;:::i;:::-;25694:2;25687:22;25440:275;;-1:-1:-1;25440:275:1:o;25720:192::-;25789:4;-1:-1:-1;;;;;25814:6:1;25811:30;25808:56;;;25844:18;;:::i;:::-;-1:-1:-1;25889:1:1;25885:14;25901:4;25881:25;;25720:192::o;26043:224::-;26082:3;26110:6;26143:2;26140:1;26136:10;26173:2;26170:1;26166:10;26204:3;26200:2;26196:12;26191:3;26188:21;26185:47;;;26212:18;;:::i;:::-;26248:13;;26043:224;-1:-1:-1;;;;26043:224:1:o;26272:128::-;26312:3;26343:1;26339:6;26336:1;26333:13;26330:39;;;26349:18;;:::i;:::-;-1:-1:-1;26385:9:1;;26272:128::o;26405:120::-;26445:1;26471;26461:35;;26476:18;;:::i;:::-;-1:-1:-1;26510:9:1;;26405:120::o;26530:168::-;26570:7;26636:1;26632;26628:6;26624:14;26621:1;26618:21;26613:1;26606:9;26599:17;26595:45;26592:71;;;26643:18;;:::i;:::-;-1:-1:-1;26683:9:1;;26530:168::o;26703:125::-;26743:4;26771:1;26768;26765:8;26762:34;;;26776:18;;:::i;:::-;-1:-1:-1;26813:9:1;;26703:125::o;26833:258::-;26905:1;26915:113;26929:6;26926:1;26923:13;26915:113;;;27005:11;;;26999:18;26986:11;;;26979:39;26951:2;26944:10;26915:113;;;27046:6;27043:1;27040:13;27037:48;;;-1:-1:-1;;27081:1:1;27063:16;;27056:27;26833:258::o;27096:380::-;27175:1;27171:12;;;;27218;;;27239:61;;27293:4;27285:6;27281:17;27271:27;;27239:61;27346:2;27338:6;27335:14;27315:18;27312:38;27309:161;;;27392:10;27387:3;27383:20;27380:1;27373:31;27427:4;27424:1;27417:15;27455:4;27452:1;27445:15;27309:161;;27096:380;;;:::o;27481:197::-;27519:3;27547:6;27588:2;27581:5;27577:14;27615:2;27606:7;27603:15;27600:41;;;27621:18;;:::i;:::-;27670:1;27657:15;;27481:197;-1:-1:-1;;;27481:197:1:o;27683:135::-;27722:3;-1:-1:-1;;27743:17:1;;27740:43;;;27763:18;;:::i;:::-;-1:-1:-1;27810:1:1;27799:13;;27683:135::o;27823:175::-;27860:3;27904:4;27897:5;27893:16;27933:4;27924:7;27921:17;27918:43;;;27941:18;;:::i;:::-;27990:1;27977:15;;27823:175;-1:-1:-1;;27823:175:1:o;28003:112::-;28035:1;28061;28051:35;;28066:18;;:::i;:::-;-1:-1:-1;28100:9:1;;28003:112::o;28120:127::-;28181:10;28176:3;28172:20;28169:1;28162:31;28212:4;28209:1;28202:15;28236:4;28233:1;28226:15;28252:127;28313:10;28308:3;28304:20;28301:1;28294:31;28344:4;28341:1;28334:15;28368:4;28365:1;28358:15;28384:127;28445:10;28440:3;28436:20;28433:1;28426:31;28476:4;28473:1;28466:15;28500:4;28497:1;28490:15;28516:127;28577:10;28572:3;28568:20;28565:1;28558:31;28608:4;28605:1;28598:15;28632:4;28629:1;28622:15;28648:127;28709:10;28704:3;28700:20;28697:1;28690:31;28740:4;28737:1;28730:15;28764:4;28761:1;28754:15;28780:131;-1:-1:-1;;;;;28855:31:1;;28845:42;;28835:70;;28901:1;28898;28891:12;28916:131;-1:-1:-1;;;;;;28990:32:1;;28980:43;;28970:71;;29037:1;29034;29027:12
Swarm Source
ipfs://32cc0548414517fd9985f3674e8c50b69570b4d8742bafae07e3d77494d9a306
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.