Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
849 CWEAPON
Holders
207
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CudlWeapons
Compiler Version
v0.8.2+commit.661d1103
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-06 */ // Sources flattened with hardhat v2.6.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] 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/[email protected] pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] 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/utils/[email protected] pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] 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/[email protected] pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/security/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * 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]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/access/[email protected] pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File base64-sol/[email protected] /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } } // File contracts/CudlWeapons.sol pragma solidity ^0.8.0; contract CudlWeapons is ERC721Enumerable, ReentrancyGuard, Ownable { using SafeERC20 for IERC20; // OG mooncat contract IERC721 mooncat = IERC721(0xc3f733ca98E0daD0386979Eb96fb1722A1A05E69); // Token used as the trade in for the weaponSmith IERC20 public token; // Mapping containing the weaponSmith's records on upgraded weapons mapping(uint256 => uint256) public boosts; // Mapping containing the base stats on all weapon classes mapping(uint8 => uint16[5]) public bases; // coefficient applied to weaponSmith uint256 boostCoefficient; // weapon smith opening bool weaponSmithOpen; event TokenUpdated(address oldToken, address newToken); event Upgrade(uint256 tokenId, uint256 upgradeAmount); event BoostCoefficientUpdated( uint256 oldBoostCoefficient, uint256 newBoostCoefficient ); event WeaponSmithOpen(bool open); string[] private weapons = [ "Warhammer", "Quarterstaff", "Maul", "Mace", "Club", "Katana", "Falchion", "Scimitar", "Long Sword", "Short Sword", "Ghost Wand", "Grave Wand", "Bone Wand", "Wand", "Grimoire", "Chronicle", "Tome", "Book" ]; string[] private namePrefixes = [ "Agony", "Apocalypse", "Armageddon", "Beast", "Behemoth", "Blight", "Blood", "Bramble", "Brimstone", "Brood", "Carrion", "Cataclysm", "Chimeric", "Corpse", "Corruption", "Damnation", "Death", "Demon", "Dire", "Dragon", "Dread", "Doom", "Dusk", "Eagle", "Empyrean", "Fate", "Foe", "Gale", "Ghoul", "Gloom", "Glyph", "Golem", "Grim", "Hate", "Havoc", "Honour", "Horror", "Hypnotic", "Kraken", "Loath", "Maelstrom", "Mind", "Miracle", "Morbid", "Oblivion", "Onslaught", "Pain", "Pandemonium", "Phoenix", "Plague", "Rage", "Rapture", "Rune", "Skull", "Sol", "Soul", "Sorrow", "Spirit", "Storm", "Tempest", "Torment", "Vengeance", "Victory", "Viper", "Vortex", "Woe", "Wrath", "Light's", "Shimmering" ]; string[] private nameSuffixes = [ "Bane", "Root", "Bite", "Song", "Roar", "Grasp", "Instrument", "Glow", "Bender", "Shadow", "Whisper", "Shout", "Growl", "Tear", "Peak", "Form", "Sun", "Moon" ]; string[] private suffixes = [ "of Power", "of Giants", "of Titans", "of Skill", "of Perfection", "of Brilliance", "of Enlightenment", "of Protection", "of Anger", "of Rage", "of Fury", "of Vitriol", "of the Fox", "of Detection", "of Reflection", "of the Twins" ]; /** * @notice allow the owners to set the tokens used as pay-in for the weaponSmith * @param _token address of the new token */ function setToken(address _token) external onlyOwner { emit TokenUpdated(address(token), _token); token = IERC20(_token); } /** * @notice allow the owners to set the coefficient used for the upgrade boost * @param _boostCoefficient coefficient used to modify the upgrade amount */ function setBoostCoefficient(uint256 _boostCoefficient) external onlyOwner { emit BoostCoefficientUpdated(boostCoefficient, _boostCoefficient); boostCoefficient = _boostCoefficient; } /** * @notice allow the owners to open the weapon smith * @param _weaponSmithOpen bool to open or close the weapon smith */ function setWeaponSmithOpen(bool _weaponSmithOpen) external onlyOwner { emit WeaponSmithOpen(_weaponSmithOpen); weaponSmithOpen = _weaponSmithOpen; } /** * @notice allow the owners to sweep any erc20 tokens sent to the contract * @param _token address of the token to be swept * @param _amount amount to be swept */ function sweep(address _token, uint256 _amount) external onlyOwner { IERC20(_token).safeTransfer(msg.sender, _amount); } function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getAttack(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "Attack", weapons, 0); } function getDefense(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "Defense", weapons, 1); } function getDurability(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "Durability", weapons, 2); } function getWeight(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "Weight", weapons, 3); } function getMagic(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "Magic", weapons, 4); } /** * @notice score calculator * @param base the base amount taken from bases for the weapon class * @param tokenId id of the token being scored * @param output weapon class or description */ function getScore( uint256 base, uint256 tokenId, string memory output ) public pure returns (uint256) { uint256 rando = uint256( keccak256(abi.encodePacked(output, toString(tokenId))) ) % 100; uint256 score; if (rando <= 10) { score += 10; } else if (rando > 10 && rando <= 25) { score += 50; } else if (rando > 25 && rando <= 75) { score += 100; } else if (rando > 75 && rando <= 90) { score += 150; } else if (rando > 90 && rando <= 100) { score += 250; } score += base; return score; } /** * @notice the weaponSmith, where you can upgrade your weapons send in the compatible erc20 token to upgrade * @param tokenId id of the token being upgraded * @param amount amount of token to be sent to the weaponSmith to be upgraded */ function weaponSmith(uint256 tokenId, uint256 amount) external { require(weaponSmithOpen, "!open"); require(ownerOf(tokenId) == msg.sender, "!owner"); token.safeTransferFrom(msg.sender, address(this), amount); boosts[tokenId] += amount / boostCoefficient; emit Upgrade(tokenId, amount / boostCoefficient); } function pluck( uint256 tokenId, string memory keyPrefix, string[] memory sourceArray, uint256 baseIndex ) internal view returns (string memory) { // get the actual weapon class and greatness uint256 rand = random( string(abi.encodePacked("WEAPON", toString(tokenId))) ); string memory output = sourceArray[rand % sourceArray.length]; uint256 greatness = rand % 21; uint256 stat; if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Warhammer"))) ) { stat = getScore(bases[0][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Quarterstaff"))) ) { stat = getScore(bases[1][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Maul"))) ) { stat = getScore(bases[2][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Mace"))) ) { stat = getScore(bases[3][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Club"))) ) { stat = getScore(bases[4][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Katana"))) ) { stat = getScore(bases[5][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Falchion"))) ) { stat = getScore(bases[6][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Scimitar"))) ) { stat = getScore(bases[7][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Long Sword"))) ) { stat = getScore(bases[8][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Short Sword"))) ) { stat = getScore(bases[9][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Ghost Wand"))) ) { stat = getScore(bases[10][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Grave Wand"))) ) { stat = getScore(bases[11][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Bone Wand"))) ) { stat = getScore(bases[12][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Wand"))) ) { stat = getScore(bases[13][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Grimoire"))) ) { stat = getScore(bases[14][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Chronicle"))) ) { stat = getScore(bases[15][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Tome"))) ) { stat = getScore(bases[16][baseIndex], tokenId, keyPrefix); } else if ( keccak256(abi.encodePacked((output))) == keccak256(abi.encodePacked(("Book"))) ) { stat = getScore(bases[17][baseIndex], tokenId, keyPrefix); } if (baseIndex == 3) { output = string(abi.encodePacked(keyPrefix, ": ", toString(stat))); return output; } if (greatness > 14) { stat += getScore(0, tokenId, suffixes[rand % suffixes.length]); } if (greatness >= 19) { if (greatness == 19) { stat += getScore( 0, tokenId, string( abi.encodePacked( namePrefixes[rand % namePrefixes.length], nameSuffixes[rand % nameSuffixes.length] ) ) ); } else { stat += 300; } } stat += boosts[tokenId]; output = string(abi.encodePacked(keyPrefix, ": ", toString(stat))); return output; } function tokenURI(uint256 tokenId) public view override returns (string memory) { string[13] memory parts; parts[ 0 ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#7d5cff" /><text x="10" y="20" class="base">'; parts[1] = "Skills"; parts[2] = '</text><text x="10" y="40" class="base">'; parts[3] = getAttack(tokenId); parts[4] = '</text><text x="10" y="60" class="base">'; parts[5] = getDefense(tokenId); parts[6] = '</text><text x="10" y="80" class="base">'; parts[7] = getDurability(tokenId); parts[8] = '</text><text x="10" y="100" class="base">'; parts[9] = getWeight(tokenId); parts[10] = '</text><text x="10" y="120" class="base">'; parts[11] = getMagic(tokenId); parts[12] = "</text></svg>"; string memory output = string( abi.encodePacked( parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8] ) ); output = string( abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12]) ); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "Weapon #', toString(tokenId), '", "description": "The Weaponsmith is open. Cudlers will be able to mint their weapons and reveal their underlying powers - attack, defense, durability, weight and magic. Mint your weapon, reveal your stats.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}' ) ) ) ); output = string( abi.encodePacked("data:application/json;base64,", json) ); return output; } receive() external payable {} function withdraw(address to) public onlyOwner { address payable muse = payable( 0x6fBa46974b2b1bEfefA034e236A32e1f10C5A148 ); //multisig) (bool sentMuse, ) = muse.call{value: (address(this).balance / 10)}(""); require(sentMuse, "Failed to send Ether"); address payable _to = payable(to); //multisig (bool sent, ) = _to.call{value: address(this).balance}(""); require(sent, "Failed to send Ether"); } function claimForMooncat(uint256 tokenId) public nonReentrant { require(tokenId > 0 && tokenId < 25440, "Token ID invalid"); require(mooncat.ownerOf(tokenId) == msg.sender, "Not mooncat owner"); _safeMint(_msgSender(), tokenId); } function claim(uint256 tokenId) public payable nonReentrant { require(tokenId > 25440 && tokenId < 33000, "Token ID invalid"); require(msg.value >= 0.05 ether); _safeMint(_msgSender(), tokenId); } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 33000 && tokenId < 33200, "Token ID invalid"); _safeMint(owner(), tokenId); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } constructor() ERC721("Cudl Weapon", "CWEAPON") Ownable() { bases[0] = [800, 350, 850, 800, 0]; bases[1] = [200, 400, 350, 200, 0]; bases[2] = [400, 250, 550, 400, 0]; bases[3] = [500, 250, 550, 400, 0]; bases[4] = [300, 150, 400, 300, 0]; bases[5] = [950, 250, 700, 150, 0]; bases[6] = [650, 150, 400, 150, 0]; bases[7] = [700, 200, 500, 200, 0]; bases[8] = [750, 250, 600, 250, 0]; bases[9] = [400, 150, 400, 150, 0]; bases[10] = [50, 50, 550, 50, 800]; bases[11] = [50, 50, 400, 50, 700]; bases[12] = [50, 50, 350, 50, 650]; bases[13] = [50, 50, 400, 50, 600]; bases[14] = [50, 50, 50, 25, 850]; bases[15] = [15, 50, 50, 15, 0]; bases[16] = [100, 100, 50, 50, 0]; bases[17] = [50, 50, 50, 25, 0]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldBoostCoefficient","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBoostCoefficient","type":"uint256"}],"name":"BoostCoefficientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldToken","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"upgradeAmount","type":"uint256"}],"name":"Upgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"open","type":"bool"}],"name":"WeaponSmithOpen","type":"event"},{"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":"uint8","name":"","type":"uint8"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bases","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boosts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForMooncat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttack","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDefense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDurability","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMagic","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"output","type":"string"}],"name":"getScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeight","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"uint256","name":"_boostCoefficient","type":"uint256"}],"name":"setBoostCoefficient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_weaponSmithOpen","type":"bool"}],"name":"setWeaponSmithOpen","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":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"weaponSmith","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
600c80546001600160a01b03191673c3f733ca98e0dad0386979eb96fb1722a1a05e6917815560096102c0818152682bb0b93430b6b6b2b960b91b6102e05260809081526103009283526b28bab0b93a32b939ba30b33360a11b6103205260a09290925260046103408181526313585d5b60e21b6103605260c052610380818152634d61636560e01b6103a05260e0526103c08181526321b63ab160e11b6103e052610100526006610400908152654b6174616e6160d01b61042052610120526008610440818152672330b631b434b7b760c11b61046052610140526104808181526729b1b4b6b4ba30b960c11b6104a05261016052600a6104c081815269131bdb99c814dddbdc9960b21b6104e05261018052600b6105009081526a14da1bdc9d0814dddbdc9960aa1b610520526101a0526105408181526911da1bdcdd0815d85b9960b21b610560526101c0526105809081526911dc985d994815d85b9960b21b6105a0526101e0526105c083815268109bdb994815d85b9960ba1b6105e052610200526106008281526315d85b9960e21b6106205261022052610640908152674772696d6f69726560c01b6106605261024052610680918252684368726f6e69636c6560b81b6106a052610260919091526106c081815263546f6d6560e01b6106e0526102805261074060405261070090815263426f6f6b60e01b610720526102a0526200021490601290816200175b565b50604080516108e08101825260056108a082018181526441676f6e7960d81b6108c0840152825282518084018452600a8082526941706f63616c7970736560b01b60208381019190915280850192909252845180860186528181526920b936b0b3b2b23237b760b11b818401528486015284518086018652838152641099585cdd60da1b81840152606085015284518086018652600880825267084cad0cadadee8d60c31b82850152608086019190915285518087018752600680825265109b1a59da1d60d21b8286015260a08701919091528651808801885285815264109b1bdbd960da1b8186015260c0870152865180880188526007808252664272616d626c6560c81b8287015260e0880191909152875180890189526009808252684272696d73746f6e6560b81b828801526101008901919091528851808a018a5287815264109c9bdbd960da1b818801526101208901528851808a018a528281526621b0b93934b7b760c91b818801526101408901528851808a018a528181526843617461636c79736d60b81b818801526101608901528851808a018a52848152674368696d6572696360c01b818801526101808901528851808a018a5283815265436f7270736560d01b818801526101a08901528851808a018a528581526921b7b9393ab83a34b7b760b11b818801526101c08901528851808a018a52818152682230b6b730ba34b7b760b91b818801526101e08901528851808a018a5287815264088cac2e8d60db1b818801526102008901528851808a018a52878152642232b6b7b760d91b818801526102208901528851808a018a526004808252634469726560e01b828901526102408a01919091528951808b018b5284815265223930b3b7b760d11b818901526102608a01528951808b018b5288815264111c99585960da1b818901526102808a01528951808b018b5281815263446f6f6d60e01b818901526102a08a01528951808b018b52818152634475736b60e01b818901526102c08a01528951808b018b52888152644561676c6560d81b818901526102e08a01528951808b018b528581526722b6b83cb932b0b760c11b818901526103008a01528951808b018b52818152634661746560e01b818901526103208a01528951808b018b52600380825262466f6560e81b828a01526103408b01919091528a51808c018c528281526347616c6560e01b818a01526103608b01528a51808c018c528981526411da1bdd5b60da1b818a01526103808b01528a51808c018c5289815264476c6f6f6d60d81b818a01526103a08b01528a51808c018c528981526408ed8f2e0d60db1b818a01526103c08b01528a51808c018c5289815264476f6c656d60d81b818a01526103e08b01528a51808c018c52828152634772696d60e01b818a01526104008b01528a51808c018c52828152634861746560e01b818a01526104208b01528a51808c018c52898152644861766f6360d81b818a01526104408b01528a51808c018c52858152652437b737bab960d11b818a01526104608b01528a51808c018c52858152652437b93937b960d11b818a01526104808b01528a51808c018c52868152674879706e6f74696360c01b818a01526104a08b01528a51808c018c528581526525b930b5b2b760d11b818a01526104c08b01528a51808c018c5289815264098dec2e8d60db1b818a01526104e08b01528a51808c018c52838152684d61656c7374726f6d60b81b818a01526105008b01528a51808c018c5282815263135a5b9960e21b818a01526105208b01528a51808c018c52848152664d697261636c6560c81b818a01526105408b01528a51808c018c5285815265135bdc989a5960d21b818a01526105608b01528a51808c018c529586526727b13634bb34b7b760c11b868901526105808a01959095528951808b018b528281526813db9cdb185d59da1d60ba1b818901526105a08a01528951808b018b52818152632830b4b760e11b818901526105c08a01528951808b018b52600b81526a50616e64656d6f6e69756d60a81b818901526105e08a01528951808b018b52838152660a0d0decadcd2f60cb1b818901526106008a01528951808b018b5284815265506c6167756560d01b818901526106208a01528951808b018b52818152635261676560e01b818901526106408a01528951808b018b52838152665261707475726560c81b818901526106608a01528951808b018b528181526352756e6560e01b818901526106808a01528951808b018b528881526414dadd5b1b60da1b818901526106a08a01528951808b018b528581526214dbdb60ea1b818901526106c08a01528951808b018b529081526314dbdd5b60e21b818801526106e08901528851808a018a5283815265536f72726f7760d01b818801526107008901528851808a018a528381526514dc1a5c9a5d60d21b818801526107208901528851808a018a528781526453746f726d60d81b818801526107408901528851808a018a528281526615195b5c195cdd60ca1b818801526107608901528851808a018a5282815266151bdc9b595b9d60ca1b818801526107808901528851808a018a529081526856656e6765616e636560b81b818701526107a08801528751808901895281815266566963746f727960c81b818701526107c088015287518089018952868152642b34b832b960d91b818701526107e088015287518089018952918252650acdee4e8caf60d31b828601526108008701919091528651808801885291825262576f6560e81b8285015261082086019190915285518087018752938452640aee4c2e8d60db1b8484015261084085019390935284518086018652928352664c69676874277360c81b838301526108608401929092528351808501909452908352695368696d6d6572696e6760b01b9083015261088081019190915262000a7e906013906045620017bf565b506040805161028081018252600461024082018181526342616e6560e01b61026084015282528251808401845281815263149bdbdd60e21b6020828101919091528084019190915283518085018552828152634269746560e01b81830152838501528351808501855282815263536f6e6760e01b81830152606084015283518085018552828152632937b0b960e11b81830152608084015283518085018552600580825264047726173760dc1b8284015260a085019190915284518086018652600a815269125b9cdd1c9d5b595b9d60b21b8184015260c08501528451808601865283815263476c6f7760e01b8184015260e0850152845180860186526006808252652132b73232b960d11b828501526101008601919091528551808701875290815265536861646f7760d01b818401526101208501528451808601865260078152662bb434b9b832b960c91b81840152610140850152845180860186528181526414da1bdd5d60da1b81840152610160850152845180860186529081526411dc9bdddb60da1b8183015261018084015283518085018552828152632a32b0b960e11b818301526101a084015283518085018552828152635065616b60e01b818301526101c08401528351808501855282815263466f726d60e01b818301526101e084015283518085018552600381526229bab760e91b8183015261020084015283518085019094529083526326b7b7b760e11b9083015261022081019190915262000caf9060149060126200175b565b506040805161024081018252600861020082018181526737b3102837bbb2b960c11b6102208401528252825180840184526009808252686f66204769616e747360b81b6020838101919091528085019290925284518086018652908152686f6620546974616e7360b81b818301528385015283518085018552828152671bd98814dada5b1b60c21b81830152606084015283518085018552600d8082526c37b3102832b93332b1ba34b7b760991b828401526080850191909152845180860186528181526c6f66204272696c6c69616e636560981b8184015260a08501528451808601865260108082526f1bd988115b9b1a59da1d195b9b595b9d60821b8285015260c0860191909152855180870187528281526c37b310283937ba32b1ba34b7b760991b8185015260e0860152855180870187529384526737b31020b733b2b960c11b84840152610100850193909352845180860186526007808252666f66205261676560c81b8285015261012086019190915285518087018752908152666f66204675727960c81b8184015261014085015284518086018652600a808252691bd988159a5d1c9a5bdb60b21b8285015261016086019190915285518087018752908152690decc40e8d0ca408cdef60b31b8184015261018085015284518086018652600c8082526b37b3102232ba32b1ba34b7b760a11b828501526101a0860191909152855180870187529182526c37b3102932b33632b1ba34b7b760991b828401526101c0850191909152845180860190955284526b6f6620746865205477696e7360a01b908401526101e082019290925262000f13916015919062001811565b5034801562000f2157600080fd5b50604080518082018252600b81526a21bab236102bb2b0b837b760a91b60208083019182528351808501909452600784526621aba2a0a827a760c91b90840152815191929162000f749160009162001863565b50805162000f8a90600190602084019062001863565b50506001600a555062000f9d3362001709565b6040805160a08101825261032080825261015e6020808401919091526103529383019390935260608201526000608082018190528052600f90915262001007907ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec375906005620018ee565b506040805160a08101825260c880825261019060208084019190915261015e93830193909352606082015260006080820181905260019052600f90915262001073907f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f906005620018ee565b506040805160a08101825261019080825260fa60208084019190915261022693830193909352606082015260006080820181905260029052600f909152620010df907fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead906005620018ee565b506040805160a0810182526101f4815260fa60208083019190915261022692820192909252610190606082015260006080820181905260039052600f9091526200114d907f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc8296828906005620018ee565b506040805160a08101825261012c808252609660208084019190915261019093830193909352606082015260006080820181905260049052600f909152620011b9907f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd906005620018ee565b506040805160a0810182526103b6815260fa6020808301919091526102bc9282019290925260966060820152600060808201819052600590819052600f90925262001227917f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f36162049190620018ee565b506040805160a08101825261028a81526096602080830182905261019093830193909352606082015260006080820181905260069052600f90915262001291907fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff618906005620018ee565b506040805160a0810182526102bc815260c860208083018290526101f493830193909352606082015260006080820181905260079052600f909152620012fb907f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb40254906005620018ee565b506040805160a0810182526102ee815260fa602080830182905261025893830193909352606082015260006080820181905260089052600f90915262001365907f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb68906005620018ee565b506040805160a0810182526101908082526096602080840182905293830191909152606082015260006080820181905260099052600f909152620013cd907f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc76039906005620018ee565b506040805160a081018252603280825260208083018290526102269383019390935260608201526103206080820152600a600052600f90915262001435907fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad906005620018ee565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102bc6080820152600b600052600f9091526200149d907f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c5906005620018ee565b506040805160a0810182526032808252602080830182905261015e93830193909352606082015261028a6080820152600c600052600f90915262001505907faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b7729906005620018ee565b506040805160a081018252603280825260208083018290526101909383019390935260608201526102586080820152600d600052600f9091526200156d907fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc5906005620018ee565b506040805160a0810182526032808252602080830182905292820152601960608201526103526080820152600e600052600f909152620015d1907f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f906005620018ee565b506040805160a081018252600f80825260326020808401829052938301526060820181905260006080830181905281905290915262001634907f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb090600562001986565b506040805160a08101825260648082526020808301919091526032928201839052606082019290925260006080820181905260109052600f9091526200169e907f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15990600562001986565b506040805160a08101825260328082526020808301829052928201526019606082015260006080820181905260119052600f90915262001702907f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe90600562001986565b5062001a98565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200179c91849160209091019062001863565b50916020019190600101906200177c565b50620017bb929150620019de565b5090565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200180091849160209091019062001863565b5091602001919060010190620017e0565b828054828255906000526020600020908101928215620017ad579160200282015b82811115620017ad57825180516200185291849160209091019062001863565b509160200191906001019062001832565b828054620018719062001a5b565b90600052602060002090601f016020900481019282620018955760008555620018e0565b82601f10620018b057805160ff1916838001178555620018e0565b82800160010185558215620018e0579182015b82811115620018e0578251825591602001919060010190620018c3565b50620017bb929150620019ff565b600183019183908215620018e05791602002820160005b838211156200194757835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030262001905565b8015620019775782816101000a81549061ffff021916905560020160208160010104928301926001030262001947565b5050620017bb929150620019ff565b600183019183908215620018e05791602002820160005b838211156200194757835183826101000a81548161ffff021916908360ff16021790555092602001926002016020816001010492830192600103026200199d565b80821115620017bb576000620019f5828262001a16565b50600101620019de565b5b80821115620017bb576000815560010162001a00565b50805462001a249062001a5b565b6000825580601f1062001a38575062001a58565b601f01602090049060005260206000209081019062001a589190620019ff565b50565b60028104600182168062001a7057607f821691505b6020821081141562001a9257634e487b7160e01b600052602260045260246000fd5b50919050565b6146e58062001aa86000396000f3fe60806040526004361061021e5760003560e01c80635bc0a62311610123578063b88d4fde116100ab578063d851fdfd1161006f578063d851fdfd14610655578063e985e9c514610675578063eb22daa3146106be578063f2fde38b146106de578063fc0c546a146106fe57610225565b8063b88d4fde146105b5578063c87b56dd146105d5578063ca0056e0146105f5578063cff840f014610615578063d7d0a45a1461063557610225565b8063715018a6116100f2578063715018a61461052d5780638da5cb5b14610542578063951ca9321461056057806395d89b4114610580578063a22cb4651461059557610225565b80635bc0a623146104ad5780636352211e146104cd5780636ea056a9146104ed57806370a082311461050d57610225565b8063379607f5116101a65780634afd82e7116101755780634afd82e7146104005780634f6ccce71461042d578063509d29271461044d57806351cff8d91461046d5780635466d84e1461048d57610225565b8063379607f51461038d57806341bc680f146103a057806342842e0e146103c0578063434f48c4146103e057610225565b8063144fa6d7116101ed578063144fa6d7146102db57806318160ddd146102fb57806323b872dd1461031a5780632914f8e91461033a5780632f745c591461036d57610225565b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b957610225565b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004613c2f565b61071e565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461074b565b60405161025691906141e7565b34801561028d57600080fd5b506102a161029c366004613c67565b6107dd565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004613bcc565b610877565b005b3480156102e757600080fd5b506102d96102f6366004613a72565b61098d565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b506102d9610335366004613ae2565b610a20565b34801561034657600080fd5b5061035a610355366004613d01565b610a51565b60405161ffff9091168152602001610256565b34801561037957600080fd5b5061030c610388366004613bcc565b610a8e565b6102d961039b366004613c67565b610b24565b3480156103ac57600080fd5b506102d96103bb366004613c7f565b610ba1565b3480156103cc57600080fd5b506102d96103db366004613ae2565b610cb9565b3480156103ec57600080fd5b506102d96103fb366004613c67565b610cd4565b34801561040c57600080fd5b5061030c61041b366004613c67565b600e6020526000908152604090205481565b34801561043957600080fd5b5061030c610448366004613c67565b610d69565b34801561045957600080fd5b50610274610468366004613c67565b610e0a565b34801561047957600080fd5b506102d9610488366004613a72565b610f0c565b34801561049957600080fd5b506102d96104a8366004613c67565b611083565b3480156104b957600080fd5b506102746104c8366004613c67565b61119d565b3480156104d957600080fd5b506102a16104e8366004613c67565b61129a565b3480156104f957600080fd5b506102d9610508366004613bcc565b611311565b34801561051957600080fd5b5061030c610528366004613a72565b611353565b34801561053957600080fd5b506102d96113da565b34801561054e57600080fd5b50600b546001600160a01b03166102a1565b34801561056c57600080fd5b506102d961057b366004613c67565b611410565b34801561058c57600080fd5b5061027461147b565b3480156105a157600080fd5b506102d96105b0366004613b9f565b61148a565b3480156105c157600080fd5b506102d96105d0366004613b22565b61155c565b3480156105e157600080fd5b506102746105f0366004613c67565b611594565b34801561060157600080fd5b506102d9610610366004613bf7565b6117de565b34801561062157600080fd5b50610274610630366004613c67565b611850565b34801561064157600080fd5b5061030c610650366004613ca0565b61194e565b34801561066157600080fd5b50610274610670366004613c67565b611a4c565b34801561068157600080fd5b5061024a610690366004613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b506102746106d9366004613c67565b611b4a565b3480156106ea57600080fd5b506102d96106f9366004613a72565b611c49565b34801561070a57600080fd5b50600d546102a1906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610743575061074382611ce4565b90505b919050565b60606000805461075a906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610786906143c1565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108828261129a565b9050806001600160a01b0316836001600160a01b031614156108f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610852565b336001600160a01b038216148061090c575061090c8133610690565b61097e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610852565b6109888383611d34565b505050565b600b546001600160a01b031633146109b75760405162461bcd60e51b81526004016108529061424c565b600d54604080516001600160a01b03928316815291831660208301527f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610a2a3382611da2565b610a465760405162461bcd60e51b8152600401610852906142ab565b610988838383611e99565b600f6020528160005260406000208160058110610a6d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b6000610a9983611353565b8210610afb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610852565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610b475760405162461bcd60e51b8152600401610852906142fc565b6002600a5561636081118015610b5e57506180e881105b610b7a5760405162461bcd60e51b815260040161085290614281565b66b1a2bc2ec50000341015610b8e57600080fd5b610b99335b82612044565b506001600a55565b60115460ff16610bdb5760405162461bcd60e51b815260206004820152600560248201526410b7b832b760d91b6044820152606401610852565b33610be58361129a565b6001600160a01b031614610c245760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610852565b600d54610c3c906001600160a01b031633308461205e565b601054610c49908261434b565b6000838152600e602052604081208054909190610c67908490614333565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e9908390610c9d908461434b565b6040805192835260208301919091520160405180910390a15050565b6109888383836040518060200160405280600081525061155c565b6002600a541415610cf75760405162461bcd60e51b8152600401610852906142fc565b6002600a55600b546001600160a01b03163314610d265760405162461bcd60e51b81526004016108529061424c565b6180e881118015610d3857506181b081105b610d545760405162461bcd60e51b815260040161085290614281565b610b99610b93600b546001600160a01b031690565b6000610d7460085490565b8210610dd75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610852565b60088281548110610df857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6060610743826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f01578382906000526020600020018054610e74906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea0906143c1565b8015610eed5780601f10610ec257610100808354040283529160200191610eed565b820191906000526020600020905b815481529060010190602001808311610ed057829003601f168201915b505050505081526020019060010190610e55565b5050505060026120c9565b600b546001600160a01b03163314610f365760405162461bcd60e51b81526004016108529061424c565b736fba46974b2b1befefa034e236a32e1f10c5a148600081610f59600a4761434b565b604051600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b5050905080610fe25760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b60405183906000906001600160a01b0383169047908381818185875af1925050503d806000811461102f576040519150601f19603f3d011682016040523d82523d6000602084013e611034565b606091505b505090508061107c5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b5050505050565b6002600a5414156110a65760405162461bcd60e51b8152600401610852906142fc565b6002600a5580158015906110bb575061636081105b6110d75760405162461bcd60e51b815260040161085290614281565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613a8e565b6001600160a01b031614610b8e5760405162461bcd60e51b81526020600482015260116024820152702737ba1036b7b7b731b0ba1037bbb732b960791b6044820152606401610852565b606061074382604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561128f578382906000526020600020018054611202906143c1565b80601f016020809104026020016040519081016040528092919081815260200182805461122e906143c1565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200190600101906111e3565b5050505060046120c9565b6000818152600260205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610852565b600b546001600160a01b0316331461133b5760405162461bcd60e51b81526004016108529061424c565b61134f6001600160a01b0383163383612f7d565b5050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610852565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114045760405162461bcd60e51b81526004016108529061424c565b61140e6000612fad565b565b600b546001600160a01b0316331461143a5760405162461bcd60e51b81526004016108529061424c565b60105460408051918252602082018390527f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb63910160405180910390a1601055565b60606001805461075a906143c1565b6001600160a01b0382163314156114e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610852565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611550911515815260200190565b60405180910390a35050565b6115663383611da2565b6115825760405162461bcd60e51b8152600401610852906142ab565b61158e84848484612fff565b50505050565b606061159e6139d4565b60405180610120016040528060ff815260200161454960ff91398152604080518082019091526006815265536b696c6c7360d01b6020820152816001602002018190525060405180606001604052806028815260200161468860289139604082015261160983611850565b60608083019190915260408051918201905260288082526144a76020830139608082015261163683611b4a565b60a0820152604080516060810190915260288082526144f8602083013960c082015261166183610e0a565b60e082015260408051606081019091526029808252614520602083013961010082015261168d83611a4c565b610120820152604080516060810190915260298082526144cf60208301396101408201526116ba8361119d565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a61172a9a909101613e9d565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061176594869490602001613e32565b604051602081830303815290604052905060006117b261178486613032565b61178d8461314d565b60405160200161179e929190613fde565b60405160208183030381529060405261314d565b9050806040516020016117c59190614165565b60408051808303601f1901815291905295945050505050565b600b546001600160a01b031633146118085760405162461bcd60e51b81526004016108529061424c565b60405181151581527feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea29060200160405180910390a16011805460ff1916911515919091179055565b6060610743826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156119435783829060005260206000200180546118b6906143c1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e2906143c1565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505081526020019060010190611897565b5050505060006120c9565b60008060648361195d86613032565b60405160200161196e929190613e03565b6040516020818303038152906040528051906020012060001c6119919190614417565b90506000600a82116119af576119a8600a82614333565b9050611a36565b600a821180156119c0575060198211155b156119d0576119a8603282614333565b6019821180156119e15750604b8211155b156119f1576119a8606482614333565b604b82118015611a025750605a8211155b15611a12576119a8609682614333565b605a82118015611a23575060648211155b15611a3657611a3360fa82614333565b90505b611a408682614333565b925050505b9392505050565b6060610743826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611b3f578382906000526020600020018054611ab2906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906143c1565b8015611b2b5780601f10611b0057610100808354040283529160200191611b2b565b820191906000526020600020905b815481529060010190602001808311611b0e57829003601f168201915b505050505081526020019060010190611a93565b5050505060036120c9565b60606107438260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611c3e578382906000526020600020018054611bb1906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdd906143c1565b8015611c2a5780601f10611bff57610100808354040283529160200191611c2a565b820191906000526020600020905b815481529060010190602001808311611c0d57829003601f168201915b505050505081526020019060010190611b92565b5050505060016120c9565b600b546001600160a01b03163314611c735760405162461bcd60e51b81526004016108529061424c565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610852565b611ce181612fad565b50565b60006001600160e01b031982166380ac58cd60e01b1480611d1557506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b0319831614610743565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d698261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e1b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610852565b6000611e268361129a565b9050806001600160a01b0316846001600160a01b03161480611e615750836001600160a01b0316611e56846107dd565b6001600160a01b0316145b80611e9157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eac8261129a565b6001600160a01b031614611f145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610852565b6001600160a01b038216611f765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610852565b611f818383836132c4565b611f8c600082611d34565b6001600160a01b0383166000908152600360205260408120805460019290611fb590849061437e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe3908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61134f828260405180602001604052806000815250613381565b6040516001600160a01b038085166024830152831660448201526064810182905261158e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526133b4565b606060006120fd6120d987613032565b6040516020016120e99190613fb0565b604051602081830303815290604052613486565b905060008485518361210f9190614417565b8151811061212d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006015836121469190614417565b9050600060405160200161216990682bb0b93430b6b6b2b960b91b815260090190565b60405160208183030381529060405280519060200120836040516020016121909190613de7565b6040516020818303038152906040528051906020012014156122245760008052600f60205261221d7ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37587600581106121f857634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a61194e565b9050612d36565b6040516b28bab0b93a32b939ba30b33360a11b6020820152602c0160405160208183030381529060405280519060200120836040516020016122669190613de7565b6040516020818303038152906040528051906020012014156122cf576001600052600f60205261221d7f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516313585d5b60e21b602082015260240160405160208183030381529060405280519060200120836040516020016123099190613de7565b604051602081830303815290604052805190602001201415612372576002600052600f60205261221d7fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051634d61636560e01b602082015260240160405160208183030381529060405280519060200120836040516020016123ac9190613de7565b604051602081830303815290604052805190602001201415612415576003600052600f60205261221d7f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516321b63ab160e11b6020820152602401604051602081830303815290604052805190602001208360405160200161244f9190613de7565b6040516020818303038152906040528051906020012014156124b8576004600052600f60205261221d7f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051654b6174616e6160d01b602082015260260160405160208183030381529060405280519060200120836040516020016124f49190613de7565b6040516020818303038152906040528051906020012014156125605760056000819052600f60205261221d907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620490889081106121f857634e487b7160e01b600052603260045260246000fd5b604051672330b631b434b7b760c11b6020820152602801604051602081830303815290604052805190602001208360405160200161259e9190613de7565b604051602081830303815290604052805190602001201415612607576006600052600f60205261221d7fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516729b1b4b6b4ba30b960c11b602082015260280160405160208183030381529060405280519060200120836040516020016126459190613de7565b6040516020818303038152906040528051906020012014156126ae576007600052600f60205261221d7f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025487600581106121f857634e487b7160e01b600052603260045260246000fd5b60405169131bdb99c814dddbdc9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016126ee9190613de7565b604051602081830303815290604052805190602001201415612757576008600052600f60205261221d7f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb6887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516a14da1bdc9d0814dddbdc9960aa1b6020820152602b0160405160208183030381529060405280519060200120836040516020016127989190613de7565b604051602081830303815290604052805190602001201415612801576009600052600f60205261221d7f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc7603987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911da1bdcdd0815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128419190613de7565b6040516020818303038152906040528051906020012014156128aa57600a600052600f60205261221d7fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911dc985d994815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128ea9190613de7565b60405160208183030381529060405280519060200120141561295357600b600052600f60205261221d7f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c587600581106121f857634e487b7160e01b600052603260045260246000fd5b60405168109bdb994815d85b9960ba1b602082015260290160405160208183030381529060405280519060200120836040516020016129929190613de7565b6040516020818303038152906040528051906020012014156129fb57600c600052600f60205261221d7faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b772987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516315d85b9960e21b60208201526024016040516020818303038152906040528051906020012083604051602001612a359190613de7565b604051602081830303815290604052805190602001201415612a9e57600d600052600f60205261221d7fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc587600581106121f857634e487b7160e01b600052603260045260246000fd5b604051674772696d6f69726560c01b60208201526028016040516020818303038152906040528051906020012083604051602001612adc9190613de7565b604051602081830303815290604052805190602001201415612b4557600e600052600f60205261221d7f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051684368726f6e69636c6560b81b60208201526029016040516020818303038152906040528051906020012083604051602001612b849190613de7565b604051602081830303815290604052805190602001201415612bed57600f600081905260205261221d7f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb087600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163546f6d6560e01b60208201526024016040516020818303038152906040528051906020012083604051602001612c279190613de7565b604051602081830303815290604052805190602001201415612c90576010600052600f60205261221d7f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15987600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163426f6f6b60e01b60208201526024016040516020818303038152906040528051906020012083604051602001612cca9190613de7565b604051602081830303815290604052805190602001201415612d36576011600052600f602052612d337f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe87600581106121f857634e487b7160e01b600052603260045260246000fd5b90505b8560031415612d765787612d4982613032565b604051602001612d5a929190613f5e565b60408051601f198184030181529190529450611e919350505050565b600e821115612e5a57612e4d60008a6015808054905088612d979190614417565b81548110612db557634e487b7160e01b600052603260045260246000fd5b906000526020600020018054612dca906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612df6906143c1565b8015612e435780601f10612e1857610100808354040283529160200191612e43565b820191906000526020600020905b815481529060010190602001808311612e2657829003601f168201915b505050505061194e565b612e579082614333565b90505b60138210612f2a578160131415612f1b57612f0a60008a6013808054905088612e839190614417565b81548110612ea157634e487b7160e01b600052603260045260246000fd5b906000526020600020016014808054905089612ebd9190614417565b81548110612edb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001612ef6929190613f9b565b60405160208183030381529060405261194e565b612f149082614333565b9050612f2a565b612f2761012c82614333565b90505b6000898152600e6020526040902054612f439082614333565b905087612f4f82613032565b604051602001612f60929190613f5e565b60408051808303601f190181529190529998505050505050505050565b6040516001600160a01b03831660248201526044810182905261098890849063a9059cbb60e01b90606401612092565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61300a848484611e99565b613016848484846134b7565b61158e5760405162461bcd60e51b8152600401610852906141fa565b60608161305757506040805180820190915260018152600360fc1b6020820152610746565b8160005b8115613081578061306b816143fc565b915061307a9050600a8361434b565b915061305b565b60008167ffffffffffffffff8111156130aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130d4576020820181803683370190505b5090505b8415611e91576130e960018361437e565b91506130f6600a86614417565b613101906030614333565b60f81b81838151811061312457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613146600a8661434b565b94506130d8565b606081516000141561316e5750604080516020810190915260008152610746565b6000604051806060016040528060408152602001614648604091399050600060038451600261319d9190614333565b6131a7919061434b565b6131b290600461435f565b905060006131c1826020614333565b67ffffffffffffffff8111156131e757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613211576020820181803683370190505b509050818152600183018586518101602084015b8183101561327f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613225565b60038951066001811461329957600281146132aa576132b6565b613d3d60f01b6001198301526132b6565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b03831661331f5761331a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613342565b816001600160a01b0316836001600160a01b0316146133425761334283826135c1565b6001600160a01b03821661335e576133598161365e565b610988565b826001600160a01b0316826001600160a01b031614610988576109888282613737565b61338b838361377b565b61339860008484846134b7565b6109885760405162461bcd60e51b8152600401610852906141fa565b6000613409826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c99092919063ffffffff16565b80519091501561098857808060200190518101906134279190613c13565b6109885760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610852565b6000816040516020016134999190613de7565b60408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b156135b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134fb9033908990889088906004016141aa565b602060405180830381600087803b15801561351557600080fd5b505af1925050508015613545575060408051601f3d908101601f1916820190925261354291810190613c4b565b60015b61359f573d808015613573576040519150601f19603f3d011682016040523d82523d6000602084013e613578565b606091505b5080516135975760405162461bcd60e51b8152600401610852906141fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e91565b506001611e91565b600060016135ce84611353565b6135d8919061437e565b60008381526007602052604090205490915080821461362b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906136709060019061437e565b600083815260096020526040812054600880549394509092849081106136a657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106136d557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061371b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374283611353565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166137d15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610852565b6000818152600260205260409020546001600160a01b0316156138365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610852565b613842600083836132c4565b6001600160a01b038216600090815260036020526040812080546001929061386b908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611e91848460008585843b6139225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b600080866001600160a01b0316858760405161393e9190613de7565b60006040518083038185875af1925050503d806000811461397b576040519150601f19603f3d011682016040523d82523d6000602084013e613980565b606091505b509150915061399082828661399b565b979650505050505050565b606083156139aa575081611a45565b8251156139ba5782518084602001fd5b8160405162461bcd60e51b815260040161085291906141e7565b604051806101a00160405280600d905b60608152602001906001900390816139e45790505090565b600067ffffffffffffffff80841115613a1757613a17614457565b604051601f8501601f19908116603f01168101908282118183101715613a3f57613a3f614457565b81604052809350858152868686011115613a5857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a83578081fd5b8135611a458161446d565b600060208284031215613a9f578081fd5b8151611a458161446d565b60008060408385031215613abc578081fd5b8235613ac78161446d565b91506020830135613ad78161446d565b809150509250929050565b600080600060608486031215613af6578081fd5b8335613b018161446d565b92506020840135613b118161446d565b929592945050506040919091013590565b60008060008060808587031215613b37578081fd5b8435613b428161446d565b93506020850135613b528161446d565b925060408501359150606085013567ffffffffffffffff811115613b74578182fd5b8501601f81018713613b84578182fd5b613b93878235602084016139fc565b91505092959194509250565b60008060408385031215613bb1578182fd5b8235613bbc8161446d565b91506020830135613ad781614482565b60008060408385031215613bde578182fd5b8235613be98161446d565b946020939093013593505050565b600060208284031215613c08578081fd5b8135611a4581614482565b600060208284031215613c24578081fd5b8151611a4581614482565b600060208284031215613c40578081fd5b8135611a4581614490565b600060208284031215613c5c578081fd5b8151611a4581614490565b600060208284031215613c78578081fd5b5035919050565b60008060408385031215613c91578182fd5b50508035926020909101359150565b600080600060608486031215613cb4578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613cd8578182fd5b8401601f81018613613ce8578182fd5b613cf7868235602084016139fc565b9150509250925092565b60008060408385031215613d13578182fd5b823560ff81168114613be9578283fd5b60008151808452613d3b816020860160208601614395565b601f01601f19169290920160200192915050565b805460009060028104600180831680613d6957607f831692505b6020808410821415613d8957634e487b7160e01b86526022600452602486fd5b818015613d9d5760018114613dae57613ddb565b60ff19861689528489019650613ddb565b60008881526020902060005b86811015613dd35781548b820152908501908301613dba565b505084890196505b50505050505092915050565b60008251613df9818460208701614395565b9190910192915050565b60008351613e15818460208801614395565b835190830190613e29818360208801614395565b01949350505050565b60008651613e44818460208b01614395565b865190830190613e58818360208b01614395565b8651910190613e6b818360208a01614395565b8551910190613e7e818360208901614395565b8451910190613e91818360208801614395565b01979650505050505050565b60008a51613eaf818460208f01614395565b8a51613ec18183860160208f01614395565b8a519184010190613ed6818360208e01614395565b8951613ee88183850160208e01614395565b8951929091010190613efe818360208c01614395565b8751613f108183850160208c01614395565b8751929091010190613f26818360208a01614395565b8551613f388183850160208a01614395565b8551929091010190613f4e818360208801614395565b019b9a5050505050505050505050565b60008351613f70818460208801614395565b6101d160f51b9083019081528351613f8f816002840160208801614395565b01600201949350505050565b6000611e91613faa8386613d4f565b84613d4f565b6000652ba2a0a827a760d11b82528251613fd1816006850160208701614395565b9190910160060192915050565b717b226e616d65223a2022576561706f6e202360701b8152825160009061400c816012850160208801614395565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204375646c6572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f2820152610108845161414f8183850160208901614395565b613990828285010161227d60f01b815260020190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161419d81601d850160208701614395565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141dd90830184613d23565b9695505050505050565b600060208252611a456020830184613d23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156143465761434661442b565b500190565b60008261435a5761435a614441565b500490565b60008160001904831182151516156143795761437961442b565b500290565b6000828210156143905761439061442b565b500390565b60005b838110156143b0578181015183820152602001614398565b8381111561158e5750506000910152565b6002810460018216806143d557607f821691505b602082108114156143f657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144105761441061442b565b5060010190565b60008261442657614426614441565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ce157600080fd5b8015158114611ce157600080fd5b6001600160e01b031981168114611ce157600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222337643563666622202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212204419559faf1c90ec61da164f0594571986bb9a36246096da102771d14e5cf33b64736f6c63430008020033
Deployed Bytecode
0x60806040526004361061021e5760003560e01c80635bc0a62311610123578063b88d4fde116100ab578063d851fdfd1161006f578063d851fdfd14610655578063e985e9c514610675578063eb22daa3146106be578063f2fde38b146106de578063fc0c546a146106fe57610225565b8063b88d4fde146105b5578063c87b56dd146105d5578063ca0056e0146105f5578063cff840f014610615578063d7d0a45a1461063557610225565b8063715018a6116100f2578063715018a61461052d5780638da5cb5b14610542578063951ca9321461056057806395d89b4114610580578063a22cb4651461059557610225565b80635bc0a623146104ad5780636352211e146104cd5780636ea056a9146104ed57806370a082311461050d57610225565b8063379607f5116101a65780634afd82e7116101755780634afd82e7146104005780634f6ccce71461042d578063509d29271461044d57806351cff8d91461046d5780635466d84e1461048d57610225565b8063379607f51461038d57806341bc680f146103a057806342842e0e146103c0578063434f48c4146103e057610225565b8063144fa6d7116101ed578063144fa6d7146102db57806318160ddd146102fb57806323b872dd1461031a5780632914f8e91461033a5780632f745c591461036d57610225565b806301ffc9a71461022a57806306fdde031461025f578063081812fc14610281578063095ea7b3146102b957610225565b3661022557005b600080fd5b34801561023657600080fd5b5061024a610245366004613c2f565b61071e565b60405190151581526020015b60405180910390f35b34801561026b57600080fd5b5061027461074b565b60405161025691906141e7565b34801561028d57600080fd5b506102a161029c366004613c67565b6107dd565b6040516001600160a01b039091168152602001610256565b3480156102c557600080fd5b506102d96102d4366004613bcc565b610877565b005b3480156102e757600080fd5b506102d96102f6366004613a72565b61098d565b34801561030757600080fd5b506008545b604051908152602001610256565b34801561032657600080fd5b506102d9610335366004613ae2565b610a20565b34801561034657600080fd5b5061035a610355366004613d01565b610a51565b60405161ffff9091168152602001610256565b34801561037957600080fd5b5061030c610388366004613bcc565b610a8e565b6102d961039b366004613c67565b610b24565b3480156103ac57600080fd5b506102d96103bb366004613c7f565b610ba1565b3480156103cc57600080fd5b506102d96103db366004613ae2565b610cb9565b3480156103ec57600080fd5b506102d96103fb366004613c67565b610cd4565b34801561040c57600080fd5b5061030c61041b366004613c67565b600e6020526000908152604090205481565b34801561043957600080fd5b5061030c610448366004613c67565b610d69565b34801561045957600080fd5b50610274610468366004613c67565b610e0a565b34801561047957600080fd5b506102d9610488366004613a72565b610f0c565b34801561049957600080fd5b506102d96104a8366004613c67565b611083565b3480156104b957600080fd5b506102746104c8366004613c67565b61119d565b3480156104d957600080fd5b506102a16104e8366004613c67565b61129a565b3480156104f957600080fd5b506102d9610508366004613bcc565b611311565b34801561051957600080fd5b5061030c610528366004613a72565b611353565b34801561053957600080fd5b506102d96113da565b34801561054e57600080fd5b50600b546001600160a01b03166102a1565b34801561056c57600080fd5b506102d961057b366004613c67565b611410565b34801561058c57600080fd5b5061027461147b565b3480156105a157600080fd5b506102d96105b0366004613b9f565b61148a565b3480156105c157600080fd5b506102d96105d0366004613b22565b61155c565b3480156105e157600080fd5b506102746105f0366004613c67565b611594565b34801561060157600080fd5b506102d9610610366004613bf7565b6117de565b34801561062157600080fd5b50610274610630366004613c67565b611850565b34801561064157600080fd5b5061030c610650366004613ca0565b61194e565b34801561066157600080fd5b50610274610670366004613c67565b611a4c565b34801561068157600080fd5b5061024a610690366004613aaa565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106ca57600080fd5b506102746106d9366004613c67565b611b4a565b3480156106ea57600080fd5b506102d96106f9366004613a72565b611c49565b34801561070a57600080fd5b50600d546102a1906001600160a01b031681565b60006001600160e01b0319821663780e9d6360e01b1480610743575061074382611ce4565b90505b919050565b60606000805461075a906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610786906143c1565b80156107d35780601f106107a8576101008083540402835291602001916107d3565b820191906000526020600020905b8154815290600101906020018083116107b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661085b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108828261129a565b9050806001600160a01b0316836001600160a01b031614156108f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610852565b336001600160a01b038216148061090c575061090c8133610690565b61097e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610852565b6109888383611d34565b505050565b600b546001600160a01b031633146109b75760405162461bcd60e51b81526004016108529061424c565b600d54604080516001600160a01b03928316815291831660208301527f0b1186973f810894b87ab0bfbee422fddcaad21b46dc705a561451bbb6bac117910160405180910390a1600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610a2a3382611da2565b610a465760405162461bcd60e51b8152600401610852906142ab565b610988838383611e99565b600f6020528160005260406000208160058110610a6d57600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b6000610a9983611353565b8210610afb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610852565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6002600a541415610b475760405162461bcd60e51b8152600401610852906142fc565b6002600a5561636081118015610b5e57506180e881105b610b7a5760405162461bcd60e51b815260040161085290614281565b66b1a2bc2ec50000341015610b8e57600080fd5b610b99335b82612044565b506001600a55565b60115460ff16610bdb5760405162461bcd60e51b815260206004820152600560248201526410b7b832b760d91b6044820152606401610852565b33610be58361129a565b6001600160a01b031614610c245760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606401610852565b600d54610c3c906001600160a01b031633308461205e565b601054610c49908261434b565b6000838152600e602052604081208054909190610c67908490614333565b90915550506010547feb0ebb51128928d7b1a6419c52128a9319bfcb55f0adafea75afbf75f9f2f3e9908390610c9d908461434b565b6040805192835260208301919091520160405180910390a15050565b6109888383836040518060200160405280600081525061155c565b6002600a541415610cf75760405162461bcd60e51b8152600401610852906142fc565b6002600a55600b546001600160a01b03163314610d265760405162461bcd60e51b81526004016108529061424c565b6180e881118015610d3857506181b081105b610d545760405162461bcd60e51b815260040161085290614281565b610b99610b93600b546001600160a01b031690565b6000610d7460085490565b8210610dd75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610852565b60088281548110610df857634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6060610743826040518060400160405280600a8152602001694475726162696c69747960b01b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015610f01578382906000526020600020018054610e74906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea0906143c1565b8015610eed5780601f10610ec257610100808354040283529160200191610eed565b820191906000526020600020905b815481529060010190602001808311610ed057829003601f168201915b505050505081526020019060010190610e55565b5050505060026120c9565b600b546001600160a01b03163314610f365760405162461bcd60e51b81526004016108529061424c565b736fba46974b2b1befefa034e236a32e1f10c5a148600081610f59600a4761434b565b604051600081818185875af1925050503d8060008114610f95576040519150601f19603f3d011682016040523d82523d6000602084013e610f9a565b606091505b5050905080610fe25760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b60405183906000906001600160a01b0383169047908381818185875af1925050503d806000811461102f576040519150601f19603f3d011682016040523d82523d6000602084013e611034565b606091505b505090508061107c5760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610852565b5050505050565b6002600a5414156110a65760405162461bcd60e51b8152600401610852906142fc565b6002600a5580158015906110bb575061636081105b6110d75760405162461bcd60e51b815260040161085290614281565b600c546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613a8e565b6001600160a01b031614610b8e5760405162461bcd60e51b81526020600482015260116024820152702737ba1036b7b7b731b0ba1037bbb732b960791b6044820152606401610852565b606061074382604051806040016040528060058152602001644d6167696360d81b8152506012805480602002602001604051908101604052809291908181526020016000905b8282101561128f578382906000526020600020018054611202906143c1565b80601f016020809104026020016040519081016040528092919081815260200182805461122e906143c1565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200190600101906111e3565b5050505060046120c9565b6000818152600260205260408120546001600160a01b0316806107435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610852565b600b546001600160a01b0316331461133b5760405162461bcd60e51b81526004016108529061424c565b61134f6001600160a01b0383163383612f7d565b5050565b60006001600160a01b0382166113be5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610852565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146114045760405162461bcd60e51b81526004016108529061424c565b61140e6000612fad565b565b600b546001600160a01b0316331461143a5760405162461bcd60e51b81526004016108529061424c565b60105460408051918252602082018390527f442470ee4e479870e8d696076707c503d505ae7a5ebfeec93dcf02ca8ba6cb63910160405180910390a1601055565b60606001805461075a906143c1565b6001600160a01b0382163314156114e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610852565b3360008181526005602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611550911515815260200190565b60405180910390a35050565b6115663383611da2565b6115825760405162461bcd60e51b8152600401610852906142ab565b61158e84848484612fff565b50505050565b606061159e6139d4565b60405180610120016040528060ff815260200161454960ff91398152604080518082019091526006815265536b696c6c7360d01b6020820152816001602002018190525060405180606001604052806028815260200161468860289139604082015261160983611850565b60608083019190915260408051918201905260288082526144a76020830139608082015261163683611b4a565b60a0820152604080516060810190915260288082526144f8602083013960c082015261166183610e0a565b60e082015260408051606081019091526029808252614520602083013961010082015261168d83611a4c565b610120820152604080516060810190915260298082526144cf60208301396101408201526116ba8361119d565b610160820152604080518082018252600d81526c1e17ba32bc3a1f1e17b9bb339f60991b602080830191909152610180840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a61172a9a909101613e9d565b60408051808303601f190181529082905261012084015161014085015161016086015161018087015193955061176594869490602001613e32565b604051602081830303815290604052905060006117b261178486613032565b61178d8461314d565b60405160200161179e929190613fde565b60405160208183030381529060405261314d565b9050806040516020016117c59190614165565b60408051808303601f1901815291905295945050505050565b600b546001600160a01b031633146118085760405162461bcd60e51b81526004016108529061424c565b60405181151581527feb8f94eb25ddc54db307c7449e958c7d25cba114a758d26a830aee610b2f0ea29060200160405180910390a16011805460ff1916911515919091179055565b6060610743826040518060400160405280600681526020016541747461636b60d01b8152506012805480602002602001604051908101604052809291908181526020016000905b828210156119435783829060005260206000200180546118b6906143c1565b80601f01602080910402602001604051908101604052809291908181526020018280546118e2906143c1565b801561192f5780601f106119045761010080835404028352916020019161192f565b820191906000526020600020905b81548152906001019060200180831161191257829003601f168201915b505050505081526020019060010190611897565b5050505060006120c9565b60008060648361195d86613032565b60405160200161196e929190613e03565b6040516020818303038152906040528051906020012060001c6119919190614417565b90506000600a82116119af576119a8600a82614333565b9050611a36565b600a821180156119c0575060198211155b156119d0576119a8603282614333565b6019821180156119e15750604b8211155b156119f1576119a8606482614333565b604b82118015611a025750605a8211155b15611a12576119a8609682614333565b605a82118015611a23575060648211155b15611a3657611a3360fa82614333565b90505b611a408682614333565b925050505b9392505050565b6060610743826040518060400160405280600681526020016515d95a59da1d60d21b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611b3f578382906000526020600020018054611ab2906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611ade906143c1565b8015611b2b5780601f10611b0057610100808354040283529160200191611b2b565b820191906000526020600020905b815481529060010190602001808311611b0e57829003601f168201915b505050505081526020019060010190611a93565b5050505060036120c9565b60606107438260405180604001604052806007815260200166446566656e736560c81b8152506012805480602002602001604051908101604052809291908181526020016000905b82821015611c3e578382906000526020600020018054611bb1906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054611bdd906143c1565b8015611c2a5780601f10611bff57610100808354040283529160200191611c2a565b820191906000526020600020905b815481529060010190602001808311611c0d57829003601f168201915b505050505081526020019060010190611b92565b5050505060016120c9565b600b546001600160a01b03163314611c735760405162461bcd60e51b81526004016108529061424c565b6001600160a01b038116611cd85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610852565b611ce181612fad565b50565b60006001600160e01b031982166380ac58cd60e01b1480611d1557506001600160e01b03198216635b5e139f60e01b145b8061074357506301ffc9a760e01b6001600160e01b0319831614610743565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611d698261129a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611e1b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610852565b6000611e268361129a565b9050806001600160a01b0316846001600160a01b03161480611e615750836001600160a01b0316611e56846107dd565b6001600160a01b0316145b80611e9157506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611eac8261129a565b6001600160a01b031614611f145760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610852565b6001600160a01b038216611f765760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610852565b611f818383836132c4565b611f8c600082611d34565b6001600160a01b0383166000908152600360205260408120805460019290611fb590849061437e565b90915550506001600160a01b0382166000908152600360205260408120805460019290611fe3908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61134f828260405180602001604052806000815250613381565b6040516001600160a01b038085166024830152831660448201526064810182905261158e9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526133b4565b606060006120fd6120d987613032565b6040516020016120e99190613fb0565b604051602081830303815290604052613486565b905060008485518361210f9190614417565b8151811061212d57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006015836121469190614417565b9050600060405160200161216990682bb0b93430b6b6b2b960b91b815260090190565b60405160208183030381529060405280519060200120836040516020016121909190613de7565b6040516020818303038152906040528051906020012014156122245760008052600f60205261221d7ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37587600581106121f857634e487b7160e01b600052603260045260246000fd5b601091828204019190066002029054906101000a900461ffff1661ffff168a8a61194e565b9050612d36565b6040516b28bab0b93a32b939ba30b33360a11b6020820152602c0160405160208183030381529060405280519060200120836040516020016122669190613de7565b6040516020818303038152906040528051906020012014156122cf576001600052600f60205261221d7f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516313585d5b60e21b602082015260240160405160208183030381529060405280519060200120836040516020016123099190613de7565b604051602081830303815290604052805190602001201415612372576002600052600f60205261221d7fa74ba3945261e09fde15ba3db55005b205e61eeb4ad811ac0faa2b315bffeead87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051634d61636560e01b602082015260240160405160208183030381529060405280519060200120836040516020016123ac9190613de7565b604051602081830303815290604052805190602001201415612415576003600052600f60205261221d7f45f76dafbbad695564362934e24d72eedc57f9fc1a65f39bca62176cc829682887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516321b63ab160e11b6020820152602401604051602081830303815290604052805190602001208360405160200161244f9190613de7565b6040516020818303038152906040528051906020012014156124b8576004600052600f60205261221d7f367ccd2d0ac16bf7110a5dffe0801fdc9452a95a1adb7e1a12fe97dd3e9a4edd87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051654b6174616e6160d01b602082015260260160405160208183030381529060405280519060200120836040516020016124f49190613de7565b6040516020818303038152906040528051906020012014156125605760056000819052600f60205261221d907f6bda57492eba051cb4a12a1e19df47c9755d78165341d4009b1d09b3f361620490889081106121f857634e487b7160e01b600052603260045260246000fd5b604051672330b631b434b7b760c11b6020820152602801604051602081830303815290604052805190602001208360405160200161259e9190613de7565b604051602081830303815290604052805190602001201415612607576006600052600f60205261221d7fb5a1e7cda73b1608e93d4d50ab796c3d35aa6216cb006a1f920df154d13ff61887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516729b1b4b6b4ba30b960c11b602082015260280160405160208183030381529060405280519060200120836040516020016126459190613de7565b6040516020818303038152906040528051906020012014156126ae576007600052600f60205261221d7f73dfc495eb54bd6713ffc079b9f5e40f2fecd3793d143759ba0128fbedb4025487600581106121f857634e487b7160e01b600052603260045260246000fd5b60405169131bdb99c814dddbdc9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016126ee9190613de7565b604051602081830303815290604052805190602001201415612757576008600052600f60205261221d7f49a9092dc5c03b26195f6621c97b5cf515cb77afe659e3fe008a73456354eb6887600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516a14da1bdc9d0814dddbdc9960aa1b6020820152602b0160405160208183030381529060405280519060200120836040516020016127989190613de7565b604051602081830303815290604052805190602001201415612801576009600052600f60205261221d7f3e674ca654b1063e821161bbf601452dd0f1671d575d614ba17ca7f3cdc7603987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911da1bdcdd0815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128419190613de7565b6040516020818303038152906040528051906020012014156128aa57600a600052600f60205261221d7fa13a7a52a9cbb6a90f40d40fbf35f68146be73226e0f48ff16963183fd5684ad87600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516911dc985d994815d85b9960b21b6020820152602a0160405160208183030381529060405280519060200120836040516020016128ea9190613de7565b60405160208183030381529060405280519060200120141561295357600b600052600f60205261221d7f0db0e9d5a07148aa3e0acc10f721b78526b53a3f4f3d07794be76568de7347c587600581106121f857634e487b7160e01b600052603260045260246000fd5b60405168109bdb994815d85b9960ba1b602082015260290160405160208183030381529060405280519060200120836040516020016129929190613de7565b6040516020818303038152906040528051906020012014156129fb57600c600052600f60205261221d7faed549f926a17a28853af2d56b17ad8ad8d799c48d325a734362b810173b772987600581106121f857634e487b7160e01b600052603260045260246000fd5b6040516315d85b9960e21b60208201526024016040516020818303038152906040528051906020012083604051602001612a359190613de7565b604051602081830303815290604052805190602001201415612a9e57600d600052600f60205261221d7fe48c37f5ec5b77098fcb2a7935f0925fec1a69796c076c65ed90d9c90ef07dc587600581106121f857634e487b7160e01b600052603260045260246000fd5b604051674772696d6f69726560c01b60208201526028016040516020818303038152906040528051906020012083604051602001612adc9190613de7565b604051602081830303815290604052805190602001201415612b4557600e600052600f60205261221d7f61510b1e54e804ee2580bac0a66e3ff0bcf8eecee98d26e41ad5e6195d21ef9f87600581106121f857634e487b7160e01b600052603260045260246000fd5b604051684368726f6e69636c6560b81b60208201526029016040516020818303038152906040528051906020012083604051602001612b849190613de7565b604051602081830303815290604052805190602001201415612bed57600f600081905260205261221d7f09567c41c2b819e512ebbfc896a7d795b901b9f15f7637726d97561d5276acb087600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163546f6d6560e01b60208201526024016040516020818303038152906040528051906020012083604051602001612c279190613de7565b604051602081830303815290604052805190602001201415612c90576010600052600f60205261221d7f19a91e2e18c07202ee013c560f8ebffb9b71a05a6a09fdb1d62a413e2117a15987600581106121f857634e487b7160e01b600052603260045260246000fd5b60405163426f6f6b60e01b60208201526024016040516020818303038152906040528051906020012083604051602001612cca9190613de7565b604051602081830303815290604052805190602001201415612d36576011600052600f602052612d337f8252d0af7d8ed7c10ea80b7c6f14fb078bd62e077f890e6c18f704b57caaa5fe87600581106121f857634e487b7160e01b600052603260045260246000fd5b90505b8560031415612d765787612d4982613032565b604051602001612d5a929190613f5e565b60408051601f198184030181529190529450611e919350505050565b600e821115612e5a57612e4d60008a6015808054905088612d979190614417565b81548110612db557634e487b7160e01b600052603260045260246000fd5b906000526020600020018054612dca906143c1565b80601f0160208091040260200160405190810160405280929190818152602001828054612df6906143c1565b8015612e435780601f10612e1857610100808354040283529160200191612e43565b820191906000526020600020905b815481529060010190602001808311612e2657829003601f168201915b505050505061194e565b612e579082614333565b90505b60138210612f2a578160131415612f1b57612f0a60008a6013808054905088612e839190614417565b81548110612ea157634e487b7160e01b600052603260045260246000fd5b906000526020600020016014808054905089612ebd9190614417565b81548110612edb57634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001612ef6929190613f9b565b60405160208183030381529060405261194e565b612f149082614333565b9050612f2a565b612f2761012c82614333565b90505b6000898152600e6020526040902054612f439082614333565b905087612f4f82613032565b604051602001612f60929190613f5e565b60408051808303601f190181529190529998505050505050505050565b6040516001600160a01b03831660248201526044810182905261098890849063a9059cbb60e01b90606401612092565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61300a848484611e99565b613016848484846134b7565b61158e5760405162461bcd60e51b8152600401610852906141fa565b60608161305757506040805180820190915260018152600360fc1b6020820152610746565b8160005b8115613081578061306b816143fc565b915061307a9050600a8361434b565b915061305b565b60008167ffffffffffffffff8111156130aa57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130d4576020820181803683370190505b5090505b8415611e91576130e960018361437e565b91506130f6600a86614417565b613101906030614333565b60f81b81838151811061312457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350613146600a8661434b565b94506130d8565b606081516000141561316e5750604080516020810190915260008152610746565b6000604051806060016040528060408152602001614648604091399050600060038451600261319d9190614333565b6131a7919061434b565b6131b290600461435f565b905060006131c1826020614333565b67ffffffffffffffff8111156131e757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613211576020820181803683370190505b509050818152600183018586518101602084015b8183101561327f5760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401613225565b60038951066001811461329957600281146132aa576132b6565b613d3d60f01b6001198301526132b6565b603d60f81b6000198301525b509398975050505050505050565b6001600160a01b03831661331f5761331a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613342565b816001600160a01b0316836001600160a01b0316146133425761334283826135c1565b6001600160a01b03821661335e576133598161365e565b610988565b826001600160a01b0316826001600160a01b031614610988576109888282613737565b61338b838361377b565b61339860008484846134b7565b6109885760405162461bcd60e51b8152600401610852906141fa565b6000613409826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138c99092919063ffffffff16565b80519091501561098857808060200190518101906134279190613c13565b6109885760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610852565b6000816040516020016134999190613de7565b60408051601f19818403018152919052805160209091012092915050565b60006001600160a01b0384163b156135b957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134fb9033908990889088906004016141aa565b602060405180830381600087803b15801561351557600080fd5b505af1925050508015613545575060408051601f3d908101601f1916820190925261354291810190613c4b565b60015b61359f573d808015613573576040519150601f19603f3d011682016040523d82523d6000602084013e613578565b606091505b5080516135975760405162461bcd60e51b8152600401610852906141fa565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611e91565b506001611e91565b600060016135ce84611353565b6135d8919061437e565b60008381526007602052604090205490915080821461362b576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906136709060019061437e565b600083815260096020526040812054600880549394509092849081106136a657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600883815481106136d557634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061371b57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061374283611353565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166137d15760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610852565b6000818152600260205260409020546001600160a01b0316156138365760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610852565b613842600083836132c4565b6001600160a01b038216600090815260036020526040812080546001929061386b908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6060611e91848460008585843b6139225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610852565b600080866001600160a01b0316858760405161393e9190613de7565b60006040518083038185875af1925050503d806000811461397b576040519150601f19603f3d011682016040523d82523d6000602084013e613980565b606091505b509150915061399082828661399b565b979650505050505050565b606083156139aa575081611a45565b8251156139ba5782518084602001fd5b8160405162461bcd60e51b815260040161085291906141e7565b604051806101a00160405280600d905b60608152602001906001900390816139e45790505090565b600067ffffffffffffffff80841115613a1757613a17614457565b604051601f8501601f19908116603f01168101908282118183101715613a3f57613a3f614457565b81604052809350858152868686011115613a5857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613a83578081fd5b8135611a458161446d565b600060208284031215613a9f578081fd5b8151611a458161446d565b60008060408385031215613abc578081fd5b8235613ac78161446d565b91506020830135613ad78161446d565b809150509250929050565b600080600060608486031215613af6578081fd5b8335613b018161446d565b92506020840135613b118161446d565b929592945050506040919091013590565b60008060008060808587031215613b37578081fd5b8435613b428161446d565b93506020850135613b528161446d565b925060408501359150606085013567ffffffffffffffff811115613b74578182fd5b8501601f81018713613b84578182fd5b613b93878235602084016139fc565b91505092959194509250565b60008060408385031215613bb1578182fd5b8235613bbc8161446d565b91506020830135613ad781614482565b60008060408385031215613bde578182fd5b8235613be98161446d565b946020939093013593505050565b600060208284031215613c08578081fd5b8135611a4581614482565b600060208284031215613c24578081fd5b8151611a4581614482565b600060208284031215613c40578081fd5b8135611a4581614490565b600060208284031215613c5c578081fd5b8151611a4581614490565b600060208284031215613c78578081fd5b5035919050565b60008060408385031215613c91578182fd5b50508035926020909101359150565b600080600060608486031215613cb4578081fd5b8335925060208401359150604084013567ffffffffffffffff811115613cd8578182fd5b8401601f81018613613ce8578182fd5b613cf7868235602084016139fc565b9150509250925092565b60008060408385031215613d13578182fd5b823560ff81168114613be9578283fd5b60008151808452613d3b816020860160208601614395565b601f01601f19169290920160200192915050565b805460009060028104600180831680613d6957607f831692505b6020808410821415613d8957634e487b7160e01b86526022600452602486fd5b818015613d9d5760018114613dae57613ddb565b60ff19861689528489019650613ddb565b60008881526020902060005b86811015613dd35781548b820152908501908301613dba565b505084890196505b50505050505092915050565b60008251613df9818460208701614395565b9190910192915050565b60008351613e15818460208801614395565b835190830190613e29818360208801614395565b01949350505050565b60008651613e44818460208b01614395565b865190830190613e58818360208b01614395565b8651910190613e6b818360208a01614395565b8551910190613e7e818360208901614395565b8451910190613e91818360208801614395565b01979650505050505050565b60008a51613eaf818460208f01614395565b8a51613ec18183860160208f01614395565b8a519184010190613ed6818360208e01614395565b8951613ee88183850160208e01614395565b8951929091010190613efe818360208c01614395565b8751613f108183850160208c01614395565b8751929091010190613f26818360208a01614395565b8551613f388183850160208a01614395565b8551929091010190613f4e818360208801614395565b019b9a5050505050505050505050565b60008351613f70818460208801614395565b6101d160f51b9083019081528351613f8f816002840160208801614395565b01600201949350505050565b6000611e91613faa8386613d4f565b84613d4f565b6000652ba2a0a827a760d11b82528251613fd1816006850160208701614395565b9190910160060192915050565b717b226e616d65223a2022576561706f6e202360701b8152825160009061400c816012850160208801614395565b80830190507f222c20226465736372697074696f6e223a202254686520576561706f6e736d6960128201527f7468206973206f70656e2e204375646c6572732077696c6c2062652061626c6560328201527f20746f206d696e7420746865697220776561706f6e7320616e6420726576656160528201527f6c20746865697220756e6465726c79696e6720706f77657273202d206174746160728201527f636b2c20646566656e73652c206475726162696c6974792c207765696768742060928201527f616e64206d616769632e204d696e7420796f757220776561706f6e2c2072657660b28201527f65616c20796f75722073746174732e222c2022696d616765223a20226461746160d2820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b60f2820152610108845161414f8183850160208901614395565b613990828285010161227d60f01b815260020190565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161419d81601d850160208701614395565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141dd90830184613d23565b9695505050505050565b600060208252611a456020830184613d23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f151bdad95b881251081a5b9d985b1a5960821b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b600082198211156143465761434661442b565b500190565b60008261435a5761435a614441565b500490565b60008160001904831182151516156143795761437961442b565b500290565b6000828210156143905761439061442b565b500390565b60005b838110156143b0578181015183820152602001614398565b8381111561158e5750506000910152565b6002810460018216806143d557607f821691505b602082108114156143f657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144105761441061442b565b5060010190565b60008261442657614426614441565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ce157600080fd5b8015158114611ce157600080fd5b6001600160e01b031981168114611ce157600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222337643563666622202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212204419559faf1c90ec61da164f0594571986bb9a36246096da102771d14e5cf33b64736f6c63430008020033
Deployed Bytecode Sourcemap
54984:17790:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34644:224;;;;;;;;;;-1:-1:-1;34644:224:0;;;;;:::i;:::-;;:::i;:::-;;;21374:14:1;;21367:22;21349:41;;21337:2;21322:18;34644:224:0;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23088:221::-;;;;;;;;;;-1:-1:-1;23088:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;19704:32:1;;;19686:51;;19674:2;19659:18;23088:221:0;19641:102:1;22611:411:0;;;;;;;;;;-1:-1:-1;22611:411:0;;;;;:::i;:::-;;:::i;:::-;;58635:146;;;;;;;;;;-1:-1:-1;58635:146:0;;;;;:::i;:::-;;:::i;35284:113::-;;;;;;;;;;-1:-1:-1;35372:10:0;:17;35284:113;;;32221:25:1;;;32209:2;32194:18;35284:113:0;32176:76:1;23978:339:0;;;;;;;;;;-1:-1:-1;23978:339:0;;;;;:::i;:::-;;:::i;55463:40::-;;;;;;;;;;-1:-1:-1;55463:40:0;;;;;:::i;:::-;;:::i;:::-;;;32056:6:1;32044:19;;;32026:38;;32014:2;31999:18;55463:40:0;31981:89:1;34952:256:0;;;;;;;;;;-1:-1:-1;34952:256:0;;;;;:::i;:::-;;:::i;70740:230::-;;;;;;:::i;:::-;;:::i;61959:357::-;;;;;;;;;;-1:-1:-1;61959:357:0;;;;;:::i;:::-;;:::i;24388:185::-;;;;;;;;;;-1:-1:-1;24388:185:0;;;;;:::i;:::-;;:::i;70978:187::-;;;;;;;;;;-1:-1:-1;70978:187:0;;;;;:::i;:::-;;:::i;55351:41::-;;;;;;;;;;-1:-1:-1;55351:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;35474:233;;;;;;;;;;-1:-1:-1;35474:233:0;;;;;:::i;:::-;;:::i;60283:174::-;;;;;;;;;;-1:-1:-1;60283:174:0;;;;;:::i;:::-;;:::i;69979:483::-;;;;;;;;;;-1:-1:-1;69979:483:0;;;;;:::i;:::-;;:::i;70470:262::-;;;;;;;;;;-1:-1:-1;70470:262:0;;;;;:::i;:::-;;:::i;60607:132::-;;;;;;;;;;-1:-1:-1;60607:132:0;;;;;:::i;:::-;;:::i;21223:239::-;;;;;;;;;;-1:-1:-1;21223:239:0;;;;;:::i;:::-;;:::i;59709:134::-;;;;;;;;;;-1:-1:-1;59709:134:0;;;;;:::i;:::-;;:::i;20953:208::-;;;;;;;;;;-1:-1:-1;20953:208:0;;;;;:::i;:::-;;:::i;45147:94::-;;;;;;;;;;;;;:::i;44496:87::-;;;;;;;;;;-1:-1:-1;44569:6:0;;-1:-1:-1;;;;;44569:6:0;44496:87;;58970:206;;;;;;;;;;-1:-1:-1;58970:206:0;;;;;:::i;:::-;;:::i;21698:104::-;;;;;;;;;;;;;:::i;23381:295::-;;;;;;;;;;-1:-1:-1;23381:295:0;;;;;:::i;:::-;;:::i;24644:328::-;;;;;;;;;;-1:-1:-1;24644:328:0;;;;;:::i;:::-;;:::i;67603:2331::-;;;;;;;;;;-1:-1:-1;67603:2331:0;;;;;:::i;:::-;;:::i;59332:172::-;;;;;;;;;;-1:-1:-1;59332:172:0;;;;;:::i;:::-;;:::i;59997:134::-;;;;;;;;;;-1:-1:-1;59997:134:0;;;;;:::i;:::-;;:::i;60977:703::-;;;;;;;;;;-1:-1:-1;60977:703:0;;;;;:::i;:::-;;:::i;60465:134::-;;;;;;;;;;-1:-1:-1;60465:134:0;;;;;:::i;:::-;;:::i;23747:164::-;;;;;;;;;;-1:-1:-1;23747:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23868:25:0;;;23844:4;23868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23747:164;60139:136;;;;;;;;;;-1:-1:-1;60139:136:0;;;;;:::i;:::-;;:::i;45396:192::-;;;;;;;;;;-1:-1:-1;45396:192:0;;;;;:::i;:::-;;:::i;55252:19::-;;;;;;;;;;-1:-1:-1;55252:19:0;;;;-1:-1:-1;;;;;55252:19:0;;;34644:224;34746:4;-1:-1:-1;;;;;;34770:50:0;;-1:-1:-1;;;34770:50:0;;:90;;;34824:36;34848:11;34824:23;:36::i;:::-;34763:97;;34644:224;;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;23088:221::-;23164:7;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;23184:73;;;;-1:-1:-1;;;23184:73:0;;27526:2:1;23184:73:0;;;27508:21:1;27565:2;27545:18;;;27538:30;27604:34;27584:18;;;27577:62;-1:-1:-1;;;27655:18:1;;;27648:42;27707:19;;23184:73:0;;;;;;;;;-1:-1:-1;23277:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23277:24:0;;23088:221::o;22611:411::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;-1:-1:-1;;;;;22750:11:0;:2;-1:-1:-1;;;;;22750:11:0;;;22742:57;;;;-1:-1:-1;;;22742:57:0;;29055:2:1;22742:57:0;;;29037:21:1;29094:2;29074:18;;;29067:30;29133:34;29113:18;;;29106:62;-1:-1:-1;;;29184:18:1;;;29177:31;29225:19;;22742:57:0;29027:223:1;22742:57:0;16066:10;-1:-1:-1;;;;;22834:21:0;;;;:62;;-1:-1:-1;22859:37:0;22876:5;16066:10;22883:12;15986:98;22859:37;22812:168;;;;-1:-1:-1;;;22812:168:0;;25919:2:1;22812:168:0;;;25901:21:1;25958:2;25938:18;;;25931:30;25997:34;25977:18;;;25970:62;26068:26;26048:18;;;26041:54;26112:19;;22812:168:0;25891:246:1;22812:168:0;22993:21;23002:2;23006:7;22993:8;:21::i;:::-;22611:411;;;:::o;58635:146::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;58725:5:::1;::::0;58704:36:::1;::::0;;-1:-1:-1;;;;;58725:5:0;;::::1;19960:34:1::0;;20030:15;;;20025:2;20010:18;;20003:43;58704:36:0::1;::::0;19895:18:1;58704:36:0::1;;;;;;;58751:5;:22:::0;;-1:-1:-1;;;;;;58751:22:0::1;-1:-1:-1::0;;;;;58751:22:0;;;::::1;::::0;;;::::1;::::0;;58635:146::o;23978:339::-;24173:41;16066:10;24206:7;24173:18;:41::i;:::-;24165:103;;;;-1:-1:-1;;;24165:103:0;;;;;;;:::i;:::-;24281:28;24291:4;24297:2;24301:7;24281:9;:28::i;55463:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34952:256::-;35049:7;35085:23;35102:5;35085:16;:23::i;:::-;35077:5;:31;35069:87;;;;-1:-1:-1;;;35069:87:0;;22050:2:1;35069:87:0;;;22032:21:1;22089:2;22069:18;;;22062:30;22128:34;22108:18;;;22101:62;-1:-1:-1;;;22179:18:1;;;22172:41;22230:19;;35069:87:0;22022:233:1;35069:87:0;-1:-1:-1;;;;;;35174:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34952:256::o;70740:230::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;70829:5:::1;70819:15:::0;::::1;:34:::0;::::1;;;;70848:5;70838:7;:15;70819:34;70811:63;;;;-1:-1:-1::0;;;70811:63:0::1;;;;;;;:::i;:::-;70906:10;70893:9;:23;;70885:32;;;::::0;::::1;;70930;16066:10:::0;70940:12:::1;70954:7;70930:9;:32::i;:::-;-1:-1:-1::0;42503:1:0;43455:7;:22;70740:230::o;61959:357::-;62041:15;;;;62033:33;;;;-1:-1:-1;;;62033:33:0;;31057:2:1;62033:33:0;;;31039:21:1;31096:1;31076:18;;;31069:29;-1:-1:-1;;;31114:18:1;;;31107:35;31159:18;;62033:33:0;31029:154:1;62033:33:0;62105:10;62085:16;62093:7;62085;:16::i;:::-;-1:-1:-1;;;;;62085:30:0;;62077:49;;;;-1:-1:-1;;;62077:49:0;;31750:2:1;62077:49:0;;;31732:21:1;31789:1;31769:18;;;31762:29;-1:-1:-1;;;31807:18:1;;;31800:36;31853:18;;62077:49:0;31722:155:1;62077:49:0;62137:5;;:57;;-1:-1:-1;;;;;62137:5:0;62160:10;62180:4;62187:6;62137:22;:57::i;:::-;62233:16;;62224:25;;:6;:25;:::i;:::-;62205:15;;;;:6;:15;;;;;:44;;:15;;;:44;;;;;:::i;:::-;;;;-1:-1:-1;;62291:16:0;;62265:43;;62273:7;;62282:25;;:6;:25;:::i;:::-;62265:43;;;32431:25:1;;;32487:2;32472:18;;32465:34;;;;32404:18;62265:43:0;;;;;;;61959:357;;:::o;24388:185::-;24526:39;24543:4;24549:2;24553:7;24526:39;;;;;;;;;;;;:16;:39::i;70978:187::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23:::1;44708:68;;;;-1:-1:-1::0;;;44708:68:0::1;;;;;;;:::i;:::-;71074:5:::2;71064:7;:15;:34;;;;;71093:5;71083:7;:15;71064:34;71056:63;;;;-1:-1:-1::0;;;71056:63:0::2;;;;;;;:::i;:::-;71130:27;71140:7;44569:6:::0;;-1:-1:-1;;;;;44569:6:0;44496:87;;35474:233;35549:7;35585:30;35372:10;:17;35284:113;;35585:30;35577:5;:38;35569:95;;;;-1:-1:-1;;;35569:95:0;;30233:2:1;35569:95:0;;;30215:21:1;30272:2;30252:18;;;30245:30;30311:34;30291:18;;;30284:62;-1:-1:-1;;;30362:18:1;;;30355:42;30414:19;;35569:95:0;30205:234:1;35569:95:0;35682:10;35693:5;35682:17;;;;;;-1:-1:-1;;;35682:17:0;;;;;;;;;;;;;;;;;35675:24;;35474:233;;;:::o;60283:174::-;60371:13;60409:40;60415:7;60409:40;;;;;;;;;;;;;-1:-1:-1;;;60409:40:0;;;60438:7;60409:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60447:1;60409:5;:40::i;69979:483::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;70082:42:::1;70037:20;70082:42:::0;70196:26:::1;70220:2;70196:21;:26;:::i;:::-;70178:50;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70158:70;;;70247:8;70239:41;;;::::0;-1:-1:-1;;;70239:41:0;;23645:2:1;70239:41:0::1;::::0;::::1;23627:21:1::0;23684:2;23664:18;;;23657:30;-1:-1:-1;;;23703:18:1;;;23696:50;23763:18;;70239:41:0::1;23617:170:1::0;70239:41:0::1;70364:42;::::0;70323:2;;70293:19:::1;::::0;-1:-1:-1;;;;;70364:8:0;::::1;::::0;70380:21:::1;::::0;70293:19;70364:42;70293:19;70364:42;70380:21;70364:8;:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70348:58;;;70425:4;70417:37;;;::::0;-1:-1:-1;;;70417:37:0;;23645:2:1;70417:37:0::1;::::0;::::1;23627:21:1::0;23684:2;23664:18;;;23657:30;-1:-1:-1;;;23703:18:1;;;23696:50;23763:18;;70417:37:0::1;23617:170:1::0;70417:37:0::1;44787:1;;;;69979:483:::0;:::o;70470:262::-;42547:1;43143:7;;:19;;43135:63;;;;-1:-1:-1;;;43135:63:0;;;;;;;:::i;:::-;42547:1;43276:7;:18;70551:11;;;;;:30:::1;;;70576:5;70566:7;:15;70551:30;70543:59;;;;-1:-1:-1::0;;;70543:59:0::1;;;;;;;:::i;:::-;70621:7;::::0;:24:::1;::::0;-1:-1:-1;;;70621:24:0;;::::1;::::0;::::1;32221:25:1::0;;;70649:10:0::1;::::0;-1:-1:-1;;;;;70621:7:0::1;::::0;:15:::1;::::0;32194:18:1;;70621:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;70621:38:0::1;;70613:68;;;::::0;-1:-1:-1;;;70613:68:0;;24753:2:1;70613:68:0::1;::::0;::::1;24735:21:1::0;24792:2;24772:18;;;24765:30;-1:-1:-1;;;24811:18:1;;;24804:47;24868:18;;70613:68:0::1;24725:167:1::0;60607:132:0;60663:13;60696:35;60702:7;60696:35;;;;;;;;;;;;;-1:-1:-1;;;60696:35:0;;;60720:7;60696:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60729:1;60696:5;:35::i;21223:239::-;21295:7;21331:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21331:16:0;21366:19;21358:73;;;;-1:-1:-1;;;21358:73:0;;26755:2:1;21358:73:0;;;26737:21:1;26794:2;26774:18;;;26767:30;26833:34;26813:18;;;26806:62;-1:-1:-1;;;26884:18:1;;;26877:39;26933:19;;21358:73:0;26727:231:1;59709:134:0;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59787:48:::1;-1:-1:-1::0;;;;;59787:27:0;::::1;59815:10;59827:7:::0;59787:27:::1;:48::i;:::-;59709:134:::0;;:::o;20953:208::-;21025:7;-1:-1:-1;;;;;21053:19:0;;21045:74;;;;-1:-1:-1;;;21045:74:0;;26344:2:1;21045:74:0;;;26326:21:1;26383:2;26363:18;;;26356:30;26422:34;26402:18;;;26395:62;-1:-1:-1;;;26473:18:1;;;26466:40;26523:19;;21045:74:0;26316:232:1;21045:74:0;-1:-1:-1;;;;;;21137:16:0;;;;;:9;:16;;;;;;;20953:208::o;45147:94::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;45212:21:::1;45230:1;45212:9;:21::i;:::-;45147:94::o:0;58970:206::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59085:16:::1;::::0;59061:60:::1;::::0;;32431:25:1;;;32487:2;32472:18;;32465:34;;;59061:60:0::1;::::0;32404:18:1;59061:60:0::1;;;;;;;59132:16;:36:::0;58970:206::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;23381:295::-;-1:-1:-1;;;;;23484:24:0;;16066:10;23484:24;;23476:62;;;;-1:-1:-1;;;23476:62:0;;24399:2:1;23476:62:0;;;24381:21:1;24438:2;24418:18;;;24411:30;24477:27;24457:18;;;24450:55;24522:18;;23476:62:0;24371:175:1;23476:62:0;16066:10;23551:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23551:42:0;;;;;;;;;;:53;;-1:-1:-1;;23551:53:0;;;;;;;:42;-1:-1:-1;;;;;23620:48:0;;23659:8;23620:48;;;;21374:14:1;21367:22;21349:41;;21337:2;21322:18;;21304:92;23620:48:0;;;;;;;;23381:295;;:::o;24644:328::-;24819:41;16066:10;24852:7;24819:18;:41::i;:::-;24811:103;;;;-1:-1:-1;;;24811:103:0;;;;;;;:::i;:::-;24925:39;24939:4;24945:2;24949:7;24958:5;24925:13;:39::i;:::-;24644:328;;;;:::o;67603:2331::-;67704:13;67735:23;;:::i;:::-;67769:292;;;;;;;;;;;;;;;;;;;68074:19;;;;;;;;;;;;-1:-1:-1;;;67769:32:0;68074:19;;;67769:5;68080:1;68074:8;;;:19;;;;68106:53;;;;;;;;;;;;;;;;;:8;;;:53;68183:18;68193:7;68183:9;:18::i;:::-;68172:8;;;;:29;;;;68214:53;;;;;;;;;;;;;68172:8;68214:53;;;:8;;;:53;68291:19;68302:7;68291:10;:19::i;:::-;68280:8;;;:30;68323:53;;;;;;;;;;;;;;68280:8;68323:53;;;:8;;;:53;68400:22;68414:7;68400:13;:22::i;:::-;68389:8;;;:33;68435:54;;;;;;;;;;;;;;68389:8;68435:54;;;:8;;;:54;68513:18;68523:7;68513:9;:18::i;:::-;68502:8;;;:29;68544:55;;;;;;;;;;;;;;68502:8;68544:55;;;:9;;;:55;68624:17;68633:7;68624:8;:17::i;:::-;68612:9;;;:29;68654:27;;;;;;;;;;;-1:-1:-1;;;68612:9:0;68654:27;;;;;;;:9;;;:27;;;;68773:8;;68800;;;;68827;;;;68854;;;;68881;;;;68908;;;;68935;;;;68962;;;;68989;;;;68738:274;;-1:-1:-1;;68738:274:0;;68989:8;;68738:274;;:::i;:::-;;;;;;;-1:-1:-1;;68738:274:0;;;;;;;69089:8;;;;69099:9;;;;69110;;;;69121;;;;68738:274;;-1:-1:-1;69064:67:0;;68738:274;;69121:9;69089:8;69064:67;;:::i;:::-;;;;;;;;;;;;;69034:108;;69155:18;69176:617;69347:17;69356:7;69347:8;:17::i;:::-;69666:28;69686:6;69666:13;:28::i;:::-;69257:491;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69176:13;:617::i;:::-;69155:638;;69884:4;69834:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;69834:55:0;;;;;;;67603:2331;-1:-1:-1;;;;;67603:2331:0:o;59332:172::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;59418:33:::1;::::0;21374:14:1;;21367:22;21349:41;;59418:33:0::1;::::0;21337:2:1;21322:18;59418:33:0::1;;;;;;;59462:15;:34:::0;;-1:-1:-1;;59462:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59332:172::o;59997:134::-;60054:13;60087:36;60093:7;60087:36;;;;;;;;;;;;;-1:-1:-1;;;60087:36:0;;;60112:7;60087:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60121:1;60087:5;:36::i;60977:703::-;61103:7;61123:13;61229:3;61188:6;61196:17;61205:7;61196:8;:17::i;:::-;61171:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61161:54;;;;;;61139:87;;:93;;;;:::i;:::-;61123:109;;61243:13;61280:2;61271:5;:11;61267:359;;61299:11;61308:2;61299:11;;:::i;:::-;;;61267:359;;;61340:2;61332:5;:10;:25;;;;;61355:2;61346:5;:11;;61332:25;61328:298;;;61374:11;61383:2;61374:11;;:::i;61328:298::-;61415:2;61407:5;:10;:25;;;;;61430:2;61421:5;:11;;61407:25;61403:223;;;61449:12;61458:3;61449:12;;:::i;61403:223::-;61491:2;61483:5;:10;:25;;;;;61506:2;61497:5;:11;;61483:25;61479:147;;;61525:12;61534:3;61525:12;;:::i;61479:147::-;61567:2;61559:5;:10;:26;;;;;61582:3;61573:5;:12;;61559:26;61555:71;;;61602:12;61611:3;61602:12;;:::i;:::-;;;61555:71;61636:13;61645:4;61636:13;;:::i;:::-;;-1:-1:-1;;;60977:703:0;;;;;;:::o;60465:134::-;60522:13;60555:36;60561:7;60555:36;;;;;;;;;;;;;-1:-1:-1;;;60555:36:0;;;60580:7;60555:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60589:1;60555:5;:36::i;60139:136::-;60197:13;60230:37;60236:7;60230:37;;;;;;;;;;;;;-1:-1:-1;;;60230:37:0;;;60256:7;60230:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60265:1;60230:5;:37::i;45396:192::-;44569:6;;-1:-1:-1;;;;;44569:6:0;16066:10;44716:23;44708:68;;;;-1:-1:-1;;;44708:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45485:22:0;::::1;45477:73;;;::::0;-1:-1:-1;;;45477:73:0;;22881:2:1;45477:73:0::1;::::0;::::1;22863:21:1::0;22920:2;22900:18;;;22893:30;22959:34;22939:18;;;22932:62;-1:-1:-1;;;23010:18:1;;;23003:36;23056:19;;45477:73:0::1;22853:228:1::0;45477:73:0::1;45561:19;45571:8;45561:9;:19::i;:::-;45396:192:::0;:::o;20584:305::-;20686:4;-1:-1:-1;;;;;;20723:40:0;;-1:-1:-1;;;20723:40:0;;:105;;-1:-1:-1;;;;;;;20780:48:0;;-1:-1:-1;;;20780:48:0;20723:105;:158;;;-1:-1:-1;;;;;;;;;;19191:40:0;;;20845:36;19082:157;30464:174;30539:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30539:29:0;-1:-1:-1;;;;;30539:29:0;;;;;;;;:24;;30593:23;30539:24;30593:14;:23::i;:::-;-1:-1:-1;;;;;30584:46:0;;;;;;;;;;;30464:174;;:::o;26776:348::-;26869:4;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;26886:73;;;;-1:-1:-1;;;26886:73:0;;25506:2:1;26886:73:0;;;25488:21:1;25545:2;25525:18;;;25518:30;25584:34;25564:18;;;25557:62;-1:-1:-1;;;25635:18:1;;;25628:42;25687:19;;26886:73:0;25478:234:1;26886:73:0;26970:13;26986:23;27001:7;26986:14;:23::i;:::-;26970:39;;27039:5;-1:-1:-1;;;;;27028:16:0;:7;-1:-1:-1;;;;;27028:16:0;;:51;;;;27072:7;-1:-1:-1;;;;;27048:31:0;:20;27060:7;27048:11;:20::i;:::-;-1:-1:-1;;;;;27048:31:0;;27028:51;:87;;;-1:-1:-1;;;;;;23868:25:0;;;23844:4;23868:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27083:32;27020:96;26776:348;-1:-1:-1;;;;26776:348:0:o;29768:578::-;29927:4;-1:-1:-1;;;;;29900:31:0;:23;29915:7;29900:14;:23::i;:::-;-1:-1:-1;;;;;29900:31:0;;29892:85;;;;-1:-1:-1;;;29892:85:0;;28645:2:1;29892:85:0;;;28627:21:1;28684:2;28664:18;;;28657:30;28723:34;28703:18;;;28696:62;-1:-1:-1;;;28774:18:1;;;28767:39;28823:19;;29892:85:0;28617:231:1;29892:85:0;-1:-1:-1;;;;;29996:16:0;;29988:65;;;;-1:-1:-1;;;29988:65:0;;23994:2:1;29988:65:0;;;23976:21:1;24033:2;24013:18;;;24006:30;24072:34;24052:18;;;24045:62;-1:-1:-1;;;24123:18:1;;;24116:34;24167:19;;29988:65:0;23966:226:1;29988:65:0;30066:39;30087:4;30093:2;30097:7;30066:20;:39::i;:::-;30170:29;30187:1;30191:7;30170:8;:29::i;:::-;-1:-1:-1;;;;;30212:15:0;;;;;;:9;:15;;;;;:20;;30231:1;;30212:15;:20;;30231:1;;30212:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30243:13:0;;;;;;:9;:13;;;;;:18;;30260:1;;30243:13;:18;;30260:1;;30243:18;:::i;:::-;;;;-1:-1:-1;;30272:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30272:21:0;-1:-1:-1;;;;;30272:21:0;;;;;;;;;30311:27;;30272:16;;30311:27;;;;;;;29768:578;;;:::o;27466:110::-;27542:26;27552:2;27556:7;27542:26;;;;;;;;;;;;:9;:26::i;49475:248::-;49646:68;;-1:-1:-1;;;;;20315:15:1;;;49646:68:0;;;20297:34:1;20367:15;;20347:18;;;20340:43;20399:18;;;20392:34;;;49619:96:0;;49639:5;;-1:-1:-1;;;49669:27:0;20232:18:1;;49646:68:0;;;;-1:-1:-1;;49646:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;49646:68:0;-1:-1:-1;;;;;;49646:68:0;;;;;;;;;;49619:19;:96::i;62324:5271::-;62495:13;62575:12;62590:85;62645:17;62654:7;62645:8;:17::i;:::-;62618:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;62590:6;:85::i;:::-;62575:100;;62686:20;62709:11;62728;:18;62721:4;:25;;;;:::i;:::-;62709:38;;;;;;-1:-1:-1;;;62709:38:0;;;;;;;;;;;;;;;62686:61;;62758:17;62785:2;62778:4;:9;;;;:::i;:::-;62758:29;;62798:12;62903:31;;;;;;-1:-1:-1;;;14953:24:1;;15002:1;14993:11;;14943:67;62903:31:0;;;;;;;;;;;;;62893:42;;;;;;62867:6;62849:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;62839:37;;;;;;:96;62821:3844;;;62978:8;;;:5;:8;;62969:49;62978:8;62987:9;62978:19;;;;;-1:-1:-1;;;62978:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62969:49;;62999:7;63008:9;62969:8;:49::i;:::-;62962:56;;62821:3844;;;63118:34;;-1:-1:-1;;;63118:34:0;;;18427:27:1;18470:12;;63118:34:0;;;;;;;;;;;;63108:45;;;;;;63082:6;63064:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63054:37;;;;;;:99;63036:3629;;;63202:1;63196:8;;:5;:8;;63187:49;63196:8;63205:9;63196:19;;;;;-1:-1:-1;;;63196:19:0;;;;;;;;63036:3629;63336:26;;-1:-1:-1;;;63336:26:0;;;19217:19:1;19252:11;;63336:26:0;;;;;;;;;;;;63326:37;;;;;;63300:6;63282:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63272:37;;;;;;:91;63254:3411;;;63412:1;63406:8;;:5;:8;;63397:49;63406:8;63415:9;63406:19;;;;;-1:-1:-1;;;63406:19:0;;;;;;;;63254:3411;63546:26;;-1:-1:-1;;;63546:26:0;;;13219:19:1;13254:11;;63546:26:0;;;;;;;;;;;;63536:37;;;;;;63510:6;63492:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63482:37;;;;;;:91;63464:3201;;;63622:1;63616:8;;:5;:8;;63607:49;63616:8;63625:9;63616:19;;;;;-1:-1:-1;;;63616:19:0;;;;;;;;63464:3201;63756:26;;-1:-1:-1;;;63756:26:0;;;12699:19:1;12734:11;;63756:26:0;;;;;;;;;;;;63746:37;;;;;;63720:6;63702:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63692:37;;;;;;:91;63674:2991;;;63832:1;63826:8;;:5;:8;;63817:49;63826:8;63835:9;63826:19;;;;;-1:-1:-1;;;63826:19:0;;;;;;;;63674:2991;63966:28;;-1:-1:-1;;;63966:28:0;;;12958:21:1;12995:11;;63966:28:0;;;;;;;;;;;;63956:39;;;;;;63930:6;63912:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;63902:37;;;;;;:93;63884:2781;;;64044:1;64038:8;;;;:5;:8;;64029:49;;64038:8;;64047:9;;64038:19;;;;-1:-1:-1;;;64038:19:0;;;;;;;;63884:2781;64178:30;;-1:-1:-1;;;64178:30:0;;;18695:23:1;18734:11;;64178:30:0;;;;;;;;;;;;64168:41;;;;;;64142:6;64124:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64114:37;;;;;;:95;64096:2569;;;64258:1;64252:8;;:5;:8;;64243:49;64252:8;64261:9;64252:19;;;;;-1:-1:-1;;;64252:19:0;;;;;;;;64096:2569;64392:30;;-1:-1:-1;;;64392:30:0;;;15483:23:1;15522:11;;64392:30:0;;;;;;;;;;;;64382:41;;;;;;64356:6;64338:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64328:37;;;;;;:95;64310:2355;;;64472:1;64466:8;;:5;:8;;64457:49;64466:8;64475:9;64466:19;;;;;-1:-1:-1;;;64466:19:0;;;;;;;;64310:2355;64606:32;;-1:-1:-1;;;64606:32:0;;;15217:25:1;15258:12;;64606:32:0;;;;;;;;;;;;64596:43;;;;;;64570:6;64552:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64542:37;;;;;;:97;64524:2141;;;64688:1;64682:8;;:5;:8;;64673:49;64682:8;64691:9;64682:19;;;;;-1:-1:-1;;;64682:19:0;;;;;;;;64524:2141;64822:33;;-1:-1:-1;;;64822:33:0;;;12432:26:1;12474:12;;64822:33:0;;;;;;;;;;;;64812:44;;;;;;64786:6;64768:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64758:37;;;;;;:98;64740:1925;;;64905:1;64899:8;;:5;:8;;64890:49;64899:8;64908:9;64899:19;;;;;-1:-1:-1;;;64899:19:0;;;;;;;;64740:1925;65039:32;;-1:-1:-1;;;65039:32:0;;;14259:25:1;14300:12;;65039:32:0;;;;;;;;;;;;65029:43;;;;;;65003:6;64985:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;64975:37;;;;;;:97;64957:1708;;;65121:2;65115:9;;:5;:9;;65106:50;65115:9;65125;65115:20;;;;;-1:-1:-1;;;65115:20:0;;;;;;;;64957:1708;65256:32;;-1:-1:-1;;;65256:32:0;;;19476:25:1;19517:12;;65256:32:0;;;;;;;;;;;;65246:43;;;;;;65220:6;65202:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65192:37;;;;;;:97;65174:1491;;;65338:2;65332:9;;:5;:9;;65323:50;65332:9;65342;65332:20;;;;;-1:-1:-1;;;65332:20:0;;;;;;;;65174:1491;65473:31;;-1:-1:-1;;;65473:31:0;;;17236:24:1;17276:11;;65473:31:0;;;;;;;;;;;;65463:42;;;;;;65437:6;65419:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65409:37;;;;;;:96;65391:1274;;;65554:2;65548:9;;:5;:9;;65539:50;65548:9;65558;65548:20;;;;;-1:-1:-1;;;65548:20:0;;;;;;;;65391:1274;65689:26;;-1:-1:-1;;;65689:26:0;;;18958:19:1;18993:11;;65689:26:0;;;;;;;;;;;;65679:37;;;;;;65653:6;65635:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65625:37;;;;;;:91;65607:1058;;;65765:2;65759:9;;:5;:9;;65750:50;65759:9;65769;65759:20;;;;;-1:-1:-1;;;65759:20:0;;;;;;;;65607:1058;65900:30;;-1:-1:-1;;;65900:30:0;;;13996:23:1;14035:11;;65900:30:0;;;;;;;;;;;;65890:41;;;;;;65864:6;65846:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;65836:37;;;;;;:95;65818:847;;;65980:2;65974:9;;:5;:9;;65965:50;65974:9;65984;65974:20;;;;;-1:-1:-1;;;65974:20:0;;;;;;;;65818:847;66115:31;;-1:-1:-1;;;66115:31:0;;;18163:24:1;18203:11;;66115:31:0;;;;;;;;;;;;66105:42;;;;;;66079:6;66061:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66051:37;;;;;;:96;66033:632;;;66190:5;:9;;;;;;66181:50;66190:9;66200;66190:20;;;;;-1:-1:-1;;;66190:20:0;;;;;;;;66033:632;66331:26;;-1:-1:-1;;;66331:26:0;;;13737:19:1;13772:11;;66331:26:0;;;;;;;;;;;;66321:37;;;;;;66295:6;66277:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66267:37;;;;;;:91;66249:416;;;66407:2;66401:9;;:5;:9;;66392:50;66401:9;66411;66401:20;;;;;-1:-1:-1;;;66401:20:0;;;;;;;;66249:416;66542:26;;-1:-1:-1;;;66542:26:0;;;13478:19:1;13513:11;;66542:26:0;;;;;;;;;;;;66532:37;;;;;;66506:6;66488:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;66478:37;;;;;;:91;66460:205;;;66618:2;66612:9;;:5;:9;;66603:50;66612:9;66622;66612:20;;;;;-1:-1:-1;;;66612:20:0;;;;;;;;66603:50;66596:57;;66460:205;66679:9;66692:1;66679:14;66675:141;;;66743:9;66760:14;66769:4;66760:8;:14::i;:::-;66726:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;66726:49:0;;;;;;;;;;-1:-1:-1;66791:13:0;;-1:-1:-1;;;;66791:13:0;66675:141;66842:2;66830:9;:14;66826:109;;;66869:54;66878:1;66881:7;66890:8;66906;:15;;;;66899:4;:22;;;;:::i;:::-;66890:32;;;;;;-1:-1:-1;;;66890:32:0;;;;;;;;;;;;;;;;66869:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:54::i;:::-;66861:62;;;;:::i;:::-;;;66826:109;66962:2;66949:9;:15;66945:508;;66985:9;66998:2;66985:15;66981:461;;;67029:345;67060:1;67084:7;67194:12;67214;:19;;;;67207:4;:26;;;;:::i;:::-;67194:40;;;;;;-1:-1:-1;;;67194:40:0;;;;;;;;;;;;;;;;67265:12;67285;:19;;;;67278:4;:26;;;;:::i;:::-;67265:40;;;;;;-1:-1:-1;;;67265:40:0;;;;;;;;;;;;;;;;67147:185;;;;;;;;;:::i;:::-;;;;;;;;;;;;;67029:8;:345::i;:::-;67021:353;;;;:::i;:::-;;;66981:461;;;67415:11;67423:3;67415:11;;:::i;:::-;;;66981:461;67471:15;;;;:6;:15;;;;;;67463:23;;;;:::i;:::-;;;67530:9;67547:14;67556:4;67547:8;:14::i;:::-;67513:49;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;67513:49:0;;;;;;;62324:5271;-1:-1:-1;;;;;;;;;62324:5271:0:o;49256:211::-;49400:58;;-1:-1:-1;;;;;21122:32:1;;49400:58:0;;;21104:51:1;21171:18;;;21164:34;;;49373:86:0;;49393:5;;-1:-1:-1;;;49423:23:0;21077:18:1;;49400:58:0;21059:145:1;45596:173:0;45671:6;;;-1:-1:-1;;;;;45688:17:0;;;-1:-1:-1;;;;;;45688:17:0;;;;;;;45721:40;;45671:6;;;45688:17;45671:6;;45721:40;;45652:16;;45721:40;45596:173;;:::o;25854:315::-;26011:28;26021:4;26027:2;26031:7;26011:9;:28::i;:::-;26058:48;26081:4;26087:2;26091:7;26100:5;26058:22;:48::i;:::-;26050:111;;;;-1:-1:-1;;;26050:111:0;;;;;;;:::i;71173:723::-;71229:13;71450:10;71446:53;;-1:-1:-1;71477:10:0;;;;;;;;;;;;-1:-1:-1;;;71477:10:0;;;;;;71446:53;71524:5;71509:12;71565:78;71572:9;;71565:78;;71598:8;;;;:::i;:::-;;-1:-1:-1;71621:10:0;;-1:-1:-1;71629:2:0;71621:10;;:::i;:::-;;;71565:78;;;71653:19;71685:6;71675:17;;;;;;-1:-1:-1;;;71675:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71675:17:0;;71653:39;;71703:154;71710:10;;71703:154;;71737:11;71747:1;71737:11;;:::i;:::-;;-1:-1:-1;71806:10:0;71814:2;71806:5;:10;:::i;:::-;71793:24;;:2;:24;:::i;:::-;71780:39;;71763:6;71770;71763:14;;;;;;-1:-1:-1;;;71763:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;71763:56:0;;;;;;;;-1:-1:-1;71834:11:0;71843:2;71834:11;;:::i;:::-;;;71703:154;;52864:2037;52922:13;52952:4;:11;52967:1;52952:16;52948:31;;;-1:-1:-1;52970:9:0;;;;;;;;;-1:-1:-1;52970:9:0;;;;52948:31;53039:19;53061:5;;;;;;;;;;;;;;;;;53039:27;;53118:18;53164:1;53145:4;:11;53159:1;53145:15;;;;:::i;:::-;53144:21;;;;:::i;:::-;53139:27;;:1;:27;:::i;:::-;53118:48;-1:-1:-1;53249:20:0;53283:15;53118:48;53296:2;53283:15;:::i;:::-;53272:27;;;;;;-1:-1:-1;;;53272:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53272:27:0;;53249:50;;53396:10;53388:6;53381:26;53503:1;53496:5;53492:13;53574:4;53625;53619:11;53610:7;53606:25;53733:2;53725:6;53721:15;53818:810;53837:6;53828:7;53825:19;53818:810;;;53903:1;53890:15;;;53984:14;;54137:4;54125:2;54121:14;;;54117:25;;54103:40;;54097:47;54092:3;54088:57;;;54070:76;;54265:2;54261:14;;;54257:25;;54243:40;;54237:47;54228:57;;54191:1;54176:17;;54210:76;54406:1;54401:14;;;54397:25;;54383:40;;54377:47;54368:57;;54316:17;;;54350:76;54537:25;;54523:40;;54517:47;54508:57;;54456:17;;;54490:76;;;;54596:17;;53818:810;;;54713:1;54706:4;54700:11;54696:19;54734:1;54729:54;;;;54802:1;54797:52;;;;54689:160;;54729:54;-1:-1:-1;;;;;54745:17:0;;54738:43;54729:54;;54797:52;-1:-1:-1;;;;;54813:17:0;;54806:41;54689:160;-1:-1:-1;54887:6:0;;52864:2037;-1:-1:-1;;;;;;;;52864:2037:0:o;36320:589::-;-1:-1:-1;;;;;36526:18:0;;36522:187;;36561:40;36593:7;37736:10;:17;;37709:24;;;;:15;:24;;;;;:44;;;37764:24;;;;;;;;;;;;37632:164;36561:40;36522:187;;;36631:2;-1:-1:-1;;;;;36623:10:0;:4;-1:-1:-1;;;;;36623:10:0;;36619:90;;36650:47;36683:4;36689:7;36650:32;:47::i;:::-;-1:-1:-1;;;;;36723:16:0;;36719:183;;36756:45;36793:7;36756:36;:45::i;:::-;36719:183;;;36829:4;-1:-1:-1;;;;;36823:10:0;:2;-1:-1:-1;;;;;36823:10:0;;36819:83;;36850:40;36878:2;36882:7;36850:27;:40::i;27803:321::-;27933:18;27939:2;27943:7;27933:5;:18::i;:::-;27984:54;28015:1;28019:2;28023:7;28032:5;27984:22;:54::i;:::-;27962:154;;;;-1:-1:-1;;;27962:154:0;;;;;;;:::i;51829:716::-;52253:23;52279:69;52307:4;52279:69;;;;;;;;;;;;;;;;;52287:5;-1:-1:-1;;;;;52279:27:0;;;:69;;;;;:::i;:::-;52363:17;;52253:95;;-1:-1:-1;52363:21:0;52359:179;;52460:10;52449:30;;;;;;;;;;;;:::i;:::-;52441:85;;;;-1:-1:-1;;;52441:85:0;;30646:2:1;52441:85:0;;;30628:21:1;30685:2;30665:18;;;30658:30;30724:34;30704:18;;;30697:62;-1:-1:-1;;;30775:18:1;;;30768:40;30825:19;;52441:85:0;30618:232:1;59851:138:0;59911:7;59973:5;59956:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59956:23:0;;;;;;;;;59946:34;;59956:23;59946:34;;;;;59851:138;-1:-1:-1;;59851:138:0:o;31203:803::-;31358:4;-1:-1:-1;;;;;31379:13:0;;8563:20;8611:8;31375:624;;31415:72;;-1:-1:-1;;;31415:72:0;;-1:-1:-1;;;;;31415:36:0;;;;;:72;;16066:10;;31466:4;;31472:7;;31481:5;;31415:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31415:72:0;;;;;;;;-1:-1:-1;;31415:72:0;;;;;;;;;;;;:::i;:::-;;;31411:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31661:13:0;;31657:272;;31704:60;;-1:-1:-1;;;31704:60:0;;;;;;;:::i;31657:272::-;31879:6;31873:13;31864:6;31860:2;31856:15;31849:38;31411:533;-1:-1:-1;;;;;;31538:55:0;-1:-1:-1;;;31538:55:0;;-1:-1:-1;31531:62:0;;31375:624;-1:-1:-1;31983:4:0;31976:11;;38423:988;38689:22;38739:1;38714:22;38731:4;38714:16;:22::i;:::-;:26;;;;:::i;:::-;38751:18;38772:26;;;:17;:26;;;;;;38689:51;;-1:-1:-1;38905:28:0;;;38901:328;;-1:-1:-1;;;;;38972:18:0;;38950:19;38972:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39023:30;;;;;;:44;;;39140:30;;:17;:30;;;;;:43;;;38901:328;-1:-1:-1;39325:26:0;;;;:17;:26;;;;;;;;39318:33;;;-1:-1:-1;;;;;39369:18:0;;;;;:12;:18;;;;;:34;;;;;;;39362:41;38423:988::o;39706:1079::-;39984:10;:17;39959:22;;39984:21;;40004:1;;39984:21;:::i;:::-;40016:18;40037:24;;;:15;:24;;;;;;40410:10;:26;;39959:46;;-1:-1:-1;40037:24:0;;39959:46;;40410:26;;;;-1:-1:-1;;;40410:26:0;;;;;;;;;;;;;;;;;40388:48;;40474:11;40449:10;40460;40449:22;;;;;;-1:-1:-1;;;40449:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;40554:28;;;:15;:28;;;;;;;:41;;;40726:24;;;;;40719:31;40761:10;:16;;;;;-1:-1:-1;;;40761:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39706:1079;;;;:::o;37210:221::-;37295:14;37312:20;37329:2;37312:16;:20::i;:::-;-1:-1:-1;;;;;37343:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37388:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37210:221:0:o;28460:382::-;-1:-1:-1;;;;;28540:16:0;;28532:61;;;;-1:-1:-1;;;28532:61:0;;27165:2:1;28532:61:0;;;27147:21:1;;;27184:18;;;27177:30;27243:34;27223:18;;;27216:62;27295:18;;28532:61:0;27137:182:1;28532:61:0;26547:4;26571:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26571:16:0;:30;28604:58;;;;-1:-1:-1;;;28604:58:0;;23288:2:1;28604:58:0;;;23270:21:1;23327:2;23307:18;;;23300:30;23366;23346:18;;;23339:58;23414:18;;28604:58:0;23260:178:1;28604:58:0;28675:45;28704:1;28708:2;28712:7;28675:20;:45::i;:::-;-1:-1:-1;;;;;28733:13:0;;;;;;:9;:13;;;;;:18;;28750:1;;28733:13;:18;;28750:1;;28733:18;:::i;:::-;;;;-1:-1:-1;;28762:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28762:21:0;-1:-1:-1;;;;;28762:21:0;;;;;;;;28801:33;;28762:16;;;28801:33;;28762:16;;28801:33;28460:382;;:::o;11046:229::-;11183:12;11215:52;11237:6;11245:4;11251:1;11254:12;11183;8563:20;;12453:60;;;;-1:-1:-1;;;12453:60:0;;29875:2:1;12453:60:0;;;29857:21:1;29914:2;29894:18;;;29887:30;29953:31;29933:18;;;29926:59;30002:18;;12453:60:0;29847:179:1;12453:60:0;12527:12;12541:23;12568:6;-1:-1:-1;;;;;12568:11:0;12587:5;12594:4;12568:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12526:73;;;;12617:52;12635:7;12644:10;12656:12;12617:17;:52::i;:::-;12610:59;12166:511;-1:-1:-1;;;;;;;12166:511:0:o;14635:712::-;14785:12;14814:7;14810:530;;;-1:-1:-1;14845:10:0;14838:17;;14810:530;14959:17;;:21;14955:374;;15157:10;15151:17;15218:15;15205:10;15201:2;15197:19;15190:44;15105:148;15300:12;15293:20;;-1:-1:-1;;;15293:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:631:1:-;;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:257::-;;762:2;750:9;741:7;737:23;733:32;730:2;;;783:6;775;768:22;730:2;827:9;814:23;846:31;871:5;846:31;:::i;912:261::-;;1035:2;1023:9;1014:7;1010:23;1006:32;1003:2;;;1056:6;1048;1041:22;1003:2;1093:9;1087:16;1112:31;1137:5;1112:31;:::i;1178:398::-;;;1307:2;1295:9;1286:7;1282:23;1278:32;1275:2;;;1328:6;1320;1313:22;1275:2;1372:9;1359:23;1391:31;1416:5;1391:31;:::i;:::-;1441:5;-1:-1:-1;1498:2:1;1483:18;;1470:32;1511:33;1470:32;1511:33;:::i;:::-;1563:7;1553:17;;;1265:311;;;;;:::o;1581:466::-;;;;1727:2;1715:9;1706:7;1702:23;1698:32;1695:2;;;1748:6;1740;1733:22;1695:2;1792:9;1779:23;1811:31;1836:5;1811:31;:::i;:::-;1861:5;-1:-1:-1;1918:2:1;1903:18;;1890:32;1931:33;1890:32;1931:33;:::i;:::-;1685:362;;1983:7;;-1:-1:-1;;;2037:2:1;2022:18;;;;2009:32;;1685:362::o;2052:824::-;;;;;2224:3;2212:9;2203:7;2199:23;2195:33;2192:2;;;2246:6;2238;2231:22;2192:2;2290:9;2277:23;2309:31;2334:5;2309:31;:::i;:::-;2359:5;-1:-1:-1;2416:2:1;2401:18;;2388:32;2429:33;2388:32;2429:33;:::i;:::-;2481:7;-1:-1:-1;2535:2:1;2520:18;;2507:32;;-1:-1:-1;2590:2:1;2575:18;;2562:32;2617:18;2606:30;;2603:2;;;2654:6;2646;2639:22;2603:2;2682:22;;2735:4;2727:13;;2723:27;-1:-1:-1;2713:2:1;;2769:6;2761;2754:22;2713:2;2797:73;2862:7;2857:2;2844:16;2839:2;2835;2831:11;2797:73;:::i;:::-;2787:83;;;2182:694;;;;;;;:::o;2881:392::-;;;3007:2;2995:9;2986:7;2982:23;2978:32;2975:2;;;3028:6;3020;3013:22;2975:2;3072:9;3059:23;3091:31;3116:5;3091:31;:::i;:::-;3141:5;-1:-1:-1;3198:2:1;3183:18;;3170:32;3211:30;3170:32;3211:30;:::i;3278:325::-;;;3407:2;3395:9;3386:7;3382:23;3378:32;3375:2;;;3428:6;3420;3413:22;3375:2;3472:9;3459:23;3491:31;3516:5;3491:31;:::i;:::-;3541:5;3593:2;3578:18;;;;3565:32;;-1:-1:-1;;;3365:238:1:o;3608:251::-;;3717:2;3705:9;3696:7;3692:23;3688:32;3685:2;;;3738:6;3730;3723:22;3685:2;3782:9;3769:23;3801:28;3823:5;3801:28;:::i;3864:255::-;;3984:2;3972:9;3963:7;3959:23;3955:32;3952:2;;;4005:6;3997;3990:22;3952:2;4042:9;4036:16;4061:28;4083:5;4061:28;:::i;4124:255::-;;4235:2;4223:9;4214:7;4210:23;4206:32;4203:2;;;4256:6;4248;4241:22;4203:2;4300:9;4287:23;4319:30;4343:5;4319:30;:::i;4384:259::-;;4506:2;4494:9;4485:7;4481:23;4477:32;4474:2;;;4527:6;4519;4512:22;4474:2;4564:9;4558:16;4583:30;4607:5;4583:30;:::i;4648:190::-;;4760:2;4748:9;4739:7;4735:23;4731:32;4728:2;;;4781:6;4773;4766:22;4728:2;-1:-1:-1;4809:23:1;;4718:120;-1:-1:-1;4718:120:1:o;4843:258::-;;;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4993:6;4985;4978:22;4940:2;-1:-1:-1;;5021:23:1;;;5091:2;5076:18;;;5063:32;;-1:-1:-1;4930:171:1:o;5106:616::-;;;;5262:2;5250:9;5241:7;5237:23;5233:32;5230:2;;;5283:6;5275;5268:22;5230:2;5324:9;5311:23;5301:33;;5381:2;5370:9;5366:18;5353:32;5343:42;;5436:2;5425:9;5421:18;5408:32;5463:18;5455:6;5452:30;5449:2;;;5500:6;5492;5485:22;5449:2;5528:22;;5581:4;5573:13;;5569:27;-1:-1:-1;5559:2:1;;5615:6;5607;5600:22;5559:2;5643:73;5708:7;5703:2;5690:16;5685:2;5681;5677:11;5643:73;:::i;:::-;5633:83;;;5220:502;;;;;:::o;5727:357::-;;;5854:2;5842:9;5833:7;5829:23;5825:32;5822:2;;;5875:6;5867;5860:22;5822:2;5919:9;5906:23;5969:4;5962:5;5958:16;5951:5;5948:27;5938:2;;5994:6;5986;5979:22;6089:257;;6168:5;6162:12;6195:6;6190:3;6183:19;6211:63;6267:6;6260:4;6255:3;6251:14;6244:4;6237:5;6233:16;6211:63;:::i;:::-;6328:2;6307:15;-1:-1:-1;;6303:29:1;6294:39;;;;6335:4;6290:50;;6138:208;-1:-1:-1;;6138:208:1:o;6351:978::-;6436:12;;6351:978;;6508:1;6493:17;;6529:1;6565:18;;;;6592:2;;6646:4;6638:6;6634:17;6624:27;;6592:2;6672;6720;6712:6;6709:14;6689:18;6686:38;6683:2;;;-1:-1:-1;;;6747:33:1;;6803:4;6800:1;6793:15;6833:4;6754:3;6821:17;6683:2;6864:18;6891:104;;;;7009:1;7004:319;;;;6857:466;;6891:104;-1:-1:-1;;6924:24:1;;6912:37;;6969:16;;;;-1:-1:-1;6891:104:1;;7004:319;32510:127;32576:17;;;32626:4;32610:21;;7098:1;7112:165;7126:6;7123:1;7120:13;7112:165;;;7204:14;;7191:11;;;7184:35;7247:16;;;;7141:10;;7112:165;;;7116:3;;7306:6;7301:3;7297:16;7290:23;;6857:466;;;;;;;6409:920;;;;:::o;7464:274::-;;7631:6;7625:13;7647:53;7693:6;7688:3;7681:4;7673:6;7669:17;7647:53;:::i;:::-;7716:16;;;;;7601:137;-1:-1:-1;;7601:137:1:o;8024:470::-;;8241:6;8235:13;8257:53;8303:6;8298:3;8291:4;8283:6;8279:17;8257:53;:::i;:::-;8373:13;;8332:16;;;;8395:57;8373:13;8332:16;8429:4;8417:17;;8395:57;:::i;:::-;8468:20;;8211:283;-1:-1:-1;;;;8211:283:1:o;8499:1052::-;;8860:6;8854:13;8876:53;8922:6;8917:3;8910:4;8902:6;8898:17;8876:53;:::i;:::-;8992:13;;8951:16;;;;9014:57;8992:13;8951:16;9048:4;9036:17;;9014:57;:::i;:::-;9138:13;;9093:20;;;9160:57;9138:13;9093:20;9194:4;9182:17;;9160:57;:::i;:::-;9284:13;;9239:20;;;9306:57;9284:13;9239:20;9340:4;9328:17;;9306:57;:::i;:::-;9430:13;;9385:20;;;9452:57;9430:13;9385:20;9486:4;9474:17;;9452:57;:::i;:::-;9525:20;;8830:721;-1:-1:-1;;;;;;;8830:721:1:o;9556:1767::-;;10109:6;10103:13;10125:53;10171:6;10166:3;10159:4;10151:6;10147:17;10125:53;:::i;:::-;10209:6;10203:13;10225:68;10284:8;10275:6;10270:3;10266:16;10259:4;10251:6;10247:17;10225:68;:::i;:::-;10371:13;;10319:16;;;10315:31;;10393:57;10371:13;10315:31;10427:4;10415:17;;10393:57;:::i;:::-;10481:6;10475:13;10497:72;10560:8;10549;10542:5;10538:20;10531:4;10523:6;10519:17;10497:72;:::i;:::-;10651:13;;10595:20;;;;10591:35;;10673:57;10651:13;10591:35;10707:4;10695:17;;10673:57;:::i;:::-;10761:6;10755:13;10777:72;10840:8;10829;10822:5;10818:20;10811:4;10803:6;10799:17;10777:72;:::i;:::-;10931:13;;10875:20;;;;10871:35;;10953:57;10931:13;10871:35;10987:4;10975:17;;10953:57;:::i;:::-;11041:6;11035:13;11057:72;11120:8;11109;11102:5;11098:20;11091:4;11083:6;11079:17;11057:72;:::i;:::-;11208:13;;11152:20;;;;11148:35;;11230:54;11208:13;11148:35;11264:4;11252:17;;11230:54;:::i;:::-;11300:17;;10079:1244;-1:-1:-1;;;;;;;;;;;10079:1244:1:o;11328:615::-;;11646:6;11640:13;11662:53;11708:6;11703:3;11696:4;11688:6;11684:17;11662:53;:::i;:::-;-1:-1:-1;;;11737:16:1;;;11762:19;;;11806:13;;11828:65;11806:13;11880:1;11869:13;;11862:4;11850:17;;11828:65;:::i;:::-;11913:20;11935:1;11909:28;;11616:327;-1:-1:-1;;;;11616:327:1:o;11948:277::-;;12146:73;12180:38;12214:3;12206:6;12180:38;:::i;:::-;12172:6;12146:73;:::i;14323:423::-;;-1:-1:-1;;;14580:3:1;14573:21;14623:6;14617:13;14639:61;14693:6;14689:1;14684:3;14680:11;14673:4;14665:6;14661:17;14639:61;:::i;:::-;14720:16;;;;14738:1;14716:24;;14563:183;-1:-1:-1;;14563:183:1:o;15544:1485::-;-1:-1:-1;;;16044:61:1;;16128:13;;15544:1485;;16150:62;16128:13;16200:2;16191:12;;16184:4;16172:17;;16150:62;:::i;:::-;16240:6;16235:3;16231:16;16221:26;;16276:66;16271:2;16267;16263:11;16256:87;16372:34;16367:2;16363;16359:11;16352:55;16436:34;16431:2;16427;16423:11;16416:55;16501:34;16495:3;16491:2;16487:12;16480:56;16566:34;16560:3;16556:2;16552:12;16545:56;16631:34;16625:3;16621:2;16617:12;16610:56;16696:66;16690:3;16686:2;16682:12;16675:88;-1:-1:-1;;;16787:3:1;16783:2;16779:12;16772:46;16837:3;16871:6;16865:13;16887:63;16941:8;16936:2;16932;16928:11;16921:4;16913:6;16909:17;16887:63;:::i;:::-;16966:57;17019:2;17008:8;17004:2;17000:17;16996:26;-1:-1:-1;;;7399:27:1;;7451:1;7442:11;;7389:70;17298:448;;17560:31;17555:3;17548:44;17621:6;17615:13;17637:62;17692:6;17687:2;17682:3;17678:12;17671:4;17663:6;17659:17;17637:62;:::i;:::-;17719:16;;;;17737:2;17715:25;;17538:208;-1:-1:-1;;17538:208:1:o;20437:488::-;-1:-1:-1;;;;;20706:15:1;;;20688:34;;20758:15;;20753:2;20738:18;;20731:43;20805:2;20790:18;;20783:34;;;20853:3;20848:2;20833:18;;20826:31;;;20437:488;;20874:45;;20899:19;;20891:6;20874:45;:::i;:::-;20866:53;20640:285;-1:-1:-1;;;;;;20640:285:1:o;21624:219::-;;21773:2;21762:9;21755:21;21793:44;21833:2;21822:9;21818:18;21810:6;21793:44;:::i;22260:414::-;22462:2;22444:21;;;22501:2;22481:18;;;22474:30;22540:34;22535:2;22520:18;;22513:62;-1:-1:-1;;;22606:2:1;22591:18;;22584:48;22664:3;22649:19;;22434:240::o;27737:356::-;27939:2;27921:21;;;27958:18;;;27951:30;28017:34;28012:2;27997:18;;27990:62;28084:2;28069:18;;27911:182::o;28098:340::-;28300:2;28282:21;;;28339:2;28319:18;;;28312:30;-1:-1:-1;;;28373:2:1;28358:18;;28351:46;28429:2;28414:18;;28272:166::o;29255:413::-;29457:2;29439:21;;;29496:2;29476:18;;;29469:30;29535:34;29530:2;29515:18;;29508:62;-1:-1:-1;;;29601:2:1;29586:18;;29579:47;29658:3;29643:19;;29429:239::o;31188:355::-;31390:2;31372:21;;;31429:2;31409:18;;;31402:30;31468:33;31463:2;31448:18;;31441:61;31534:2;31519:18;;31362:181::o;32642:128::-;;32713:1;32709:6;32706:1;32703:13;32700:2;;;32719:18;;:::i;:::-;-1:-1:-1;32755:9:1;;32690:80::o;32775:120::-;;32841:1;32831:2;;32846:18;;:::i;:::-;-1:-1:-1;32880:9:1;;32821:74::o;32900:168::-;;33006:1;33002;32998:6;32994:14;32991:1;32988:21;32983:1;32976:9;32969:17;32965:45;32962:2;;;33013:18;;:::i;:::-;-1:-1:-1;33053:9:1;;32952:116::o;33073:125::-;;33141:1;33138;33135:8;33132:2;;;33146:18;;:::i;:::-;-1:-1:-1;33183:9:1;;33122:76::o;33203:258::-;33275:1;33285:113;33299:6;33296:1;33293:13;33285:113;;;33375:11;;;33369:18;33356:11;;;33349:39;33321:2;33314:10;33285:113;;;33416:6;33413:1;33410:13;33407:2;;;-1:-1:-1;;33451:1:1;33433:16;;33426:27;33256:205::o;33466:380::-;33551:1;33541:12;;33598:1;33588:12;;;33609:2;;33663:4;33655:6;33651:17;33641:27;;33609:2;33716;33708:6;33705:14;33685:18;33682:38;33679:2;;;33762:10;33757:3;33753:20;33750:1;33743:31;33797:4;33794:1;33787:15;33825:4;33822:1;33815:15;33679:2;;33521:325;;;:::o;33851:135::-;;-1:-1:-1;;33911:17:1;;33908:2;;;33931:18;;:::i;:::-;-1:-1:-1;33978:1:1;33967:13;;33898:88::o;33991:112::-;;34049:1;34039:2;;34054:18;;:::i;:::-;-1:-1:-1;34088:9:1;;34029:74::o;34108:127::-;34169:10;34164:3;34160:20;34157:1;34150:31;34200:4;34197:1;34190:15;34224:4;34221:1;34214:15;34240:127;34301:10;34296:3;34292:20;34289:1;34282:31;34332:4;34329:1;34322:15;34356:4;34353:1;34346:15;34372:127;34433:10;34428:3;34424:20;34421:1;34414:31;34464:4;34461:1;34454:15;34488:4;34485:1;34478:15;34504:131;-1:-1:-1;;;;;34579:31:1;;34569:42;;34559:2;;34625:1;34622;34615:12;34640:118;34726:5;34719:13;34712:21;34705:5;34702:32;34692:2;;34748:1;34745;34738:12;34763:131;-1:-1:-1;;;;;;34837:32:1;;34827:43;;34817:2;;34884:1;34881;34874:12
Swarm Source
ipfs://4419559faf1c90ec61da164f0594571986bb9a36246096da102771d14e5cf33b
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.