Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,031 ADV
Holders
227
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
10 ADVLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Adventurer
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-05 */ // 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); } /** * @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; } /** * @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); } } /* * @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; } } /** * @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); } } /** * @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; } } /** * @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); } /** * @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); } /** * @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); } } } } /** * @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; } } /** * @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 {} } /** * @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); } /** * @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(); } } contract Adventurer is ERC721Enumerable, ReentrancyGuard, Ownable { string[] private strength = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ]; string[] private agility = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ]; string[] private wisdom = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ]; 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 headArmor = [ "Ancient Helm", "Ornate Helm", "Great Helm", "Full Helm", "Helm", "Demon Crown", "Dragon's Crown", "War Cap", "Leather Cap", "Cap", "Crown", "Divine Hood", "Silk Hood", "Linen Hood", "Hood" ]; string[] private chestArmor = [ "Divine Robe", "Silk Robe", "Linen Robe", "Robe", "Shirt", "Demon Husk", "Dragonskin Armor", "Studded Leather Armor", "Hard Leather Armor", "Leather Armor", "Holy Chestplate", "Ornate Chestplate", "Plate Mail", "Chain Mail", "Ring Mail" ]; string[] private footArmor = [ "Holy Greaves", "Ornate Greaves", "Greaves", "Chain Boots", "Heavy Boots", "Demonhide Boots", "Dragonskin Boots", "Studded Leather Boots", "Hard Leather Boots", "Leather Boots", "Divine Slippers", "Silk Slippers", "Wool Shoes", "Linen Shoes", "Shoes" ]; string[] private zodiacs = [ "Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces" ]; string[] private languages = [ "HTML", "CSS", "JavaScript", "Solidity", "Python", "Golang", "Rust", "C++", "SQL", "Cairo", "Vyper", "Java", "Ruby" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getStrength(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "STRENGTH", strength); } function getAgility(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "AGILITY", agility); } function getWisdom(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "WISDOM", wisdom); } function getWeapon(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "WEAPON", weapons); } function getHead(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "HEAD", headArmor); } function getChest(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "CHEST", chestArmor); } function getFoot(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "FOOT", footArmor); } function getZodiac(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "ZODIAC", zodiacs); } function getLanguage(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "LANGUAGE", languages); } function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal pure returns (string memory) { uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))); string memory output = sourceArray[rand % sourceArray.length]; return output; } function tokenURI(uint256 tokenId) override public view returns (string memory) { string[19] memory parts; parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: black; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="white" /><text x="10" y="20" class="base">'; parts[1] = getStrength(tokenId); parts[2] = '</text><text x="10" y="40" class="base">'; parts[3] = getAgility(tokenId); parts[4] = '</text><text x="10" y="60" class="base">'; parts[5] = getWisdom(tokenId); parts[6] = '</text><text x="10" y="80" class="base">'; parts[7] = getWeapon(tokenId); parts[8] = '</text><text x="10" y="100" class="base">'; parts[9] = getHead(tokenId); parts[10] = '</text><text x="10" y="120" class="base">'; parts[11] = getChest(tokenId); parts[12] = '</text><text x="10" y="140" class="base">'; parts[13] = getFoot(tokenId); parts[14] = '</text><text x="10" y="160" class="base">'; parts[15] = getZodiac(tokenId); parts[16] = '</text><text x="10" y="180" class="base">'; parts[17] = getLanguage(tokenId); parts[18] = '</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], parts[13], parts[14], parts[15], parts[16], parts[17], parts[18])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Adventurer #', toString(tokenId), '", "description": "An Adventurer with randomized attributes generated and stored on-chain. Images and other functionality are intentionally omitted for others to interpret. Feel free to use Adventurer in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '", "attributes": [{"trait_type": "Strength","value": ', parts[1], ',"max_value": 10}, {"trait_type": "Agility","value": ', parts[3], ',"max_value": 10}, {"trait_type": "Wisdom","value": ', parts[5], ',"max_value": 10}]}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function claim(uint256 tokenId) public nonReentrant { require(tokenId > 0 && tokenId < 1001, "Token ID invalid"); _safeMint(_msgSender(), tokenId); } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 1000 && tokenId < 1112, "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("Adventurer", "ADV") Ownable() {} } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","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":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAgility","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getChest","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFoot","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHead","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLanguage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStrength","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWeapon","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWisdom","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getZodiac","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518061014001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f3130000000000000000000000000000000000000000000000000000000000000815250815250600c90600a6200026e92919062001de5565b506040518061014001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f3130000000000000000000000000000000000000000000000000000000000000815250815250600d90600a620004d992919062001de5565b506040518061014001604052806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f330000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f340000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f350000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f360000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f370000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f380000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600181526020017f390000000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600281526020017f3130000000000000000000000000000000000000000000000000000000000000815250815250600e90600a6200074492919062001de5565b506040518061024001604052806040518060400160405280600981526020017f57617268616d6d6572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f517561727465727374616666000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d61756c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6163650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f436c75620000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4b6174616e61000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f46616c6368696f6e00000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f5363696d6974617200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4c6f6e672053776f72640000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f53686f72742053776f726400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f47686f73742057616e640000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f47726176652057616e640000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f426f6e652057616e64000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f57616e640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f4772696d6f69726500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4368726f6e69636c65000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f546f6d650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f426f6f6b00000000000000000000000000000000000000000000000000000000815250815250600f90601262000b8792919062001e4c565b50604051806101e001604052806040518060400160405280600c81526020017f416e6369656e742048656c6d000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4f726e6174652048656c6d00000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f47726561742048656c6d0000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f46756c6c2048656c6d000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f48656c6d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f44656d6f6e2043726f776e00000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f447261676f6e27732043726f776e00000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f576172204361700000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4c6561746865722043617000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f436170000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f43726f776e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f446976696e6520486f6f6400000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f53696c6b20486f6f64000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4c696e656e20486f6f640000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f486f6f6400000000000000000000000000000000000000000000000000000000815250815250601090600f62000f1992919062001eb3565b50604051806101e001604052806040518060400160405280600b81526020017f446976696e6520526f626500000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f53696c6b20526f6265000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4c696e656e20526f62650000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f526f62650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f536869727400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f44656d6f6e204875736b0000000000000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f447261676f6e736b696e2041726d6f720000000000000000000000000000000081525081526020016040518060400160405280601581526020017f53747564646564204c6561746865722041726d6f72000000000000000000000081525081526020016040518060400160405280601281526020017f48617264204c6561746865722041726d6f72000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4c6561746865722041726d6f720000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f486f6c79204368657374706c617465000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f4f726e617465204368657374706c61746500000000000000000000000000000081525081526020016040518060400160405280600a81526020017f506c617465204d61696c0000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f436861696e204d61696c0000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f52696e67204d61696c0000000000000000000000000000000000000000000000815250815250601190600f620012ab92919062001eb3565b50604051806101e001604052806040518060400160405280600c81526020017f486f6c792047726561766573000000000000000000000000000000000000000081525081526020016040518060400160405280600e81526020017f4f726e617465204772656176657300000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f477265617665730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f436861696e20426f6f747300000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f486561767920426f6f747300000000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f44656d6f6e6869646520426f6f7473000000000000000000000000000000000081525081526020016040518060400160405280601081526020017f447261676f6e736b696e20426f6f74730000000000000000000000000000000081525081526020016040518060400160405280601581526020017f53747564646564204c65617468657220426f6f7473000000000000000000000081525081526020016040518060400160405280601281526020017f48617264204c65617468657220426f6f7473000000000000000000000000000081525081526020016040518060400160405280600d81526020017f4c65617468657220426f6f74730000000000000000000000000000000000000081525081526020016040518060400160405280600f81526020017f446976696e6520536c697070657273000000000000000000000000000000000081525081526020016040518060400160405280600d81526020017f53696c6b20536c6970706572730000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f576f6f6c2053686f65730000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4c696e656e2053686f657300000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53686f6573000000000000000000000000000000000000000000000000000000815250815250601290600f6200163d92919062001eb3565b506040518061018001604052806040518060400160405280600581526020017f417269657300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f546175727573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f47656d696e69000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f43616e636572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4c656f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f566972676f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f4c6962726100000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f53636f7270696f0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f536167697474617269757300000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f4361707269636f726e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f417175617269757300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f5069736365730000000000000000000000000000000000000000000000000000815250815250601390600c6200191e92919062001f1a565b50604051806101a001604052806040518060400160405280600481526020017f48544d4c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f435353000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4a6176615363726970740000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536f6c696469747900000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f507974686f6e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f476f6c616e67000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f527573740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f432b2b000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f53514c000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f436169726f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f567970657200000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4a6176610000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5275627900000000000000000000000000000000000000000000000000000000815250815250601490600d62001c3a92919062001f81565b5034801562001c4857600080fd5b506040518060400160405280600a81526020017f416476656e7475726572000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4144560000000000000000000000000000000000000000000000000000000000815250816000908051906020019062001ccd92919062001fe8565b50806001908051906020019062001ce692919062001fe8565b5050506001600a8190555062001d1162001d0562001d1760201b60201c565b62001d1f60201b60201c565b6200216b565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805482825590600052602060002090810192821562001e39579160200282015b8281111562001e3857825182908051906020019062001e2792919062001fe8565b509160200191906001019062001e06565b5b50905062001e48919062002079565b5090565b82805482825590600052602060002090810192821562001ea0579160200282015b8281111562001e9f57825182908051906020019062001e8e92919062001fe8565b509160200191906001019062001e6d565b5b50905062001eaf919062002079565b5090565b82805482825590600052602060002090810192821562001f07579160200282015b8281111562001f0657825182908051906020019062001ef592919062001fe8565b509160200191906001019062001ed4565b5b50905062001f16919062002079565b5090565b82805482825590600052602060002090810192821562001f6e579160200282015b8281111562001f6d57825182908051906020019062001f5c92919062001fe8565b509160200191906001019062001f3b565b5b50905062001f7d919062002079565b5090565b82805482825590600052602060002090810192821562001fd5579160200282015b8281111562001fd457825182908051906020019062001fc392919062001fe8565b509160200191906001019062001fa2565b5b50905062001fe4919062002079565b5090565b82805462001ff69062002106565b90600052602060002090601f0160209004810192826200201a576000855562002066565b82601f106200203557805160ff191683800117855562002066565b8280016001018555821562002066579182015b828111156200206557825182559160200191906001019062002048565b5b509050620020759190620020a1565b5090565b5b808211156200209d5760008181620020939190620020c0565b506001016200207a565b5090565b5b80821115620020bc576000816000905550600101620020a2565b5090565b508054620020ce9062002106565b6000825580601f10620020e2575062002103565b601f016020900490600052602060002090810190620021029190620020a1565b5b50565b600060028204905060018216806200211f57607f821691505b602082108114156200213657620021356200213c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615708806200217b6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063e985e9c511610071578063e985e9c5146105c5578063ef68075a146105f5578063f2fde38b14610625578063f700e6e114610641576101da565b8063a22cb4651461052d578063b88d4fde14610549578063c87b56dd14610565578063e53fbda614610595576101da565b80638da5cb5b116100de5780638da5cb5b1461049157806395d89b41146104af5780639720c969146104cd5780639e41b73f146104fd576101da565b806370a0823114610427578063715018a6146104575780638bbee1f314610461576101da565b806323b872dd1161017c57806342842e0e1161014b57806342842e0e1461038f578063434f48c4146103ab5780634f6ccce7146103c75780636352211e146103f7576101da565b806323b872dd146102f75780632f745c591461031357806330799dc614610343578063379607f514610373576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630c9066dd146102795780630e99990d146102a957806318160ddd146102d9576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613f8d565b610671565b6040516102069190614d54565b60405180910390f35b6102176106eb565b6040516102249190614d6f565b60405180910390f35b61024760048036038101906102429190613fdf565b61077d565b6040516102549190614ced565b60405180910390f35b61027760048036038101906102729190613f51565b610802565b005b610293600480360381019061028e9190613fdf565b61091a565b6040516102a09190614d6f565b60405180910390f35b6102c360048036038101906102be9190613fdf565b610a34565b6040516102d09190614d6f565b60405180910390f35b6102e1610b4e565b6040516102ee9190614ff1565b60405180910390f35b610311600480360381019061030c9190613e4b565b610b5b565b005b61032d60048036038101906103289190613f51565b610bbb565b60405161033a9190614ff1565b60405180910390f35b61035d60048036038101906103589190613fdf565b610c60565b60405161036a9190614d6f565b60405180910390f35b61038d60048036038101906103889190613fdf565b610d7a565b005b6103a960048036038101906103a49190613e4b565b610e34565b005b6103c560048036038101906103c09190613fdf565b610e54565b005b6103e160048036038101906103dc9190613fdf565b610f8b565b6040516103ee9190614ff1565b60405180910390f35b610411600480360381019061040c9190613fdf565b611022565b60405161041e9190614ced565b60405180910390f35b610441600480360381019061043c9190613de6565b6110d4565b60405161044e9190614ff1565b60405180910390f35b61045f61118c565b005b61047b60048036038101906104769190613fdf565b611214565b6040516104889190614d6f565b60405180910390f35b61049961132e565b6040516104a69190614ced565b60405180910390f35b6104b7611358565b6040516104c49190614d6f565b60405180910390f35b6104e760048036038101906104e29190613fdf565b6113ea565b6040516104f49190614d6f565b60405180910390f35b61051760048036038101906105129190613fdf565b611504565b6040516105249190614d6f565b60405180910390f35b61054760048036038101906105429190613f15565b61161e565b005b610563600480360381019061055e9190613e9a565b61179f565b005b61057f600480360381019061057a9190613fdf565b611801565b60405161058c9190614d6f565b60405180910390f35b6105af60048036038101906105aa9190613fdf565b612489565b6040516105bc9190614d6f565b60405180910390f35b6105df60048036038101906105da9190613e0f565b6125a3565b6040516105ec9190614d54565b60405180910390f35b61060f600480360381019061060a9190613fdf565b612637565b60405161061c9190614d6f565b60405180910390f35b61063f600480360381019061063a9190613de6565b612751565b005b61065b60048036038101906106569190613fdf565b612849565b6040516106689190614d6f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e457506106e382612963565b5b9050919050565b6060600080546106fa9061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546107269061527b565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b600061078882612a45565b6107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be90614ef1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080d82611022565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590614f71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089d612ab1565b73ffffffffffffffffffffffffffffffffffffffff1614806108cc57506108cb816108c6612ab1565b6125a3565b5b61090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e71565b60405180910390fd5b6109158383612ab9565b505050565b6060610a2d826040518060400160405280600681526020017f5a4f4449414300000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610a245783829060005260206000200180546109979061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061527b565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b505050505081526020019060010190610978565b50505050612b72565b9050919050565b6060610b47826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b3e578382906000526020600020018054610ab19061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061527b565b8015610b2a5780601f10610aff57610100808354040283529160200191610b2a565b820191906000526020600020905b815481529060010190602001808311610b0d57829003601f168201915b505050505081526020019060010190610a92565b50505050612b72565b9050919050565b6000600880549050905090565b610b6c610b66612ab1565b82612c07565b610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290614f91565b60405180910390fd5b610bb6838383612ce5565b505050565b6000610bc6836110d4565b8210610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614d91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d73826040518060400160405280600681526020017f574953444f4d0000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b82821015610d6a578382906000526020600020018054610cdd9061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d099061527b565b8015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505081526020019060010190610cbe565b50505050612b72565b9050919050565b6002600a541415610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790614fd1565b60405180910390fd5b6002600a81905550600081118015610dd957506103e981105b610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614f31565b60405180910390fd5b610e29610e23612ab1565b82612f41565b6001600a8190555050565b610e4f8383836040518060200160405280600081525061179f565b505050565b6002600a541415610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614fd1565b60405180910390fd5b6002600a81905550610eaa612ab1565b73ffffffffffffffffffffffffffffffffffffffff16610ec861132e565b73ffffffffffffffffffffffffffffffffffffffff1614610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590614f11565b60405180910390fd5b6103e881118015610f30575061045881105b610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690614f31565b60405180910390fd5b610f80610f7a61132e565b82612f41565b6001600a8190555050565b6000610f95610b4e565b8210610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90614fb1565b60405180910390fd5b60088281548110611010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290614eb1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614e91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611194612ab1565b73ffffffffffffffffffffffffffffffffffffffff166111b261132e565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90614f11565b60405180910390fd5b6112126000612f5f565b565b6060611327826040518060400160405280600781526020017f4147494c49545900000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561131e5783829060005260206000200180546112919061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546112bd9061527b565b801561130a5780601f106112df5761010080835404028352916020019161130a565b820191906000526020600020905b8154815290600101906020018083116112ed57829003601f168201915b505050505081526020019060010190611272565b50505050612b72565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113679061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546113939061527b565b80156113e05780601f106113b5576101008083540402835291602001916113e0565b820191906000526020600020905b8154815290600101906020018083116113c357829003601f168201915b5050505050905090565b60606114fd826040518060400160405280600481526020017f48454144000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114f45783829060005260206000200180546114679061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546114939061527b565b80156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b505050505081526020019060010190611448565b50505050612b72565b9050919050565b6060611617826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b8282101561160e5783829060005260206000200180546115819061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad9061527b565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b505050505081526020019060010190611562565b50505050612b72565b9050919050565b611626612ab1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90614e31565b60405180910390fd5b80600560006116a1612ab1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174e612ab1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117939190614d54565b60405180910390a35050565b6117b06117aa612ab1565b83612c07565b6117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614f91565b60405180910390fd5b6117fb84848484613025565b50505050565b606061180b613ced565b60405180610120016040528060fd81526020016155ad60fd91398160006013811061185f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061187083612489565b816001601381106118aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016155856028913981600260138110611905577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061191683611214565b81600360138110611950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161545160289139816004601381106119ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506119bc83610c60565b816005601381106119f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016154cb6028913981600660138110611a51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a6283611504565b81600760138110611a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154f36029913981600860138110611af7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b08836113ea565b81600960138110611b42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154a26029913981600a60138110611b9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611bae83612637565b81600b60138110611be8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806029815260200161551c6029913981600c60138110611c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c5483610a34565b81600d60138110611c8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154796029913981600e60138110611ce9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611cfa8361091a565b81600f60138110611d34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016156aa6029913981601060138110611d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611da083612849565b81601160138110611dda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601260138110611e52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060138110611e96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160138110611ed5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260138110611f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360138110611f53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460138110611f92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560138110611fd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660138110612010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518860076013811061204f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518960086013811061208e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016120ab99989796959493929190614b26565b604051602081830303815290604052905080826009601381106120f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60138110612136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60138110612175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c601381106121b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d601381106121f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60138110612232577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60138110612271577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896010601381106122b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a6011601381106122ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b60126013811061232e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161234d9b9a99989796959493929190614ba5565b6040516020818303038152906040529050600061245a61236c86613081565b6123758461322e565b856001601381106123af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866003601381106123ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518760056013811061242d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001612446959493929190614c60565b60405160208183030381529060405261322e565b90508060405160200161246d9190614c3e565b6040516020818303038152906040529150819350505050919050565b606061259c826040518060400160405280600881526020017f535452454e475448000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156125935783829060005260206000200180546125069061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546125329061527b565b801561257f5780601f106125545761010080835404028352916020019161257f565b820191906000526020600020905b81548152906001019060200180831161256257829003601f168201915b5050505050815260200190600101906124e7565b50505050612b72565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606061274a826040518060400160405280600581526020017f43484553540000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156127415783829060005260206000200180546126b49061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546126e09061527b565b801561272d5780601f106127025761010080835404028352916020019161272d565b820191906000526020600020905b81548152906001019060200180831161271057829003601f168201915b505050505081526020019060010190612695565b50505050612b72565b9050919050565b612759612ab1565b73ffffffffffffffffffffffffffffffffffffffff1661277761132e565b73ffffffffffffffffffffffffffffffffffffffff16146127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490614f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561283d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283490614dd1565b60405180910390fd5b61284681612f5f565b50565b606061295c826040518060400160405280600881526020017f4c414e47554147450000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b828210156129535783829060005260206000200180546128c69061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546128f29061527b565b801561293f5780601f106129145761010080835404028352916020019161293f565b820191906000526020600020905b81548152906001019060200180831161292257829003601f168201915b5050505050815260200190600101906128a7565b50505050612b72565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a3e5750612a3d826133ec565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b2c83611022565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000612ba884612b8387613081565b604051602001612b94929190614b02565b604051602081830303815290604052613456565b9050600083845183612bba91906152f6565b81518110612bf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080925050509392505050565b6000612c1282612a45565b612c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4890614e51565b60405180910390fd5b6000612c5c83611022565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ccb57508373ffffffffffffffffffffffffffffffffffffffff16612cb38461077d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cdc5750612cdb81856125a3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d0582611022565b73ffffffffffffffffffffffffffffffffffffffff1614612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614f51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc290614e11565b60405180910390fd5b612dd6838383613489565b612de1600082612ab9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e319190615191565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e8891906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f5b82826040518060200160405280600081525061359d565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613030848484612ce5565b61303c848484846135f8565b61307b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307290614db1565b60405180910390fd5b50505050565b606060008214156130c9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613229565b600082905060005b600082146130fb5780806130e4906152ad565b915050600a826130f49190615106565b91506130d1565b60008167ffffffffffffffff81111561313d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561316f5781602001600182028036833780820191505090505b5090505b60008514613222576001826131889190615191565b9150600a8561319791906152f6565b60306131a391906150b0565b60f81b8183815181106131df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321b9190615106565b9450613173565b8093505050505b919050565b6060600082519050600081141561325757604051806020016040528060008152509150506133e7565b6000600360028361326891906150b0565b6132729190615106565b600461327e9190615137565b9050600060208261328f91906150b0565b67ffffffffffffffff8111156132ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615545604091399050600181016020830160005b868110156133a45760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061332b565b5060038606600181146133be57600281146133ce576133d9565b613d3d60f01b60028303526133d9565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816040516020016134699190614aeb565b6040516020818303038152906040528051906020012060001c9050919050565b61349483838361378f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134d7576134d281613794565b613516565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135155761351483826137dd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613559576135548161394a565b613598565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613597576135968282613a8d565b5b5b505050565b6135a78383613b0c565b6135b460008484846135f8565b6135f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ea90614db1565b60405180910390fd5b505050565b60006136198473ffffffffffffffffffffffffffffffffffffffff16613cda565b15613782578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613642612ab1565b8786866040518563ffffffff1660e01b81526004016136649493929190614d08565b602060405180830381600087803b15801561367e57600080fd5b505af19250505080156136af57506040513d601f19601f820116820180604052508101906136ac9190613fb6565b60015b613732573d80600081146136df576040519150601f19603f3d011682016040523d82523d6000602084013e6136e4565b606091505b5060008151141561372a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372190614db1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613787565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137ea846110d4565b6137f49190615191565b90506000600760008481526020019081526020016000205490508181146138d9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061395e9190615191565b90506000600960008481526020019081526020016000205490506000600883815481106139b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106139fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613a98836110d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7390614ed1565b60405180910390fd5b613b8581612a45565b15613bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bbc90614df1565b60405180910390fd5b613bd160008383613489565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c2191906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061026001604052806013905b6060815260200190600190039081613cfd5790505090565b6000613d28613d238461503d565b61500c565b905082815260208101848484011115613d4057600080fd5b613d4b848285615239565b509392505050565b600081359050613d62816153f4565b92915050565b600081359050613d778161540b565b92915050565b600081359050613d8c81615422565b92915050565b600081519050613da181615422565b92915050565b600082601f830112613db857600080fd5b8135613dc8848260208601613d15565b91505092915050565b600081359050613de081615439565b92915050565b600060208284031215613df857600080fd5b6000613e0684828501613d53565b91505092915050565b60008060408385031215613e2257600080fd5b6000613e3085828601613d53565b9250506020613e4185828601613d53565b9150509250929050565b600080600060608486031215613e6057600080fd5b6000613e6e86828701613d53565b9350506020613e7f86828701613d53565b9250506040613e9086828701613dd1565b9150509250925092565b60008060008060808587031215613eb057600080fd5b6000613ebe87828801613d53565b9450506020613ecf87828801613d53565b9350506040613ee087828801613dd1565b925050606085013567ffffffffffffffff811115613efd57600080fd5b613f0987828801613da7565b91505092959194509250565b60008060408385031215613f2857600080fd5b6000613f3685828601613d53565b9250506020613f4785828601613d68565b9150509250929050565b60008060408385031215613f6457600080fd5b6000613f7285828601613d53565b9250506020613f8385828601613dd1565b9150509250929050565b600060208284031215613f9f57600080fd5b6000613fad84828501613d7d565b91505092915050565b600060208284031215613fc857600080fd5b6000613fd684828501613d92565b91505092915050565b600060208284031215613ff157600080fd5b6000613fff84828501613dd1565b91505092915050565b614011816151c5565b82525050565b614020816151d7565b82525050565b60006140318261506d565b61403b8185615083565b935061404b818560208601615248565b614054816153e3565b840191505092915050565b600061406a82615078565b6140748185615094565b9350614084818560208601615248565b61408d816153e3565b840191505092915050565b60006140a382615078565b6140ad81856150a5565b93506140bd818560208601615248565b80840191505092915050565b60006140d6602b83615094565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061413c603283615094565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141a2602683615094565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614208601c83615094565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006142486034836150a5565b91507f2c226d61785f76616c7565223a2031307d2c207b2274726169745f747970652260008301527f3a2022576973646f6d222c2276616c7565223a200000000000000000000000006020830152603482019050919050565b60006142ae602483615094565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614314601983615094565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614354602c83615094565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ba603883615094565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144206013836150a5565b91507f2c226d61785f76616c7565223a2031307d5d7d000000000000000000000000006000830152601382019050919050565b6000614460602a83615094565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c6602983615094565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061452c6035836150a5565b91507f2c226d61785f76616c7565223a2031307d2c207b2274726169745f747970652260008301527f3a20224167696c697479222c2276616c7565223a2000000000000000000000006020830152603582019050919050565b6000614592602083615094565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006145d2602c83615094565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614638602083615094565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614678601083615094565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b60006146b8602983615094565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061471e602183615094565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614785610104836150a5565b91507f222c20226465736372697074696f6e223a2022416e20416476656e747572657260008301527f20776974682072616e646f6d697a656420617474726962757465732067656e6560208301527f726174656420616e642073746f726564206f6e2d636861696e2e20496d61676560408301527f7320616e64206f746865722066756e6374696f6e616c6974792061726520696e60608301527f74656e74696f6e616c6c79206f6d697474656420666f72206f7468657273207460808301527f6f20696e746572707265742e204665656c206672656520746f2075736520416460a08301527f76656e747572657220696e20616e792077617920796f752077616e742e222c2060c08301527f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360e08301527f6536342c0000000000000000000000000000000000000000000000000000000061010083015261010482019050919050565b60006148f7601d836150a5565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614937603183615094565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061499d6035836150a5565b91507f222c202261747472696275746573223a205b7b2274726169745f74797065223a60008301527f2022537472656e677468222c2276616c7565223a2000000000000000000000006020830152603582019050919050565b6000614a03602c83615094565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a696016836150a5565b91507f7b226e616d65223a2022416476656e74757265722023000000000000000000006000830152601682019050919050565b6000614aa9601f83615094565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614ae58161522f565b82525050565b6000614af78284614098565b915081905092915050565b6000614b0e8285614098565b9150614b1a8284614098565b91508190509392505050565b6000614b32828c614098565b9150614b3e828b614098565b9150614b4a828a614098565b9150614b568289614098565b9150614b628288614098565b9150614b6e8287614098565b9150614b7a8286614098565b9150614b868285614098565b9150614b928284614098565b91508190509a9950505050505050505050565b6000614bb1828e614098565b9150614bbd828d614098565b9150614bc9828c614098565b9150614bd5828b614098565b9150614be1828a614098565b9150614bed8289614098565b9150614bf98288614098565b9150614c058287614098565b9150614c118286614098565b9150614c1d8285614098565b9150614c298284614098565b91508190509c9b505050505050505050505050565b6000614c49826148ea565b9150614c558284614098565b915081905092915050565b6000614c6b82614a5c565b9150614c778288614098565b9150614c8282614777565b9150614c8e8287614098565b9150614c9982614990565b9150614ca58286614098565b9150614cb08261451f565b9150614cbc8285614098565b9150614cc78261423b565b9150614cd38284614098565b9150614cde82614413565b91508190509695505050505050565b6000602082019050614d026000830184614008565b92915050565b6000608082019050614d1d6000830187614008565b614d2a6020830186614008565b614d376040830185614adc565b8181036060830152614d498184614026565b905095945050505050565b6000602082019050614d696000830184614017565b92915050565b60006020820190508181036000830152614d89818461405f565b905092915050565b60006020820190508181036000830152614daa816140c9565b9050919050565b60006020820190508181036000830152614dca8161412f565b9050919050565b60006020820190508181036000830152614dea81614195565b9050919050565b60006020820190508181036000830152614e0a816141fb565b9050919050565b60006020820190508181036000830152614e2a816142a1565b9050919050565b60006020820190508181036000830152614e4a81614307565b9050919050565b60006020820190508181036000830152614e6a81614347565b9050919050565b60006020820190508181036000830152614e8a816143ad565b9050919050565b60006020820190508181036000830152614eaa81614453565b9050919050565b60006020820190508181036000830152614eca816144b9565b9050919050565b60006020820190508181036000830152614eea81614585565b9050919050565b60006020820190508181036000830152614f0a816145c5565b9050919050565b60006020820190508181036000830152614f2a8161462b565b9050919050565b60006020820190508181036000830152614f4a8161466b565b9050919050565b60006020820190508181036000830152614f6a816146ab565b9050919050565b60006020820190508181036000830152614f8a81614711565b9050919050565b60006020820190508181036000830152614faa8161492a565b9050919050565b60006020820190508181036000830152614fca816149f6565b9050919050565b60006020820190508181036000830152614fea81614a9c565b9050919050565b60006020820190506150066000830184614adc565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615033576150326153b4565b5b8060405250919050565b600067ffffffffffffffff821115615058576150576153b4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150bb8261522f565b91506150c68361522f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150fb576150fa615327565b5b828201905092915050565b60006151118261522f565b915061511c8361522f565b92508261512c5761512b615356565b5b828204905092915050565b60006151428261522f565b915061514d8361522f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561518657615185615327565b5b828202905092915050565b600061519c8261522f565b91506151a78361522f565b9250828210156151ba576151b9615327565b5b828203905092915050565b60006151d08261520f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561526657808201518184015260208101905061524b565b83811115615275576000848401525b50505050565b6000600282049050600182168061529357607f821691505b602082108114156152a7576152a6615385565b5b50919050565b60006152b88261522f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152eb576152ea615327565b5b600182019050919050565b60006153018261522f565b915061530c8361522f565b92508261531c5761531b615356565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153fd816151c5565b811461540857600080fd5b50565b615414816151d7565b811461541f57600080fd5b50565b61542b816151e3565b811461543657600080fd5b50565b6154428161522f565b811461544d57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22776869746522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223138302220636c6173733d2262617365223ea264697066735822122032cb64d62dfc2be320f295244011720dc90cc610d0d2c32dd2fbf3101d81f24064736f6c63430008000033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063a22cb465116100a2578063e985e9c511610071578063e985e9c5146105c5578063ef68075a146105f5578063f2fde38b14610625578063f700e6e114610641576101da565b8063a22cb4651461052d578063b88d4fde14610549578063c87b56dd14610565578063e53fbda614610595576101da565b80638da5cb5b116100de5780638da5cb5b1461049157806395d89b41146104af5780639720c969146104cd5780639e41b73f146104fd576101da565b806370a0823114610427578063715018a6146104575780638bbee1f314610461576101da565b806323b872dd1161017c57806342842e0e1161014b57806342842e0e1461038f578063434f48c4146103ab5780634f6ccce7146103c75780636352211e146103f7576101da565b806323b872dd146102f75780632f745c591461031357806330799dc614610343578063379607f514610373576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630c9066dd146102795780630e99990d146102a957806318160ddd146102d9576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190613f8d565b610671565b6040516102069190614d54565b60405180910390f35b6102176106eb565b6040516102249190614d6f565b60405180910390f35b61024760048036038101906102429190613fdf565b61077d565b6040516102549190614ced565b60405180910390f35b61027760048036038101906102729190613f51565b610802565b005b610293600480360381019061028e9190613fdf565b61091a565b6040516102a09190614d6f565b60405180910390f35b6102c360048036038101906102be9190613fdf565b610a34565b6040516102d09190614d6f565b60405180910390f35b6102e1610b4e565b6040516102ee9190614ff1565b60405180910390f35b610311600480360381019061030c9190613e4b565b610b5b565b005b61032d60048036038101906103289190613f51565b610bbb565b60405161033a9190614ff1565b60405180910390f35b61035d60048036038101906103589190613fdf565b610c60565b60405161036a9190614d6f565b60405180910390f35b61038d60048036038101906103889190613fdf565b610d7a565b005b6103a960048036038101906103a49190613e4b565b610e34565b005b6103c560048036038101906103c09190613fdf565b610e54565b005b6103e160048036038101906103dc9190613fdf565b610f8b565b6040516103ee9190614ff1565b60405180910390f35b610411600480360381019061040c9190613fdf565b611022565b60405161041e9190614ced565b60405180910390f35b610441600480360381019061043c9190613de6565b6110d4565b60405161044e9190614ff1565b60405180910390f35b61045f61118c565b005b61047b60048036038101906104769190613fdf565b611214565b6040516104889190614d6f565b60405180910390f35b61049961132e565b6040516104a69190614ced565b60405180910390f35b6104b7611358565b6040516104c49190614d6f565b60405180910390f35b6104e760048036038101906104e29190613fdf565b6113ea565b6040516104f49190614d6f565b60405180910390f35b61051760048036038101906105129190613fdf565b611504565b6040516105249190614d6f565b60405180910390f35b61054760048036038101906105429190613f15565b61161e565b005b610563600480360381019061055e9190613e9a565b61179f565b005b61057f600480360381019061057a9190613fdf565b611801565b60405161058c9190614d6f565b60405180910390f35b6105af60048036038101906105aa9190613fdf565b612489565b6040516105bc9190614d6f565b60405180910390f35b6105df60048036038101906105da9190613e0f565b6125a3565b6040516105ec9190614d54565b60405180910390f35b61060f600480360381019061060a9190613fdf565b612637565b60405161061c9190614d6f565b60405180910390f35b61063f600480360381019061063a9190613de6565b612751565b005b61065b60048036038101906106569190613fdf565b612849565b6040516106689190614d6f565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e457506106e382612963565b5b9050919050565b6060600080546106fa9061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546107269061527b565b80156107735780601f1061074857610100808354040283529160200191610773565b820191906000526020600020905b81548152906001019060200180831161075657829003601f168201915b5050505050905090565b600061078882612a45565b6107c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107be90614ef1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061080d82611022565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590614f71565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089d612ab1565b73ffffffffffffffffffffffffffffffffffffffff1614806108cc57506108cb816108c6612ab1565b6125a3565b5b61090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290614e71565b60405180910390fd5b6109158383612ab9565b505050565b6060610a2d826040518060400160405280600681526020017f5a4f4449414300000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610a245783829060005260206000200180546109979061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546109c39061527b565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b505050505081526020019060010190610978565b50505050612b72565b9050919050565b6060610b47826040518060400160405280600481526020017f464f4f54000000000000000000000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610b3e578382906000526020600020018054610ab19061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610add9061527b565b8015610b2a5780601f10610aff57610100808354040283529160200191610b2a565b820191906000526020600020905b815481529060010190602001808311610b0d57829003601f168201915b505050505081526020019060010190610a92565b50505050612b72565b9050919050565b6000600880549050905090565b610b6c610b66612ab1565b82612c07565b610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba290614f91565b60405180910390fd5b610bb6838383612ce5565b505050565b6000610bc6836110d4565b8210610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614d91565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610d73826040518060400160405280600681526020017f574953444f4d0000000000000000000000000000000000000000000000000000815250600e805480602002602001604051908101604052809291908181526020016000905b82821015610d6a578382906000526020600020018054610cdd9061527b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d099061527b565b8015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505081526020019060010190610cbe565b50505050612b72565b9050919050565b6002600a541415610dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db790614fd1565b60405180910390fd5b6002600a81905550600081118015610dd957506103e981105b610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614f31565b60405180910390fd5b610e29610e23612ab1565b82612f41565b6001600a8190555050565b610e4f8383836040518060200160405280600081525061179f565b505050565b6002600a541415610e9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9190614fd1565b60405180910390fd5b6002600a81905550610eaa612ab1565b73ffffffffffffffffffffffffffffffffffffffff16610ec861132e565b73ffffffffffffffffffffffffffffffffffffffff1614610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1590614f11565b60405180910390fd5b6103e881118015610f30575061045881105b610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690614f31565b60405180910390fd5b610f80610f7a61132e565b82612f41565b6001600a8190555050565b6000610f95610b4e565b8210610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90614fb1565b60405180910390fd5b60088281548110611010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c290614eb1565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113c90614e91565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611194612ab1565b73ffffffffffffffffffffffffffffffffffffffff166111b261132e565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90614f11565b60405180910390fd5b6112126000612f5f565b565b6060611327826040518060400160405280600781526020017f4147494c49545900000000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b8282101561131e5783829060005260206000200180546112919061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546112bd9061527b565b801561130a5780601f106112df5761010080835404028352916020019161130a565b820191906000526020600020905b8154815290600101906020018083116112ed57829003601f168201915b505050505081526020019060010190611272565b50505050612b72565b9050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113679061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546113939061527b565b80156113e05780601f106113b5576101008083540402835291602001916113e0565b820191906000526020600020905b8154815290600101906020018083116113c357829003601f168201915b5050505050905090565b60606114fd826040518060400160405280600481526020017f48454144000000000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b828210156114f45783829060005260206000200180546114679061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546114939061527b565b80156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b505050505081526020019060010190611448565b50505050612b72565b9050919050565b6060611617826040518060400160405280600681526020017f574541504f4e0000000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b8282101561160e5783829060005260206000200180546115819061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad9061527b565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b505050505081526020019060010190611562565b50505050612b72565b9050919050565b611626612ab1565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168b90614e31565b60405180910390fd5b80600560006116a1612ab1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661174e612ab1565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117939190614d54565b60405180910390a35050565b6117b06117aa612ab1565b83612c07565b6117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e690614f91565b60405180910390fd5b6117fb84848484613025565b50505050565b606061180b613ced565b60405180610120016040528060fd81526020016155ad60fd91398160006013811061185f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061187083612489565b816001601381106118aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016155856028913981600260138110611905577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061191683611214565b81600360138110611950577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806028815260200161545160289139816004601381106119ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506119bc83610c60565b816005601381106119f6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602881526020016154cb6028913981600660138110611a51577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611a6283611504565b81600760138110611a9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154f36029913981600860138110611af7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611b08836113ea565b81600960138110611b42577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154a26029913981600a60138110611b9d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611bae83612637565b81600b60138110611be8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525060405180606001604052806029815260200161551c6029913981600c60138110611c43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611c5483610a34565b81600d60138110611c8e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016154796029913981600e60138110611ce9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611cfa8361091a565b81600f60138110611d34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060600160405280602981526020016156aa6029913981601060138110611d8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611da083612849565b81601160138110611dda577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081601260138110611e52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250600081600060138110611e96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015182600160138110611ed5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600260138110611f14577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600360138110611f53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600460138110611f92577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600560138110611fd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600660138110612010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518860076013811061204f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518960086013811061208e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516040516020016120ab99989796959493929190614b26565b604051602081830303815290604052905080826009601381106120f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a60138110612136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b60138110612175577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c601381106121b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015186600d601381106121f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015187600e60138110612232577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015188600f60138110612271577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896010601381106122b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518a6011601381106122ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518b60126013811061232e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015160405160200161234d9b9a99989796959493929190614ba5565b6040516020818303038152906040529050600061245a61236c86613081565b6123758461322e565b856001601381106123af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866003601381106123ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201518760056013811061242d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001612446959493929190614c60565b60405160208183030381529060405261322e565b90508060405160200161246d9190614c3e565b6040516020818303038152906040529150819350505050919050565b606061259c826040518060400160405280600881526020017f535452454e475448000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156125935783829060005260206000200180546125069061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546125329061527b565b801561257f5780601f106125545761010080835404028352916020019161257f565b820191906000526020600020905b81548152906001019060200180831161256257829003601f168201915b5050505050815260200190600101906124e7565b50505050612b72565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606061274a826040518060400160405280600581526020017f43484553540000000000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b828210156127415783829060005260206000200180546126b49061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546126e09061527b565b801561272d5780601f106127025761010080835404028352916020019161272d565b820191906000526020600020905b81548152906001019060200180831161271057829003601f168201915b505050505081526020019060010190612695565b50505050612b72565b9050919050565b612759612ab1565b73ffffffffffffffffffffffffffffffffffffffff1661277761132e565b73ffffffffffffffffffffffffffffffffffffffff16146127cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c490614f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561283d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283490614dd1565b60405180910390fd5b61284681612f5f565b50565b606061295c826040518060400160405280600881526020017f4c414e47554147450000000000000000000000000000000000000000000000008152506014805480602002602001604051908101604052809291908181526020016000905b828210156129535783829060005260206000200180546128c69061527b565b80601f01602080910402602001604051908101604052809291908181526020018280546128f29061527b565b801561293f5780601f106129145761010080835404028352916020019161293f565b820191906000526020600020905b81548152906001019060200180831161292257829003601f168201915b5050505050815260200190600101906128a7565b50505050612b72565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a2e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612a3e5750612a3d826133ec565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b2c83611022565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60606000612ba884612b8387613081565b604051602001612b94929190614b02565b604051602081830303815290604052613456565b9050600083845183612bba91906152f6565b81518110612bf1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080925050509392505050565b6000612c1282612a45565b612c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4890614e51565b60405180910390fd5b6000612c5c83611022565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ccb57508373ffffffffffffffffffffffffffffffffffffffff16612cb38461077d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612cdc5750612cdb81856125a3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d0582611022565b73ffffffffffffffffffffffffffffffffffffffff1614612d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5290614f51565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc290614e11565b60405180910390fd5b612dd6838383613489565b612de1600082612ab9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e319190615191565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e8891906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612f5b82826040518060200160405280600081525061359d565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613030848484612ce5565b61303c848484846135f8565b61307b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307290614db1565b60405180910390fd5b50505050565b606060008214156130c9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613229565b600082905060005b600082146130fb5780806130e4906152ad565b915050600a826130f49190615106565b91506130d1565b60008167ffffffffffffffff81111561313d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561316f5781602001600182028036833780820191505090505b5090505b60008514613222576001826131889190615191565b9150600a8561319791906152f6565b60306131a391906150b0565b60f81b8183815181106131df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561321b9190615106565b9450613173565b8093505050505b919050565b6060600082519050600081141561325757604051806020016040528060008152509150506133e7565b6000600360028361326891906150b0565b6132729190615106565b600461327e9190615137565b9050600060208261328f91906150b0565b67ffffffffffffffff8111156132ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156133005781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001615545604091399050600181016020830160005b868110156133a45760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061332b565b5060038606600181146133be57600281146133ce576133d9565b613d3d60f01b60028303526133d9565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816040516020016134699190614aeb565b6040516020818303038152906040528051906020012060001c9050919050565b61349483838361378f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134d7576134d281613794565b613516565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146135155761351483826137dd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613559576135548161394a565b613598565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613597576135968282613a8d565b5b5b505050565b6135a78383613b0c565b6135b460008484846135f8565b6135f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ea90614db1565b60405180910390fd5b505050565b60006136198473ffffffffffffffffffffffffffffffffffffffff16613cda565b15613782578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613642612ab1565b8786866040518563ffffffff1660e01b81526004016136649493929190614d08565b602060405180830381600087803b15801561367e57600080fd5b505af19250505080156136af57506040513d601f19601f820116820180604052508101906136ac9190613fb6565b60015b613732573d80600081146136df576040519150601f19603f3d011682016040523d82523d6000602084013e6136e4565b606091505b5060008151141561372a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372190614db1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613787565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016137ea846110d4565b6137f49190615191565b90506000600760008481526020019081526020016000205490508181146138d9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061395e9190615191565b90506000600960008481526020019081526020016000205490506000600883815481106139b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106139fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613a98836110d4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7390614ed1565b60405180910390fd5b613b8581612a45565b15613bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bbc90614df1565b60405180910390fd5b613bd160008383613489565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613c2191906150b0565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518061026001604052806013905b6060815260200190600190039081613cfd5790505090565b6000613d28613d238461503d565b61500c565b905082815260208101848484011115613d4057600080fd5b613d4b848285615239565b509392505050565b600081359050613d62816153f4565b92915050565b600081359050613d778161540b565b92915050565b600081359050613d8c81615422565b92915050565b600081519050613da181615422565b92915050565b600082601f830112613db857600080fd5b8135613dc8848260208601613d15565b91505092915050565b600081359050613de081615439565b92915050565b600060208284031215613df857600080fd5b6000613e0684828501613d53565b91505092915050565b60008060408385031215613e2257600080fd5b6000613e3085828601613d53565b9250506020613e4185828601613d53565b9150509250929050565b600080600060608486031215613e6057600080fd5b6000613e6e86828701613d53565b9350506020613e7f86828701613d53565b9250506040613e9086828701613dd1565b9150509250925092565b60008060008060808587031215613eb057600080fd5b6000613ebe87828801613d53565b9450506020613ecf87828801613d53565b9350506040613ee087828801613dd1565b925050606085013567ffffffffffffffff811115613efd57600080fd5b613f0987828801613da7565b91505092959194509250565b60008060408385031215613f2857600080fd5b6000613f3685828601613d53565b9250506020613f4785828601613d68565b9150509250929050565b60008060408385031215613f6457600080fd5b6000613f7285828601613d53565b9250506020613f8385828601613dd1565b9150509250929050565b600060208284031215613f9f57600080fd5b6000613fad84828501613d7d565b91505092915050565b600060208284031215613fc857600080fd5b6000613fd684828501613d92565b91505092915050565b600060208284031215613ff157600080fd5b6000613fff84828501613dd1565b91505092915050565b614011816151c5565b82525050565b614020816151d7565b82525050565b60006140318261506d565b61403b8185615083565b935061404b818560208601615248565b614054816153e3565b840191505092915050565b600061406a82615078565b6140748185615094565b9350614084818560208601615248565b61408d816153e3565b840191505092915050565b60006140a382615078565b6140ad81856150a5565b93506140bd818560208601615248565b80840191505092915050565b60006140d6602b83615094565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061413c603283615094565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006141a2602683615094565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614208601c83615094565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006142486034836150a5565b91507f2c226d61785f76616c7565223a2031307d2c207b2274726169745f747970652260008301527f3a2022576973646f6d222c2276616c7565223a200000000000000000000000006020830152603482019050919050565b60006142ae602483615094565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614314601983615094565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614354602c83615094565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143ba603883615094565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006144206013836150a5565b91507f2c226d61785f76616c7565223a2031307d5d7d000000000000000000000000006000830152601382019050919050565b6000614460602a83615094565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c6602983615094565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061452c6035836150a5565b91507f2c226d61785f76616c7565223a2031307d2c207b2274726169745f747970652260008301527f3a20224167696c697479222c2276616c7565223a2000000000000000000000006020830152603582019050919050565b6000614592602083615094565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006145d2602c83615094565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614638602083615094565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614678601083615094565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b60006146b8602983615094565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061471e602183615094565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614785610104836150a5565b91507f222c20226465736372697074696f6e223a2022416e20416476656e747572657260008301527f20776974682072616e646f6d697a656420617474726962757465732067656e6560208301527f726174656420616e642073746f726564206f6e2d636861696e2e20496d61676560408301527f7320616e64206f746865722066756e6374696f6e616c6974792061726520696e60608301527f74656e74696f6e616c6c79206f6d697474656420666f72206f7468657273207460808301527f6f20696e746572707265742e204665656c206672656520746f2075736520416460a08301527f76656e747572657220696e20616e792077617920796f752077616e742e222c2060c08301527f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360e08301527f6536342c0000000000000000000000000000000000000000000000000000000061010083015261010482019050919050565b60006148f7601d836150a5565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b6000614937603183615094565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061499d6035836150a5565b91507f222c202261747472696275746573223a205b7b2274726169745f74797065223a60008301527f2022537472656e677468222c2276616c7565223a2000000000000000000000006020830152603582019050919050565b6000614a03602c83615094565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a696016836150a5565b91507f7b226e616d65223a2022416476656e74757265722023000000000000000000006000830152601682019050919050565b6000614aa9601f83615094565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614ae58161522f565b82525050565b6000614af78284614098565b915081905092915050565b6000614b0e8285614098565b9150614b1a8284614098565b91508190509392505050565b6000614b32828c614098565b9150614b3e828b614098565b9150614b4a828a614098565b9150614b568289614098565b9150614b628288614098565b9150614b6e8287614098565b9150614b7a8286614098565b9150614b868285614098565b9150614b928284614098565b91508190509a9950505050505050505050565b6000614bb1828e614098565b9150614bbd828d614098565b9150614bc9828c614098565b9150614bd5828b614098565b9150614be1828a614098565b9150614bed8289614098565b9150614bf98288614098565b9150614c058287614098565b9150614c118286614098565b9150614c1d8285614098565b9150614c298284614098565b91508190509c9b505050505050505050505050565b6000614c49826148ea565b9150614c558284614098565b915081905092915050565b6000614c6b82614a5c565b9150614c778288614098565b9150614c8282614777565b9150614c8e8287614098565b9150614c9982614990565b9150614ca58286614098565b9150614cb08261451f565b9150614cbc8285614098565b9150614cc78261423b565b9150614cd38284614098565b9150614cde82614413565b91508190509695505050505050565b6000602082019050614d026000830184614008565b92915050565b6000608082019050614d1d6000830187614008565b614d2a6020830186614008565b614d376040830185614adc565b8181036060830152614d498184614026565b905095945050505050565b6000602082019050614d696000830184614017565b92915050565b60006020820190508181036000830152614d89818461405f565b905092915050565b60006020820190508181036000830152614daa816140c9565b9050919050565b60006020820190508181036000830152614dca8161412f565b9050919050565b60006020820190508181036000830152614dea81614195565b9050919050565b60006020820190508181036000830152614e0a816141fb565b9050919050565b60006020820190508181036000830152614e2a816142a1565b9050919050565b60006020820190508181036000830152614e4a81614307565b9050919050565b60006020820190508181036000830152614e6a81614347565b9050919050565b60006020820190508181036000830152614e8a816143ad565b9050919050565b60006020820190508181036000830152614eaa81614453565b9050919050565b60006020820190508181036000830152614eca816144b9565b9050919050565b60006020820190508181036000830152614eea81614585565b9050919050565b60006020820190508181036000830152614f0a816145c5565b9050919050565b60006020820190508181036000830152614f2a8161462b565b9050919050565b60006020820190508181036000830152614f4a8161466b565b9050919050565b60006020820190508181036000830152614f6a816146ab565b9050919050565b60006020820190508181036000830152614f8a81614711565b9050919050565b60006020820190508181036000830152614faa8161492a565b9050919050565b60006020820190508181036000830152614fca816149f6565b9050919050565b60006020820190508181036000830152614fea81614a9c565b9050919050565b60006020820190506150066000830184614adc565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615033576150326153b4565b5b8060405250919050565b600067ffffffffffffffff821115615058576150576153b4565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150bb8261522f565b91506150c68361522f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156150fb576150fa615327565b5b828201905092915050565b60006151118261522f565b915061511c8361522f565b92508261512c5761512b615356565b5b828204905092915050565b60006151428261522f565b915061514d8361522f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561518657615185615327565b5b828202905092915050565b600061519c8261522f565b91506151a78361522f565b9250828210156151ba576151b9615327565b5b828203905092915050565b60006151d08261520f565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561526657808201518184015260208101905061524b565b83811115615275576000848401525b50505050565b6000600282049050600182168061529357607f821691505b602082108114156152a7576152a6615385565b5b50919050565b60006152b88261522f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156152eb576152ea615327565b5b600182019050919050565b60006153018261522f565b915061530c8361522f565b92508261531c5761531b615356565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6153fd816151c5565b811461540857600080fd5b50565b615414816151d7565b811461541f57600080fd5b50565b61542b816151e3565b811461543657600080fd5b50565b6154428161522f565b811461544d57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22776869746522202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223138302220636c6173733d2262617365223ea264697066735822122032cb64d62dfc2be320f295244011720dc90cc610d0d2c32dd2fbf3101d81f24064736f6c63430008000033
Deployed Bytecode Sourcemap
44500:8214:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38350:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25464:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27023:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26546:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48497:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48356:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38990:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27913:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38658:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47794:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51549:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28323:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51733;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39180:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25158:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24888:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9856:94;;;:::i;:::-;;47649:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9205:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25633:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48075:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47936:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27316:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28579:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49113:2428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47501:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27682:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48212:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10105:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48640:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38350:224;38452:4;38491:35;38476:50;;;:11;:50;;;;:90;;;;38530:36;38554:11;38530:23;:36::i;:::-;38476:90;38469:97;;38350:224;;;:::o;25464:100::-;25518:13;25551:5;25544:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25464:100;:::o;27023:221::-;27099:7;27127:16;27135:7;27127;:16::i;:::-;27119:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27212:15;:24;27228:7;27212:24;;;;;;;;;;;;;;;;;;;;;27205:31;;27023:221;;;:::o;26546:411::-;26627:13;26643:23;26658:7;26643:14;:23::i;:::-;26627:39;;26691:5;26685:11;;:2;:11;;;;26677:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:5;26769:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26794:37;26811:5;26818:12;:10;:12::i;:::-;26794:16;:37::i;:::-;26769:62;26747:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26928:21;26937:2;26941:7;26928:8;:21::i;:::-;26546:411;;;:::o;48497:131::-;48554:13;48587:33;48593:7;48587:33;;;;;;;;;;;;;;;;;48612:7;48587:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;48580:40;;48497:131;;;:::o;48356:129::-;48411:13;48444:33;48450:7;48444:33;;;;;;;;;;;;;;;;;48467:9;48444:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;48437:40;;48356:129;;;:::o;38990:113::-;39051:7;39078:10;:17;;;;39071:24;;38990:113;:::o;27913:339::-;28108:41;28127:12;:10;:12::i;:::-;28141:7;28108:18;:41::i;:::-;28100:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28216:28;28226:4;28232:2;28236:7;28216:9;:28::i;:::-;27913:339;;;:::o;38658:256::-;38755:7;38791:23;38808:5;38791:16;:23::i;:::-;38783:5;:31;38775:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38880:12;:19;38893:5;38880:19;;;;;;;;;;;;;;;:26;38900:5;38880:26;;;;;;;;;;;;38873:33;;38658:256;;;;:::o;47794:130::-;47851:13;47884:32;47890:7;47884:32;;;;;;;;;;;;;;;;;47909:6;47884:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;:::-;47877:39;;47794:130;;;:::o;51549:172::-;12144:1;12740:7;;:19;;12732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12144:1;12873:7;:18;;;;51630:1:::1;51620:7;:11;:29;;;;;51645:4;51635:7;:14;51620:29;51612:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51681:32;51691:12;:10;:12::i;:::-;51705:7;51681:9;:32::i;:::-;12100:1:::0;13052:7;:22;;;;51549:172;:::o;28323:185::-;28461:39;28478:4;28484:2;28488:7;28461:39;;;;;;;;;;;;:16;:39::i;:::-;28323:185;;;:::o;51733:::-;12144:1;12740:7;;:19;;12732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12144:1;12873:7;:18;;;;9436:12:::1;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51829:4:::2;51819:7;:14;:32;;;;;51847:4;51837:7;:14;51819:32;51811:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51883:27;51893:7;:5;:7::i;:::-;51902;51883:9;:27::i;:::-;12100:1:::0;13052:7;:22;;;;51733:185;:::o;39180:233::-;39255:7;39291:30;:28;:30::i;:::-;39283:5;:38;39275:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39388:10;39399:5;39388:17;;;;;;;;;;;;;;;;;;;;;;;;39381:24;;39180:233;;;:::o;25158:239::-;25230:7;25250:13;25266:7;:16;25274:7;25266:16;;;;;;;;;;;;;;;;;;;;;25250:32;;25318:1;25301:19;;:5;:19;;;;25293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25384:5;25377:12;;;25158:239;;;:::o;24888:208::-;24960:7;25005:1;24988:19;;:5;:19;;;;24980:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25072:9;:16;25082:5;25072:16;;;;;;;;;;;;;;;;25065:23;;24888:208;;;:::o;9856:94::-;9436:12;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9921:21:::1;9939:1;9921:9;:21::i;:::-;9856:94::o:0;47649:133::-;47707:13;47740:34;47746:7;47740:34;;;;;;;;;;;;;;;;;47766:7;47740:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:34::i;:::-;47733:41;;47649:133;;;:::o;9205:87::-;9251:7;9278:6;;;;;;;;;;;9271:13;;9205:87;:::o;25633:104::-;25689:13;25722:7;25715:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25633:104;:::o;48075:129::-;48130:13;48163:33;48169:7;48163:33;;;;;;;;;;;;;;;;;48186:9;48163:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;48156:40;;48075:129;;;:::o;47936:131::-;47993:13;48026:33;48032:7;48026:33;;;;;;;;;;;;;;;;;48051:7;48026:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:33::i;:::-;48019:40;;47936:131;;;:::o;27316:295::-;27431:12;:10;:12::i;:::-;27419:24;;:8;:24;;;;27411:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27531:8;27486:18;:32;27505:12;:10;:12::i;:::-;27486:32;;;;;;;;;;;;;;;:42;27519:8;27486:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27584:8;27555:48;;27570:12;:10;:12::i;:::-;27555:48;;;27594:8;27555:48;;;;;;:::i;:::-;;;;;;;;27316:295;;:::o;28579:328::-;28754:41;28773:12;:10;:12::i;:::-;28787:7;28754:18;:41::i;:::-;28746:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:39;28874:4;28880:2;28884:7;28893:5;28860:13;:39::i;:::-;28579:328;;;;:::o;49113:2428::-;49178:13;49204:23;;:::i;:::-;49238:266;;;;;;;;;;;;;;;;;:5;49244:1;49238:8;;;;;;;;;;;;;;;;;;:266;;;;49528:20;49540:7;49528:11;:20::i;:::-;49517:5;49523:1;49517:8;;;;;;;;;;;;;;;;;;:31;;;;49561:53;;;;;;;;;;;;;;;;;:5;49567:1;49561:8;;;;;;;;;;;;;;;;;;:53;;;;49638:19;49649:7;49638:10;:19::i;:::-;49627:5;49633:1;49627:8;;;;;;;;;;;;;;;;;;:30;;;;49670:53;;;;;;;;;;;;;;;;;:5;49676:1;49670:8;;;;;;;;;;;;;;;;;;:53;;;;49747:18;49757:7;49747:9;:18::i;:::-;49736:5;49742:1;49736:8;;;;;;;;;;;;;;;;;;:29;;;;49778:53;;;;;;;;;;;;;;;;;:5;49784:1;49778:8;;;;;;;;;;;;;;;;;;:53;;;;49855:18;49865:7;49855:9;:18::i;:::-;49844:5;49850:1;49844:8;;;;;;;;;;;;;;;;;;:29;;;;49886:54;;;;;;;;;;;;;;;;;:5;49892:1;49886:8;;;;;;;;;;;;;;;;;;:54;;;;49964:16;49972:7;49964;:16::i;:::-;49953:5;49959:1;49953:8;;;;;;;;;;;;;;;;;;:27;;;;49993:55;;;;;;;;;;;;;;;;;:5;49999:2;49993:9;;;;;;;;;;;;;;;;;;:55;;;;50073:17;50082:7;50073:8;:17::i;:::-;50061:5;50067:2;50061:9;;;;;;;;;;;;;;;;;;:29;;;;50103:55;;;;;;;;;;;;;;;;;:5;50109:2;50103:9;;;;;;;;;;;;;;;;;;:55;;;;50183:16;50191:7;50183;:16::i;:::-;50171:5;50177:2;50171:9;;;;;;;;;;;;;;;;;;:28;;;;50212:55;;;;;;;;;;;;;;;;;:5;50218:2;50212:9;;;;;;;;;;;;;;;;;;:55;;;;50292:18;50302:7;50292:9;:18::i;:::-;50280:5;50286:2;50280:9;;;;;;;;;;;;;;;;;;:30;;;;50323:55;;;;;;;;;;;;;;;;;:5;50329:2;50323:9;;;;;;;;;;;;;;;;;;:55;;;;50403:20;50415:7;50403:11;:20::i;:::-;50391:5;50397:2;50391:9;;;;;;;;;;;;;;;;;;:32;;;;50436:27;;;;;;;;;;;;;;;;;:5;50442:2;50436:9;;;;;;;;;;;;;;;;;;:27;;;;50476:20;50523:5;50529:1;50523:8;;;;;;;;;;;;;;;;;;;50533:5;50539:1;50533:8;;;;;;;;;;;;;;;;;;;50543:5;50549:1;50543:8;;;;;;;;;;;;;;;;;;;50553:5;50559:1;50553:8;;;;;;;;;;;;;;;;;;;50563:5;50569:1;50563:8;;;;;;;;;;;;;;;;;;;50573:5;50579:1;50573:8;;;;;;;;;;;;;;;;;;;50583:5;50589:1;50583:8;;;;;;;;;;;;;;;;;;;50593:5;50599:1;50593:8;;;;;;;;;;;;;;;;;;;50603:5;50609:1;50603:8;;;;;;;;;;;;;;;;;;;50506:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50476:137;;50657:6;50665:5;50671:1;50665:8;;;;;;;;;;;;;;;;;;;50675:5;50681:2;50675:9;;;;;;;;;;;;;;;;;;;50686:5;50692:2;50686:9;;;;;;;;;;;;;;;;;;;50697:5;50703:2;50697:9;;;;;;;;;;;;;;;;;;;50708:5;50714:2;50708:9;;;;;;;;;;;;;;;;;;;50719:5;50725:2;50719:9;;;;;;;;;;;;;;;;;;;50730:5;50736:2;50730:9;;;;;;;;;;;;;;;;;;;50741:5;50747:2;50741:9;;;;;;;;;;;;;;;;;;;50752:5;50758:2;50752:9;;;;;;;;;;;;;;;;;;;50763:5;50769:2;50763:9;;;;;;;;;;;;;;;;;;;50640:133;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50624:150;;50795:18;50816:608;50886:17;50895:7;50886:8;:17::i;:::-;51169:28;51189:6;51169:13;:28::i;:::-;51256:5;51262:1;51256:8;;;;;;;;;;;;;;;;;;;51323:5;51329:1;51323:8;;;;;;;;;;;;;;;;;;;51389:5;51395:1;51389:8;;;;;;;;;;;;;;;;;;;50843:578;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50816:13;:608::i;:::-;50795:629;;51501:4;51451:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;51435:72;;51527:6;51520:13;;;;;49113:2428;;;:::o;47501:136::-;47560:13;47593:36;47599:7;47593:36;;;;;;;;;;;;;;;;;47620:8;47593:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:36::i;:::-;47586:43;;47501:136;;;:::o;27682:164::-;27779:4;27803:18;:25;27822:5;27803:25;;;;;;;;;;;;;;;:35;27829:8;27803:35;;;;;;;;;;;;;;;;;;;;;;;;;27796:42;;27682:164;;;;:::o;48212:132::-;48268:13;48301:35;48307:7;48301:35;;;;;;;;;;;;;;;;;48325:10;48301:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:35::i;:::-;48294:42;;48212:132;;;:::o;10105:192::-;9436:12;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10214:1:::1;10194:22;;:8;:22;;;;10186:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10270:19;10280:8;10270:9;:19::i;:::-;10105:192:::0;:::o;48640:137::-;48699:13;48732:37;48738:7;48732:37;;;;;;;;;;;;;;;;;48759:9;48732:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:37::i;:::-;48725:44;;48640:137;;;:::o;24519:305::-;24621:4;24673:25;24658:40;;;:11;:40;;;;:105;;;;24730:33;24715:48;;;:11;:48;;;;24658:105;:158;;;;24780:36;24804:11;24780:23;:36::i;:::-;24658:158;24638:178;;24519:305;;;:::o;30417:127::-;30482:4;30534:1;30506:30;;:7;:16;30514:7;30506:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30499:37;;30417:127;;;:::o;8065:98::-;8118:7;8145:10;8138:17;;8065:98;:::o;34399:174::-;34501:2;34474:15;:24;34490:7;34474:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34557:7;34553:2;34519:46;;34528:23;34543:7;34528:14;:23::i;:::-;34519:46;;;;;;;;;;;;34399:174;;:::o;48789:316::-;48898:13;48924:12;48939:62;48970:9;48981:17;48990:7;48981:8;:17::i;:::-;48953:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48939:6;:62::i;:::-;48924:77;;49012:20;49035:11;49054;:18;49047:4;:25;;;;:::i;:::-;49035:38;;;;;;;;;;;;;;;;;;;;;;49012:61;;49091:6;49084:13;;;;48789:316;;;;;:::o;30711:348::-;30804:4;30829:16;30837:7;30829;:16::i;:::-;30821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30905:13;30921:23;30936:7;30921:14;:23::i;:::-;30905:39;;30974:5;30963:16;;:7;:16;;;:51;;;;31007:7;30983:31;;:20;30995:7;30983:11;:20::i;:::-;:31;;;30963:51;:87;;;;31018:32;31035:5;31042:7;31018:16;:32::i;:::-;30963:87;30955:96;;;30711:348;;;;:::o;33703:578::-;33862:4;33835:31;;:23;33850:7;33835:14;:23::i;:::-;:31;;;33827:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33945:1;33931:16;;:2;:16;;;;33923:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34001:39;34022:4;34028:2;34032:7;34001:20;:39::i;:::-;34105:29;34122:1;34126:7;34105:8;:29::i;:::-;34166:1;34147:9;:15;34157:4;34147:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34195:1;34178:9;:13;34188:2;34178:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34226:2;34207:7;:16;34215:7;34207:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34265:7;34261:2;34246:27;;34255:4;34246:27;;;;;;;;;;;;33703:578;;;:::o;31401:110::-;31477:26;31487:2;31491:7;31477:26;;;;;;;;;;;;:9;:26::i;:::-;31401:110;;:::o;10305:173::-;10361:16;10380:6;;;;;;;;;;;10361:25;;10406:8;10397:6;;:17;;;;;;;;;;;;;;;;;;10461:8;10430:40;;10451:8;10430:40;;;;;;;;;;;;10305:173;;:::o;29789:315::-;29946:28;29956:4;29962:2;29966:7;29946:9;:28::i;:::-;29993:48;30016:4;30022:2;30026:7;30035:5;29993:22;:48::i;:::-;29985:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29789:315;;;;:::o;51930:715::-;51986:13;52208:1;52199:5;:10;52195:53;;;52226:10;;;;;;;;;;;;;;;;;;;;;52195:53;52258:12;52273:5;52258:20;;52289:14;52314:78;52329:1;52321:4;:9;52314:78;;52347:8;;;;;:::i;:::-;;;;52378:2;52370:10;;;;;:::i;:::-;;;52314:78;;;52402:19;52434:6;52424:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52402:39;;52452:154;52468:1;52459:5;:10;52452:154;;52496:1;52486:11;;;;;:::i;:::-;;;52563:2;52555:5;:10;;;;:::i;:::-;52542:2;:24;;;;:::i;:::-;52529:39;;52512:6;52519;52512:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;52592:2;52583:11;;;;;:::i;:::-;;;52452:154;;;52630:6;52616:21;;;;;51930:715;;;;:::o;53065:1607::-;53123:13;53149:11;53163:4;:11;53149:25;;53196:1;53189:3;:8;53185:23;;;53199:9;;;;;;;;;;;;;;;;;53185:23;53260:18;53298:1;53293;53287:3;:7;;;;:::i;:::-;53286:13;;;;:::i;:::-;53281:1;:19;;;;:::i;:::-;53260:40;;53358:19;53403:2;53390:10;:15;;;;:::i;:::-;53380:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53358:48;;53419:18;53440:5;;;;;;;;;;;;;;;;;53419:26;;53509:1;53502:5;53498:13;53554:2;53546:6;53542:15;53605:1;53573:777;53628:3;53625:1;53622:10;53573:777;;;53683:1;53680;53676:9;53671:14;;53741:8;53736:1;53730:4;53726:12;53720:19;53716:34;53821:4;53813:5;53809:2;53805:14;53801:25;53791:8;53787:40;53781:47;53860:3;53857:1;53853:11;53846:18;;53951:4;53942;53934:5;53930:2;53926:14;53922:25;53912:8;53908:40;53902:47;53898:58;53893:3;53889:68;53882:75;;53989:3;53986:1;53982:11;53975:18;;54079:4;54070;54062:5;54059:1;54055:13;54051:24;54041:8;54037:39;54031:46;54027:57;54022:3;54018:67;54011:74;;54117:3;54114:1;54110:11;54103:18;;54199:4;54190;54183:5;54179:16;54169:8;54165:31;54159:38;54155:49;54150:3;54146:59;54139:66;;54239:3;54234;54230:13;54223:20;;54281:3;54270:9;54263:22;54333:1;54322:9;54318:17;54305:30;;53652:698;;53573:777;;;53577:44;54382:1;54377:3;54373:11;54403:1;54398:84;;;;54501:1;54496:82;;;;54366:212;;54398:84;54459:6;54454:3;54450:16;54446:1;54435:9;54431:17;54424:43;54398:84;;54496:82;54557:4;54552:3;54548:14;54544:1;54533:9;54529:17;54522:41;54366:212;;54609:10;54601:6;54594:26;53467:1164;;54657:6;54643:21;;;;;;53065:1607;;;;:::o;23126:157::-;23211:4;23250:25;23235:40;;;:11;:40;;;;23228:47;;23126:157;;;:::o;47351:138::-;47411:7;47473:5;47456:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;47446:34;;;;;;47438:43;;47431:50;;47351:138;;;:::o;40026:589::-;40170:45;40197:4;40203:2;40207:7;40170:26;:45::i;:::-;40248:1;40232:18;;:4;:18;;;40228:187;;;40267:40;40299:7;40267:31;:40::i;:::-;40228:187;;;40337:2;40329:10;;:4;:10;;;40325:90;;40356:47;40389:4;40395:7;40356:32;:47::i;:::-;40325:90;40228:187;40443:1;40429:16;;:2;:16;;;40425:183;;;40462:45;40499:7;40462:36;:45::i;:::-;40425:183;;;40535:4;40529:10;;:2;:10;;;40525:83;;40556:40;40584:2;40588:7;40556:27;:40::i;:::-;40525:83;40425:183;40026:589;;;:::o;31738:321::-;31868:18;31874:2;31878:7;31868:5;:18::i;:::-;31919:54;31950:1;31954:2;31958:7;31967:5;31919:22;:54::i;:::-;31897:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31738:321;;;:::o;35138:803::-;35293:4;35314:15;:2;:13;;;:15::i;:::-;35310:624;;;35366:2;35350:36;;;35387:12;:10;:12::i;:::-;35401:4;35407:7;35416:5;35350:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35346:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35613:1;35596:6;:13;:18;35592:272;;;35639:60;;;;;;;;;;:::i;:::-;;;;;;;;35592:272;35814:6;35808:13;35799:6;35795:2;35791:15;35784:38;35346:533;35483:45;;;35473:55;;;:6;:55;;;;35466:62;;;;;35310:624;35918:4;35911:11;;35138:803;;;;;;;:::o;36513:126::-;;;;:::o;41338:164::-;41442:10;:17;;;;41415:15;:24;41431:7;41415:24;;;;;;;;;;;:44;;;;41470:10;41486:7;41470:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:164;:::o;42129:988::-;42395:22;42445:1;42420:22;42437:4;42420:16;:22::i;:::-;:26;;;;:::i;:::-;42395:51;;42457:18;42478:17;:26;42496:7;42478:26;;;;;;;;;;;;42457:47;;42625:14;42611:10;:28;42607:328;;42656:19;42678:12;:18;42691:4;42678:18;;;;;;;;;;;;;;;:34;42697:14;42678:34;;;;;;;;;;;;42656:56;;42762:11;42729:12;:18;42742:4;42729:18;;;;;;;;;;;;;;;:30;42748:10;42729:30;;;;;;;;;;;:44;;;;42879:10;42846:17;:30;42864:11;42846:30;;;;;;;;;;;:43;;;;42607:328;;43031:17;:26;43049:7;43031:26;;;;;;;;;;;43024:33;;;43075:12;:18;43088:4;43075:18;;;;;;;;;;;;;;;:34;43094:14;43075:34;;;;;;;;;;;43068:41;;;42129:988;;;;:::o;43412:1079::-;43665:22;43710:1;43690:10;:17;;;;:21;;;;:::i;:::-;43665:46;;43722:18;43743:15;:24;43759:7;43743:24;;;;;;;;;;;;43722:45;;44094:19;44116:10;44127:14;44116:26;;;;;;;;;;;;;;;;;;;;;;;;44094:48;;44180:11;44155:10;44166;44155:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44291:10;44260:15;:28;44276:11;44260:28;;;;;;;;;;;:41;;;;44432:15;:24;44448:7;44432:24;;;;;;;;;;;44425:31;;;44467:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43412:1079;;;;:::o;40916:221::-;41001:14;41018:20;41035:2;41018:16;:20::i;:::-;41001:37;;41076:7;41049:12;:16;41062:2;41049:16;;;;;;;;;;;;;;;:24;41066:6;41049:24;;;;;;;;;;;:34;;;;41123:6;41094:17;:26;41112:7;41094:26;;;;;;;;;;;:35;;;;40916:221;;;:::o;32395:382::-;32489:1;32475:16;;:2;:16;;;;32467:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32548:16;32556:7;32548;:16::i;:::-;32547:17;32539:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32610:45;32639:1;32643:2;32647:7;32610:20;:45::i;:::-;32685:1;32668:9;:13;32678:2;32668:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32716:2;32697:7;:16;32705:7;32697:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32761:7;32757:2;32736:33;;32753:1;32736:33;;;;;;;;;;;;32395:382;;:::o;15298:387::-;15358:4;15566:12;15633:7;15621:20;15613:28;;15676:1;15669:4;:8;15662:15;;;15298:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;500:133::-;;581:6;568:20;559:29;;597:30;621:5;597:30;:::i;:::-;549:84;;;;:::o;639:137::-;;722:6;709:20;700:29;;738:32;764:5;738:32;:::i;:::-;690:86;;;;:::o;782:141::-;;869:6;863:13;854:22;;885:32;911:5;885:32;:::i;:::-;844:79;;;;:::o;942:271::-;;1046:3;1039:4;1031:6;1027:17;1023:27;1013:2;;1064:1;1061;1054:12;1013:2;1104:6;1091:20;1129:78;1203:3;1195:6;1188:4;1180:6;1176:17;1129:78;:::i;:::-;1120:87;;1003:210;;;;;:::o;1219:139::-;;1303:6;1290:20;1281:29;;1319:33;1346:5;1319:33;:::i;:::-;1271:87;;;;:::o;1364:262::-;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1488:1;1485;1478:12;1440:2;1531:1;1556:53;1601:7;1592:6;1581:9;1577:22;1556:53;:::i;:::-;1546:63;;1502:117;1430:196;;;;:::o;1632:407::-;;;1757:2;1745:9;1736:7;1732:23;1728:32;1725:2;;;1773:1;1770;1763:12;1725:2;1816:1;1841:53;1886:7;1877:6;1866:9;1862:22;1841:53;:::i;:::-;1831:63;;1787:117;1943:2;1969:53;2014:7;2005:6;1994:9;1990:22;1969:53;:::i;:::-;1959:63;;1914:118;1715:324;;;;;:::o;2045:552::-;;;;2187:2;2175:9;2166:7;2162:23;2158:32;2155:2;;;2203:1;2200;2193:12;2155:2;2246:1;2271:53;2316:7;2307:6;2296:9;2292:22;2271:53;:::i;:::-;2261:63;;2217:117;2373:2;2399:53;2444:7;2435:6;2424:9;2420:22;2399:53;:::i;:::-;2389:63;;2344:118;2501:2;2527:53;2572:7;2563:6;2552:9;2548:22;2527:53;:::i;:::-;2517:63;;2472:118;2145:452;;;;;:::o;2603:809::-;;;;;2771:3;2759:9;2750:7;2746:23;2742:33;2739:2;;;2788:1;2785;2778:12;2739:2;2831:1;2856:53;2901:7;2892:6;2881:9;2877:22;2856:53;:::i;:::-;2846:63;;2802:117;2958:2;2984:53;3029:7;3020:6;3009:9;3005:22;2984:53;:::i;:::-;2974:63;;2929:118;3086:2;3112:53;3157:7;3148:6;3137:9;3133:22;3112:53;:::i;:::-;3102:63;;3057:118;3242:2;3231:9;3227:18;3214:32;3273:18;3265:6;3262:30;3259:2;;;3305:1;3302;3295:12;3259:2;3333:62;3387:7;3378:6;3367:9;3363:22;3333:62;:::i;:::-;3323:72;;3185:220;2729:683;;;;;;;:::o;3418:401::-;;;3540:2;3528:9;3519:7;3515:23;3511:32;3508:2;;;3556:1;3553;3546:12;3508:2;3599:1;3624:53;3669:7;3660:6;3649:9;3645:22;3624:53;:::i;:::-;3614:63;;3570:117;3726:2;3752:50;3794:7;3785:6;3774:9;3770:22;3752:50;:::i;:::-;3742:60;;3697:115;3498:321;;;;;:::o;3825:407::-;;;3950:2;3938:9;3929:7;3925:23;3921:32;3918:2;;;3966:1;3963;3956:12;3918:2;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;3908:324;;;;;:::o;4238:260::-;;4345:2;4333:9;4324:7;4320:23;4316:32;4313:2;;;4361:1;4358;4351:12;4313:2;4404:1;4429:52;4473:7;4464:6;4453:9;4449:22;4429:52;:::i;:::-;4419:62;;4375:116;4303:195;;;;:::o;4504:282::-;;4622:2;4610:9;4601:7;4597:23;4593:32;4590:2;;;4638:1;4635;4628:12;4590:2;4681:1;4706:63;4761:7;4752:6;4741:9;4737:22;4706:63;:::i;:::-;4696:73;;4652:127;4580:206;;;;:::o;4792:262::-;;4900:2;4888:9;4879:7;4875:23;4871:32;4868:2;;;4916:1;4913;4906:12;4868:2;4959:1;4984:53;5029:7;5020:6;5009:9;5005:22;4984:53;:::i;:::-;4974:63;;4930:117;4858:196;;;;:::o;5060:118::-;5147:24;5165:5;5147:24;:::i;:::-;5142:3;5135:37;5125:53;;:::o;5184:109::-;5265:21;5280:5;5265:21;:::i;:::-;5260:3;5253:34;5243:50;;:::o;5299:360::-;;5413:38;5445:5;5413:38;:::i;:::-;5467:70;5530:6;5525:3;5467:70;:::i;:::-;5460:77;;5546:52;5591:6;5586:3;5579:4;5572:5;5568:16;5546:52;:::i;:::-;5623:29;5645:6;5623:29;:::i;:::-;5618:3;5614:39;5607:46;;5389:270;;;;;:::o;5665:364::-;;5781:39;5814:5;5781:39;:::i;:::-;5836:71;5900:6;5895:3;5836:71;:::i;:::-;5829:78;;5916:52;5961:6;5956:3;5949:4;5942:5;5938:16;5916:52;:::i;:::-;5993:29;6015:6;5993:29;:::i;:::-;5988:3;5984:39;5977:46;;5757:272;;;;;:::o;6035:377::-;;6169:39;6202:5;6169:39;:::i;:::-;6224:89;6306:6;6301:3;6224:89;:::i;:::-;6217:96;;6322:52;6367:6;6362:3;6355:4;6348:5;6344:16;6322:52;:::i;:::-;6399:6;6394:3;6390:16;6383:23;;6145:267;;;;;:::o;6418:375::-;;6581:67;6645:2;6640:3;6581:67;:::i;:::-;6574:74;;6678:34;6674:1;6669:3;6665:11;6658:55;6744:13;6739:2;6734:3;6730:12;6723:35;6784:2;6779:3;6775:12;6768:19;;6564:229;;;:::o;6799:382::-;;6962:67;7026:2;7021:3;6962:67;:::i;:::-;6955:74;;7059:34;7055:1;7050:3;7046:11;7039:55;7125:20;7120:2;7115:3;7111:12;7104:42;7172:2;7167:3;7163:12;7156:19;;6945:236;;;:::o;7187:370::-;;7350:67;7414:2;7409:3;7350:67;:::i;:::-;7343:74;;7447:34;7443:1;7438:3;7434:11;7427:55;7513:8;7508:2;7503:3;7499:12;7492:30;7548:2;7543:3;7539:12;7532:19;;7333:224;;;:::o;7563:326::-;;7726:67;7790:2;7785:3;7726:67;:::i;:::-;7719:74;;7823:30;7819:1;7814:3;7810:11;7803:51;7880:2;7875:3;7871:12;7864:19;;7709:180;;;:::o;7895:496::-;;8076:85;8158:2;8153:3;8076:85;:::i;:::-;8069:92;;8191:66;8187:1;8182:3;8178:11;8171:87;8289:66;8284:2;8279:3;8275:12;8268:88;8382:2;8377:3;8373:12;8366:19;;8059:332;;;:::o;8397:368::-;;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8657:34;8653:1;8648:3;8644:11;8637:55;8723:6;8718:2;8713:3;8709:12;8702:28;8756:2;8751:3;8747:12;8740:19;;8543:222;;;:::o;8771:323::-;;8934:67;8998:2;8993:3;8934:67;:::i;:::-;8927:74;;9031:27;9027:1;9022:3;9018:11;9011:48;9085:2;9080:3;9076:12;9069:19;;8917:177;;;:::o;9100:376::-;;9263:67;9327:2;9322:3;9263:67;:::i;:::-;9256:74;;9360:34;9356:1;9351:3;9347:11;9340:55;9426:14;9421:2;9416:3;9412:12;9405:36;9467:2;9462:3;9458:12;9451:19;;9246:230;;;:::o;9482:388::-;;9645:67;9709:2;9704:3;9645:67;:::i;:::-;9638:74;;9742:34;9738:1;9733:3;9729:11;9722:55;9808:26;9803:2;9798:3;9794:12;9787:48;9861:2;9856:3;9852:12;9845:19;;9628:242;;;:::o;9876:398::-;;10057:85;10139:2;10134:3;10057:85;:::i;:::-;10050:92;;10172:66;10168:1;10163:3;10159:11;10152:87;10265:2;10260:3;10256:12;10249:19;;10040:234;;;:::o;10280:374::-;;10443:67;10507:2;10502:3;10443:67;:::i;:::-;10436:74;;10540:34;10536:1;10531:3;10527:11;10520:55;10606:12;10601:2;10596:3;10592:12;10585:34;10645:2;10640:3;10636:12;10629:19;;10426:228;;;:::o;10660:373::-;;10823:67;10887:2;10882:3;10823:67;:::i;:::-;10816:74;;10920:34;10916:1;10911:3;10907:11;10900:55;10986:11;10981:2;10976:3;10972:12;10965:33;11024:2;11019:3;11015:12;11008:19;;10806:227;;;:::o;11039:496::-;;11220:85;11302:2;11297:3;11220:85;:::i;:::-;11213:92;;11335:66;11331:1;11326:3;11322:11;11315:87;11433:66;11428:2;11423:3;11419:12;11412:88;11526:2;11521:3;11517:12;11510:19;;11203:332;;;:::o;11541:330::-;;11704:67;11768:2;11763:3;11704:67;:::i;:::-;11697:74;;11801:34;11797:1;11792:3;11788:11;11781:55;11862:2;11857:3;11853:12;11846:19;;11687:184;;;:::o;11877:376::-;;12040:67;12104:2;12099:3;12040:67;:::i;:::-;12033:74;;12137:34;12133:1;12128:3;12124:11;12117:55;12203:14;12198:2;12193:3;12189:12;12182:36;12244:2;12239:3;12235:12;12228:19;;12023:230;;;:::o;12259:330::-;;12422:67;12486:2;12481:3;12422:67;:::i;:::-;12415:74;;12519:34;12515:1;12510:3;12506:11;12499:55;12580:2;12575:3;12571:12;12564:19;;12405:184;;;:::o;12595:314::-;;12758:67;12822:2;12817:3;12758:67;:::i;:::-;12751:74;;12855:18;12851:1;12846:3;12842:11;12835:39;12900:2;12895:3;12891:12;12884:19;;12741:168;;;:::o;12915:373::-;;13078:67;13142:2;13137:3;13078:67;:::i;:::-;13071:74;;13175:34;13171:1;13166:3;13162:11;13155:55;13241:11;13236:2;13231:3;13227:12;13220:33;13279:2;13274:3;13270:12;13263:19;;13061:227;;;:::o;13294:365::-;;13457:67;13521:2;13516:3;13457:67;:::i;:::-;13450:74;;13554:34;13550:1;13545:3;13541:11;13534:55;13620:3;13615:2;13610:3;13606:12;13599:25;13650:2;13645:3;13641:12;13634:19;;13440:219;;;:::o;13665:969::-;;13846:86;13928:3;13923;13846:86;:::i;:::-;13839:93;;13962:66;13958:1;13953:3;13949:11;13942:87;14060:34;14055:2;14050:3;14046:12;14039:56;14126:34;14121:2;14116:3;14112:12;14105:56;14192:34;14187:2;14182:3;14178:12;14171:56;14259:34;14253:3;14248;14244:13;14237:57;14326:34;14320:3;14315;14311:13;14304:57;14393:66;14387:3;14382;14378:13;14371:89;14492:66;14486:3;14481;14477:13;14470:89;14591:6;14585:3;14580;14576:13;14569:29;14624:3;14619;14615:13;14608:20;;13829:805;;;:::o;14640:363::-;;14821:85;14903:2;14898:3;14821:85;:::i;:::-;14814:92;;14936:31;14932:1;14927:3;14923:11;14916:52;14994:2;14989:3;14985:12;14978:19;;14804:199;;;:::o;15009:381::-;;15172:67;15236:2;15231:3;15172:67;:::i;:::-;15165:74;;15269:34;15265:1;15260:3;15256:11;15249:55;15335:19;15330:2;15325:3;15321:12;15314:41;15381:2;15376:3;15372:12;15365:19;;15155:235;;;:::o;15396:496::-;;15577:85;15659:2;15654:3;15577:85;:::i;:::-;15570:92;;15692:66;15688:1;15683:3;15679:11;15672:87;15790:66;15785:2;15780:3;15776:12;15769:88;15883:2;15878:3;15874:12;15867:19;;15560:332;;;:::o;15898:376::-;;16061:67;16125:2;16120:3;16061:67;:::i;:::-;16054:74;;16158:34;16154:1;16149:3;16145:11;16138:55;16224:14;16219:2;16214:3;16210:12;16203:36;16265:2;16260:3;16256:12;16249:19;;16044:230;;;:::o;16280:398::-;;16461:85;16543:2;16538:3;16461:85;:::i;:::-;16454:92;;16576:66;16572:1;16567:3;16563:11;16556:87;16669:2;16664:3;16660:12;16653:19;;16444:234;;;:::o;16684:329::-;;16847:67;16911:2;16906:3;16847:67;:::i;:::-;16840:74;;16944:33;16940:1;16935:3;16931:11;16924:54;17004:2;16999:3;16995:12;16988:19;;16830:183;;;:::o;17019:118::-;17106:24;17124:5;17106:24;:::i;:::-;17101:3;17094:37;17084:53;;:::o;17143:275::-;;17297:95;17388:3;17379:6;17297:95;:::i;:::-;17290:102;;17409:3;17402:10;;17279:139;;;;:::o;17424:435::-;;17626:95;17717:3;17708:6;17626:95;:::i;:::-;17619:102;;17738:95;17829:3;17820:6;17738:95;:::i;:::-;17731:102;;17850:3;17843:10;;17608:251;;;;;:::o;17865:1555::-;;18403:95;18494:3;18485:6;18403:95;:::i;:::-;18396:102;;18515:95;18606:3;18597:6;18515:95;:::i;:::-;18508:102;;18627:95;18718:3;18709:6;18627:95;:::i;:::-;18620:102;;18739:95;18830:3;18821:6;18739:95;:::i;:::-;18732:102;;18851:95;18942:3;18933:6;18851:95;:::i;:::-;18844:102;;18963:95;19054:3;19045:6;18963:95;:::i;:::-;18956:102;;19075:95;19166:3;19157:6;19075:95;:::i;:::-;19068:102;;19187:95;19278:3;19269:6;19187:95;:::i;:::-;19180:102;;19299:95;19390:3;19381:6;19299:95;:::i;:::-;19292:102;;19411:3;19404:10;;18385:1035;;;;;;;;;;;;:::o;19426:1877::-;;20061:95;20152:3;20143:6;20061:95;:::i;:::-;20054:102;;20173:95;20264:3;20255:6;20173:95;:::i;:::-;20166:102;;20285:95;20376:3;20367:6;20285:95;:::i;:::-;20278:102;;20397:95;20488:3;20479:6;20397:95;:::i;:::-;20390:102;;20509:95;20600:3;20591:6;20509:95;:::i;:::-;20502:102;;20621:95;20712:3;20703:6;20621:95;:::i;:::-;20614:102;;20733:95;20824:3;20815:6;20733:95;:::i;:::-;20726:102;;20845:95;20936:3;20927:6;20845:95;:::i;:::-;20838:102;;20957:95;21048:3;21039:6;20957:95;:::i;:::-;20950:102;;21069:95;21160:3;21151:6;21069:95;:::i;:::-;21062:102;;21181:96;21273:3;21263:7;21181:96;:::i;:::-;21174:103;;21294:3;21287:10;;20043:1260;;;;;;;;;;;;;;:::o;21309:541::-;;21564:148;21708:3;21564:148;:::i;:::-;21557:155;;21729:95;21820:3;21811:6;21729:95;:::i;:::-;21722:102;;21841:3;21834:10;;21546:304;;;;:::o;21856:2511::-;;22808:148;22952:3;22808:148;:::i;:::-;22801:155;;22973:95;23064:3;23055:6;22973:95;:::i;:::-;22966:102;;23085:148;23229:3;23085:148;:::i;:::-;23078:155;;23250:95;23341:3;23332:6;23250:95;:::i;:::-;23243:102;;23362:148;23506:3;23362:148;:::i;:::-;23355:155;;23527:95;23618:3;23609:6;23527:95;:::i;:::-;23520:102;;23639:148;23783:3;23639:148;:::i;:::-;23632:155;;23804:95;23895:3;23886:6;23804:95;:::i;:::-;23797:102;;23916:148;24060:3;23916:148;:::i;:::-;23909:155;;24081:95;24172:3;24163:6;24081:95;:::i;:::-;24074:102;;24193:148;24337:3;24193:148;:::i;:::-;24186:155;;24358:3;24351:10;;22790:1577;;;;;;;;:::o;24373:222::-;;24504:2;24493:9;24489:18;24481:26;;24517:71;24585:1;24574:9;24570:17;24561:6;24517:71;:::i;:::-;24471:124;;;;:::o;24601:640::-;;24834:3;24823:9;24819:19;24811:27;;24848:71;24916:1;24905:9;24901:17;24892:6;24848:71;:::i;:::-;24929:72;24997:2;24986:9;24982:18;24973:6;24929:72;:::i;:::-;25011;25079:2;25068:9;25064:18;25055:6;25011:72;:::i;:::-;25130:9;25124:4;25120:20;25115:2;25104:9;25100:18;25093:48;25158:76;25229:4;25220:6;25158:76;:::i;:::-;25150:84;;24801:440;;;;;;;:::o;25247:210::-;;25372:2;25361:9;25357:18;25349:26;;25385:65;25447:1;25436:9;25432:17;25423:6;25385:65;:::i;:::-;25339:118;;;;:::o;25463:313::-;;25614:2;25603:9;25599:18;25591:26;;25663:9;25657:4;25653:20;25649:1;25638:9;25634:17;25627:47;25691:78;25764:4;25755:6;25691:78;:::i;:::-;25683:86;;25581:195;;;;:::o;25782:419::-;;25986:2;25975:9;25971:18;25963:26;;26035:9;26029:4;26025:20;26021:1;26010:9;26006:17;25999:47;26063:131;26189:4;26063:131;:::i;:::-;26055:139;;25953:248;;;:::o;26207:419::-;;26411:2;26400:9;26396:18;26388:26;;26460:9;26454:4;26450:20;26446:1;26435:9;26431:17;26424:47;26488:131;26614:4;26488:131;:::i;:::-;26480:139;;26378:248;;;:::o;26632:419::-;;26836:2;26825:9;26821:18;26813:26;;26885:9;26879:4;26875:20;26871:1;26860:9;26856:17;26849:47;26913:131;27039:4;26913:131;:::i;:::-;26905:139;;26803:248;;;:::o;27057:419::-;;27261:2;27250:9;27246:18;27238:26;;27310:9;27304:4;27300:20;27296:1;27285:9;27281:17;27274:47;27338:131;27464:4;27338:131;:::i;:::-;27330:139;;27228:248;;;:::o;27482:419::-;;27686:2;27675:9;27671:18;27663:26;;27735:9;27729:4;27725:20;27721:1;27710:9;27706:17;27699:47;27763:131;27889:4;27763:131;:::i;:::-;27755:139;;27653:248;;;:::o;27907:419::-;;28111:2;28100:9;28096:18;28088:26;;28160:9;28154:4;28150:20;28146:1;28135:9;28131:17;28124:47;28188:131;28314:4;28188:131;:::i;:::-;28180:139;;28078:248;;;:::o;28332:419::-;;28536:2;28525:9;28521:18;28513:26;;28585:9;28579:4;28575:20;28571:1;28560:9;28556:17;28549:47;28613:131;28739:4;28613:131;:::i;:::-;28605:139;;28503:248;;;:::o;28757:419::-;;28961:2;28950:9;28946:18;28938:26;;29010:9;29004:4;29000:20;28996:1;28985:9;28981:17;28974:47;29038:131;29164:4;29038:131;:::i;:::-;29030:139;;28928:248;;;:::o;29182:419::-;;29386:2;29375:9;29371:18;29363:26;;29435:9;29429:4;29425:20;29421:1;29410:9;29406:17;29399:47;29463:131;29589:4;29463:131;:::i;:::-;29455:139;;29353:248;;;:::o;29607:419::-;;29811:2;29800:9;29796:18;29788:26;;29860:9;29854:4;29850:20;29846:1;29835:9;29831:17;29824:47;29888:131;30014:4;29888:131;:::i;:::-;29880:139;;29778:248;;;:::o;30032:419::-;;30236:2;30225:9;30221:18;30213:26;;30285:9;30279:4;30275:20;30271:1;30260:9;30256:17;30249:47;30313:131;30439:4;30313:131;:::i;:::-;30305:139;;30203:248;;;:::o;30457:419::-;;30661:2;30650:9;30646:18;30638:26;;30710:9;30704:4;30700:20;30696:1;30685:9;30681:17;30674:47;30738:131;30864:4;30738:131;:::i;:::-;30730:139;;30628:248;;;:::o;30882:419::-;;31086:2;31075:9;31071:18;31063:26;;31135:9;31129:4;31125:20;31121:1;31110:9;31106:17;31099:47;31163:131;31289:4;31163:131;:::i;:::-;31155:139;;31053:248;;;:::o;31307:419::-;;31511:2;31500:9;31496:18;31488:26;;31560:9;31554:4;31550:20;31546:1;31535:9;31531:17;31524:47;31588:131;31714:4;31588:131;:::i;:::-;31580:139;;31478:248;;;:::o;31732:419::-;;31936:2;31925:9;31921:18;31913:26;;31985:9;31979:4;31975:20;31971:1;31960:9;31956:17;31949:47;32013:131;32139:4;32013:131;:::i;:::-;32005:139;;31903:248;;;:::o;32157:419::-;;32361:2;32350:9;32346:18;32338:26;;32410:9;32404:4;32400:20;32396:1;32385:9;32381:17;32374:47;32438:131;32564:4;32438:131;:::i;:::-;32430:139;;32328:248;;;:::o;32582:419::-;;32786:2;32775:9;32771:18;32763:26;;32835:9;32829:4;32825:20;32821:1;32810:9;32806:17;32799:47;32863:131;32989:4;32863:131;:::i;:::-;32855:139;;32753:248;;;:::o;33007:419::-;;33211:2;33200:9;33196:18;33188:26;;33260:9;33254:4;33250:20;33246:1;33235:9;33231:17;33224:47;33288:131;33414:4;33288:131;:::i;:::-;33280:139;;33178:248;;;:::o;33432:419::-;;33636:2;33625:9;33621:18;33613:26;;33685:9;33679:4;33675:20;33671:1;33660:9;33656:17;33649:47;33713:131;33839:4;33713:131;:::i;:::-;33705:139;;33603:248;;;:::o;33857:222::-;;33988:2;33977:9;33973:18;33965:26;;34001:71;34069:1;34058:9;34054:17;34045:6;34001:71;:::i;:::-;33955:124;;;;:::o;34085:283::-;;34151:2;34145:9;34135:19;;34193:4;34185:6;34181:17;34300:6;34288:10;34285:22;34264:18;34252:10;34249:34;34246:62;34243:2;;;34311:18;;:::i;:::-;34243:2;34351:10;34347:2;34340:22;34125:243;;;;:::o;34374:331::-;;34525:18;34517:6;34514:30;34511:2;;;34547:18;;:::i;:::-;34511:2;34632:4;34628:9;34621:4;34613:6;34609:17;34605:33;34597:41;;34693:4;34687;34683:15;34675:23;;34440:265;;;:::o;34711:98::-;;34796:5;34790:12;34780:22;;34769:40;;;:::o;34815:99::-;;34901:5;34895:12;34885:22;;34874:40;;;:::o;34920:168::-;;35037:6;35032:3;35025:19;35077:4;35072:3;35068:14;35053:29;;35015:73;;;;:::o;35094:169::-;;35212:6;35207:3;35200:19;35252:4;35247:3;35243:14;35228:29;;35190:73;;;;:::o;35269:148::-;;35408:3;35393:18;;35383:34;;;;:::o;35423:305::-;;35482:20;35500:1;35482:20;:::i;:::-;35477:25;;35516:20;35534:1;35516:20;:::i;:::-;35511:25;;35670:1;35602:66;35598:74;35595:1;35592:81;35589:2;;;35676:18;;:::i;:::-;35589:2;35720:1;35717;35713:9;35706:16;;35467:261;;;;:::o;35734:185::-;;35791:20;35809:1;35791:20;:::i;:::-;35786:25;;35825:20;35843:1;35825:20;:::i;:::-;35820:25;;35864:1;35854:2;;35869:18;;:::i;:::-;35854:2;35911:1;35908;35904:9;35899:14;;35776:143;;;;:::o;35925:348::-;;35988:20;36006:1;35988:20;:::i;:::-;35983:25;;36022:20;36040:1;36022:20;:::i;:::-;36017:25;;36210:1;36142:66;36138:74;36135:1;36132:81;36127:1;36120:9;36113:17;36109:105;36106:2;;;36217:18;;:::i;:::-;36106:2;36265:1;36262;36258:9;36247:20;;35973:300;;;;:::o;36279:191::-;;36339:20;36357:1;36339:20;:::i;:::-;36334:25;;36373:20;36391:1;36373:20;:::i;:::-;36368:25;;36412:1;36409;36406:8;36403:2;;;36417:18;;:::i;:::-;36403:2;36462:1;36459;36455:9;36447:17;;36324:146;;;;:::o;36476:96::-;;36542:24;36560:5;36542:24;:::i;:::-;36531:35;;36521:51;;;:::o;36578:90::-;;36655:5;36648:13;36641:21;36630:32;;36620:48;;;:::o;36674:149::-;;36750:66;36743:5;36739:78;36728:89;;36718:105;;;:::o;36829:126::-;;36906:42;36899:5;36895:54;36884:65;;36874:81;;;:::o;36961:77::-;;37027:5;37016:16;;37006:32;;;:::o;37044:154::-;37128:6;37123:3;37118;37105:30;37190:1;37181:6;37176:3;37172:16;37165:27;37095:103;;;:::o;37204:307::-;37272:1;37282:113;37296:6;37293:1;37290:13;37282:113;;;37381:1;37376:3;37372:11;37366:18;37362:1;37357:3;37353:11;37346:39;37318:2;37315:1;37311:10;37306:15;;37282:113;;;37413:6;37410:1;37407:13;37404:2;;;37493:1;37484:6;37479:3;37475:16;37468:27;37404:2;37253:258;;;;:::o;37517:320::-;;37598:1;37592:4;37588:12;37578:22;;37645:1;37639:4;37635:12;37666:18;37656:2;;37722:4;37714:6;37710:17;37700:27;;37656:2;37784;37776:6;37773:14;37753:18;37750:38;37747:2;;;37803:18;;:::i;:::-;37747:2;37568:269;;;;:::o;37843:233::-;;37905:24;37923:5;37905:24;:::i;:::-;37896:33;;37951:66;37944:5;37941:77;37938:2;;;38021:18;;:::i;:::-;37938:2;38068:1;38061:5;38057:13;38050:20;;37886:190;;;:::o;38082:176::-;;38131:20;38149:1;38131:20;:::i;:::-;38126:25;;38165:20;38183:1;38165:20;:::i;:::-;38160:25;;38204:1;38194:2;;38209:18;;:::i;:::-;38194:2;38250:1;38247;38243:9;38238:14;;38116:142;;;;:::o;38264:180::-;38312:77;38309:1;38302:88;38409:4;38406:1;38399:15;38433:4;38430:1;38423:15;38450:180;38498:77;38495:1;38488:88;38595:4;38592:1;38585:15;38619:4;38616:1;38609:15;38636:180;38684:77;38681:1;38674:88;38781:4;38778:1;38771:15;38805:4;38802:1;38795:15;38822:180;38870:77;38867:1;38860:88;38967:4;38964:1;38957:15;38991:4;38988:1;38981:15;39008:102;;39100:2;39096:7;39091:2;39084:5;39080:14;39076:28;39066:38;;39056:54;;;:::o;39116:122::-;39189:24;39207:5;39189:24;:::i;:::-;39182:5;39179:35;39169:2;;39228:1;39225;39218:12;39169:2;39159:79;:::o;39244:116::-;39314:21;39329:5;39314:21;:::i;:::-;39307:5;39304:32;39294:2;;39350:1;39347;39340:12;39294:2;39284:76;:::o;39366:120::-;39438:23;39455:5;39438:23;:::i;:::-;39431:5;39428:34;39418:2;;39476:1;39473;39466:12;39418:2;39408:78;:::o;39492:122::-;39565:24;39583:5;39565:24;:::i;:::-;39558:5;39555:35;39545:2;;39604:1;39601;39594:12;39545:2;39535:79;:::o
Swarm Source
ipfs://32cb64d62dfc2be320f295244011720dc90cc610d0d2c32dd2fbf3101d81f240
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.