Overview
ETH Balance
0.17 ETH
Eth Value
$533.20 (@ $3,136.50/ETH)More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 32 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 16466310 | 549 days ago | IN | 0 ETH | 0.00071732 | ||||
Set Approval For... | 16466290 | 549 days ago | IN | 0 ETH | 0.00071004 | ||||
Set Approval For... | 16070592 | 604 days ago | IN | 0 ETH | 0.00068595 | ||||
Transfer From | 13845422 | 947 days ago | IN | 0 ETH | 0.00586378 | ||||
Mint Hex | 13688237 | 972 days ago | IN | 0.01 ETH | 0.0167169 | ||||
Mint Hex | 13688237 | 972 days ago | IN | 0.01 ETH | 0.0170465 | ||||
Mint Hex | 13407860 | 1016 days ago | IN | 0.01 ETH | 0.012044 | ||||
Mint Hex | 13348745 | 1025 days ago | IN | 0.01 ETH | 0.01481665 | ||||
Mint Hex | 13305021 | 1032 days ago | IN | 0.01 ETH | 0.01169828 | ||||
Mint Hex | 13305001 | 1032 days ago | IN | 0.01 ETH | 0.00948161 | ||||
Mint Hex | 13304825 | 1032 days ago | IN | 0.01 ETH | 0.00756531 | ||||
Mint Hex | 13304814 | 1032 days ago | IN | 0.01 ETH | 0.00945329 | ||||
Mint Hex | 13304748 | 1032 days ago | IN | 0.01 ETH | 0.00794468 | ||||
Mint Hex | 13266552 | 1038 days ago | IN | 0.01 ETH | 0.00928326 | ||||
Mint Hex | 13252681 | 1040 days ago | IN | 0.01 ETH | 0.00671428 | ||||
Set Approval For... | 13238093 | 1042 days ago | IN | 0 ETH | 0.00345887 | ||||
Transfer From | 13222651 | 1045 days ago | IN | 0 ETH | 0.00372682 | ||||
Mint | 13220894 | 1045 days ago | IN | 0 ETH | 0.00598259 | ||||
Mint | 13220787 | 1045 days ago | IN | 0 ETH | 0.01059745 | ||||
Mint | 13219434 | 1045 days ago | IN | 0 ETH | 0.01462659 | ||||
Mint | 13218950 | 1045 days ago | IN | 0 ETH | 0.01198236 | ||||
Mint Hex | 13218940 | 1045 days ago | IN | 0.01 ETH | 0.01166949 | ||||
Mint Hex | 13218894 | 1045 days ago | IN | 0.01 ETH | 0.00554948 | ||||
Mint Hex | 13218894 | 1045 days ago | IN | 0.01 ETH | 0.01917465 | ||||
Mint Hex | 13218894 | 1045 days ago | IN | 0.01 ETH | 0.01894678 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Color
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-13 */ /** *Submitted for verification at Etherscan.io on 2021-08-27 */ // 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 with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length); for (uint256 i = 2 * length; i > 0; i--) { buffer[i-1] = _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(); } } /// [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 Color is ERC721Enumerable, ReentrancyGuard, Ownable { uint256 private maxColor = 2**24; uint private lastTokenId; uint256 public publicPrice = 0.01 ether; bytes alphabet = "0123456789ABCDEF"; mapping (bytes1 => uint) alphabetMap; constructor() ERC721("Color", "COLOR") Ownable() { lastTokenId = 0; for (uint i = 0; i < 16; i++) { alphabetMap[alphabet[i]] = i; } } function mintHex(string memory hexStr) external payable returns (uint256) { require(publicPrice <= msg.value, "Insufficient Ethereum"); uint256 tokenId = hexToDec(hexStr); claimById(tokenId); return tokenId; } function mint() external returns (uint256) { uint256 tokenId = nextTokenId(); while (_exists(tokenId)) { tokenId = nextTokenId(); } claimById(tokenId); return tokenId; } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId >= 0 && tokenId < maxColor, "Token ID invalid"); _safeMint(owner(), tokenId); } function tokenURI(uint256 tokenId) override public pure returns (string memory) { string memory hexColor = Strings.toHexString(tokenId, 3); string memory p1 = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="'; string memory p2 = string(abi.encodePacked("#", hexColor)); string memory p3 = '" /><text x="282" y="336" class="base">'; string memory p5 = '</text></svg>'; string memory colorBox = string(abi.encodePacked(p1, p2, p3, p2, p5)); string memory json = Base64.encode(bytes(string(abi.encodePacked('{ "name": "', p2, '", "description": "This is a Color. Use it any way you want.", "background_color":"', p2, '", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(colorBox)), '"}')))); return string(abi.encodePacked('data:application/json;base64,', json)); } function hexToDec(string memory hexStr) internal view returns (uint256) { bytes memory strBytes = bytes(hexStr); uint256 res = 0; for(uint i = 0; i < 6; i++) { res += alphabetMap[strBytes[i]] << (4*(5-i)); } return res; } function claimById(uint256 tokenId) internal nonReentrant { require(tokenId >= 0 && tokenId < maxColor, "Token ID invalid"); _safeMint(_msgSender(), tokenId); } function nextTokenId() internal returns (uint256) { uint m = maxColor; uint a = 1664523; uint c = 1013904223; lastTokenId = (a * lastTokenId + c) % m; return lastTokenId; } }
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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"hexStr","type":"string"}],"name":"mintHex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"pure","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
60806040526301000000600c55662386f26fc10000600e556040518060400160405280601081526020017f3031323334353637383941424344454600000000000000000000000000000000815250600f90805190602001906200006492919062000322565b503480156200007257600080fd5b506040518060400160405280600581526020017f436f6c6f720000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f434f4c4f520000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f7929190620003b3565b50806001908051906020019062000110929190620003b3565b5050506001600a819055506200013b6200012f6200025460201b60201c565b6200025c60201b60201c565b6000600d8190555060005b60108110156200024d578060106000600f84815462000165906200046d565b81106200019b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b815460011615620001bb5790600052602060002090602091828204019190065b9054901a7f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000208190555080806200024490620004a3565b91505062000146565b506200054f565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000330906200046d565b90600052602060002090601f016020900481019282620003545760008555620003a0565b82601f106200036f57805160ff1916838001178555620003a0565b82800160010185558215620003a0579182015b828111156200039f57825182559160200191906001019062000382565b5b509050620003af919062000444565b5090565b828054620003c1906200046d565b90600052602060002090601f016020900481019282620003e5576000855562000431565b82601f106200040057805160ff191683800117855562000431565b8280016001018555821562000431579182015b828111156200043057825182559160200191906001019062000413565b5b50905062000440919062000444565b5090565b5b808211156200045f57600081600090555060010162000445565b5090565b6000819050919050565b600060028204905060018216806200048657607f821691505b602082108114156200049d576200049c62000520565b5b50919050565b6000620004b08262000463565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620004e657620004e5620004f1565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614011806200055f6000396000f3fe6080604052600436106101405760003560e01c806351b03390116100b6578063a22cb4651161006f578063a22cb46514610475578063a945bf801461049e578063b88d4fde146104c9578063c87b56dd146104f2578063e985e9c51461052f578063f2fde38b1461056c57610140565b806351b033901461035e5780636352211e1461038e57806370a08231146103cb578063715018a6146104085780638da5cb5b1461041f57806395d89b411461044a57610140565b806318160ddd1161010857806318160ddd1461023e57806323b872dd146102695780632f745c591461029257806342842e0e146102cf578063434f48c4146102f85780634f6ccce71461032157610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea5780631249c58b14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612b0c565b610595565b604051610179919061370b565b60405180910390f35b34801561018e57600080fd5b5061019761060f565b6040516101a49190613726565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612b9f565b6106a1565b6040516101e191906136a4565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612ad0565b610726565b005b34801561021f57600080fd5b5061022861083e565b60405161023591906139e8565b60405180910390f35b34801561024a57600080fd5b50610253610879565b60405161026091906139e8565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b91906129ca565b610886565b005b34801561029e57600080fd5b506102b960048036038101906102b49190612ad0565b6108e6565b6040516102c691906139e8565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906129ca565b61098b565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612b9f565b6109ab565b005b34801561032d57600080fd5b5061034860048036038101906103439190612b9f565b610ae2565b60405161035591906139e8565b60405180910390f35b61037860048036038101906103739190612b5e565b610b79565b60405161038591906139e8565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190612b9f565b610bdf565b6040516103c291906136a4565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190612965565b610c91565b6040516103ff91906139e8565b60405180910390f35b34801561041457600080fd5b5061041d610d49565b005b34801561042b57600080fd5b50610434610dd1565b60405161044191906136a4565b60405180910390f35b34801561045657600080fd5b5061045f610dfb565b60405161046c9190613726565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612a94565b610e8d565b005b3480156104aa57600080fd5b506104b361100e565b6040516104c091906139e8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190612a19565b611014565b005b3480156104fe57600080fd5b5061051960048036038101906105149190612b9f565b611076565b6040516105269190613726565b60405180910390f35b34801561053b57600080fd5b506105566004803603810190610551919061298e565b6111b2565b604051610563919061370b565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190612965565b611246565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060857506106078261133e565b5b9050919050565b60606000805461061e90613ccc565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90613ccc565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b60006106ac82611420565b6106eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e2906138c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073182610bdf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990613948565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c161148c565b73ffffffffffffffffffffffffffffffffffffffff1614806107f057506107ef816107ea61148c565b6111b2565b5b61082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690613848565b60405180910390fd5b6108398383611494565b505050565b60008061084961154d565b90505b61085581611420565b156108695761086261154d565b905061084c565b6108728161159b565b8091505090565b6000600880549050905090565b61089761089161148c565b82611656565b6108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90613988565b60405180910390fd5b6108e1838383611734565b505050565b60006108f183610c91565b8210610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990613768565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109a683838360405180602001604052806000815250611014565b505050565b6002600a5414156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e8906139c8565b60405180910390fd5b6002600a81905550610a0161148c565b73ffffffffffffffffffffffffffffffffffffffff16610a1f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c906138e8565b60405180910390fd5b60008110158015610a875750600c5481105b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613908565b60405180910390fd5b610ad7610ad1610dd1565b82611990565b6001600a8190555050565b6000610aec610879565b8210610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906139a8565b60405180910390fd5b60088281548110610b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600034600e541115610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613968565b60405180910390fd5b6000610bcb836119ae565b9050610bd68161159b565b80915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613888565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d5161148c565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906138e8565b60405180910390fd5b610dcf6000611aa2565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0a90613ccc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3690613ccc565b8015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b5050505050905090565b610e9561148c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613808565b60405180910390fd5b8060056000610f1061148c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fbd61148c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611002919061370b565b60405180910390a35050565b600e5481565b61102561101f61148c565b83611656565b611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613988565b60405180910390fd5b61107084848484611b68565b50505050565b60606000611085836003611bc4565b9050600060405180610100016040528060d38152602001613ee260d3913990506000826040516020016110b89190613660565b60405160208183030381529060405290506000604051806060016040528060278152602001613fb560279139905060006040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525090506000848484868560405160200161113b9594939291906135b8565b60405160208183030381529060405290506000611182858661115c85611da0565b60405160200161116e93929190613603565b604051602081830303815290604052611da0565b9050806040516020016111959190613682565b604051602081830303815290604052975050505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61124e61148c565b73ffffffffffffffffffffffffffffffffffffffff1661126c610dd1565b73ffffffffffffffffffffffffffffffffffffffff16146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b9906138e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906137a8565b60405180910390fd5b61133b81611aa2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061140957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611419575061141882611f5e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661150783610bdf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c54905060006219660b90506000633c6ef35f90508281600d54846115769190613b5e565b6115809190613ad7565b61158a9190613d47565b600d81905550600d54935050505090565b6002600a5414156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d8906139c8565b60405180910390fd5b6002600a81905550600081101580156115fb5750600c5481105b61163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190613908565b60405180910390fd5b61164b61164561148c565b82611990565b6001600a8190555050565b600061166182611420565b6116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613828565b60405180910390fd5b60006116ab83610bdf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061171a57508373ffffffffffffffffffffffffffffffffffffffff16611702846106a1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061172b575061172a81856111b2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661175482610bdf565b73ffffffffffffffffffffffffffffffffffffffff16146117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613928565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906137e8565b60405180910390fd5b611825838383611fc8565b611830600082611494565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118809190613bb8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d79190613ad7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6119aa8282604051806020016040528060008152506120dc565b5050565b6000808290506000805b6006811015611a97578060056119ce9190613bb8565b60046119da9190613b5e565b60106000858481518110611a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054901b82611a829190613ad7565b91508080611a8f90613cfe565b9150506119b8565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b73848484611734565b611b7f84848484612137565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613788565b60405180910390fd5b50505050565b60606000826002611bd59190613b5e565b67ffffffffffffffff811115611c14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c465781602001600182028036833780820191505090505b5090506000836002611c589190613b5e565b90505b6000811115611d52577f3031323334353637383941424344454600000000000000000000000000000000600f861660108110611cc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82600183611cd29190613bb8565b81518110611d09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508080611d4a90613ca2565b915050611c5b565b5060008414611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613748565b60405180910390fd5b8091505092915050565b60606000825190506000811415611dc95760405180602001604052806000815250915050611f59565b60006003600283611dda9190613ad7565b611de49190613b2d565b6004611df09190613b5e565b90506000602082611e019190613ad7565b67ffffffffffffffff811115611e40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e725781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001613ea2604091399050600181016020830160005b86811015611f165760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050611e9d565b506003860660018114611f305760028114611f4057611f4b565b613d3d60f01b6002830352611f4b565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fd38383836122ce565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561201657612011816122d3565b612055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205457612053838261231c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120985761209381612489565b6120d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d6576120d582826125cc565b5b5b505050565b6120e6838361264b565b6120f36000848484612137565b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613788565b60405180910390fd5b505050565b60006121588473ffffffffffffffffffffffffffffffffffffffff16612819565b156122c1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261218161148c565b8786866040518563ffffffff1660e01b81526004016121a394939291906136bf565b602060405180830381600087803b1580156121bd57600080fd5b505af19250505080156121ee57506040513d601f19601f820116820180604052508101906121eb9190612b35565b60015b612271573d806000811461221e576040519150601f19603f3d011682016040523d82523d6000602084013e612223565b606091505b50600081511415612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090613788565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c6565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161232984610c91565b6123339190613bb8565b9050600060076000848152602001908152602001600020549050818114612418576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061249d9190613bb8565b90506000600960008481526020019081526020016000205490506000600883815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061253b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125d783610c91565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b2906138a8565b60405180910390fd5b6126c481611420565b15612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906137c8565b60405180910390fd5b61271060008383611fc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127609190613ad7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600061283f61283a84613a34565b613a03565b90508281526020810184848401111561285757600080fd5b612862848285613c60565b509392505050565b600061287d61287884613a64565b613a03565b90508281526020810184848401111561289557600080fd5b6128a0848285613c60565b509392505050565b6000813590506128b781613e45565b92915050565b6000813590506128cc81613e5c565b92915050565b6000813590506128e181613e73565b92915050565b6000815190506128f681613e73565b92915050565b600082601f83011261290d57600080fd5b813561291d84826020860161282c565b91505092915050565b600082601f83011261293757600080fd5b813561294784826020860161286a565b91505092915050565b60008135905061295f81613e8a565b92915050565b60006020828403121561297757600080fd5b6000612985848285016128a8565b91505092915050565b600080604083850312156129a157600080fd5b60006129af858286016128a8565b92505060206129c0858286016128a8565b9150509250929050565b6000806000606084860312156129df57600080fd5b60006129ed868287016128a8565b93505060206129fe868287016128a8565b9250506040612a0f86828701612950565b9150509250925092565b60008060008060808587031215612a2f57600080fd5b6000612a3d878288016128a8565b9450506020612a4e878288016128a8565b9350506040612a5f87828801612950565b925050606085013567ffffffffffffffff811115612a7c57600080fd5b612a88878288016128fc565b91505092959194509250565b60008060408385031215612aa757600080fd5b6000612ab5858286016128a8565b9250506020612ac6858286016128bd565b9150509250929050565b60008060408385031215612ae357600080fd5b6000612af1858286016128a8565b9250506020612b0285828601612950565b9150509250929050565b600060208284031215612b1e57600080fd5b6000612b2c848285016128d2565b91505092915050565b600060208284031215612b4757600080fd5b6000612b55848285016128e7565b91505092915050565b600060208284031215612b7057600080fd5b600082013567ffffffffffffffff811115612b8a57600080fd5b612b9684828501612926565b91505092915050565b600060208284031215612bb157600080fd5b6000612bbf84828501612950565b91505092915050565b612bd181613bec565b82525050565b612be081613bfe565b82525050565b6000612bf182613a94565b612bfb8185613aaa565b9350612c0b818560208601613c6f565b612c1481613e34565b840191505092915050565b6000612c2a82613a9f565b612c348185613abb565b9350612c44818560208601613c6f565b612c4d81613e34565b840191505092915050565b6000612c6382613a9f565b612c6d8185613acc565b9350612c7d818560208601613c6f565b80840191505092915050565b6000612c96602083613abb565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612cd6602b83613abb565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612d3c603283613abb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612da2602683613abb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e08600b83613acc565b91507f7b20226e616d65223a20220000000000000000000000000000000000000000006000830152600b82019050919050565b6000612e48601c83613abb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612e88602483613abb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612eee601983613abb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f2e602c83613abb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f94603883613abb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612ffa602a83613abb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613060602983613abb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130c6600283613acc565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000613106605383613acc565b91507f222c20226465736372697074696f6e223a202254686973206973206120436f6c60008301527f6f722e2055736520697420616e792077617920796f752077616e742e222c202260208301527f6261636b67726f756e645f636f6c6f72223a22000000000000000000000000006040830152605382019050919050565b6000613192602083613abb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006131d2602c83613abb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613238602083613abb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613278601083613abb565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b60006132b8602983613abb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061331e602783613acc565b91507f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008301527f6261736536342c000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000613384600183613acc565b91507f23000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006133c4602183613abb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342a601583613abb565b91507f496e73756666696369656e7420457468657265756d00000000000000000000006000830152602082019050919050565b600061346a601d83613acc565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006134aa603183613abb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613510602c83613abb565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613576601f83613abb565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6135b281613c56565b82525050565b60006135c48288612c58565b91506135d08287612c58565b91506135dc8286612c58565b91506135e88285612c58565b91506135f48284612c58565b91508190509695505050505050565b600061360e82612dfb565b915061361a8286612c58565b9150613625826130f9565b91506136318285612c58565b915061363c82613311565b91506136488284612c58565b9150613653826130b9565b9150819050949350505050565b600061366b82613377565b91506136778284612c58565b915081905092915050565b600061368d8261345d565b91506136998284612c58565b915081905092915050565b60006020820190506136b96000830184612bc8565b92915050565b60006080820190506136d46000830187612bc8565b6136e16020830186612bc8565b6136ee60408301856135a9565b81810360608301526137008184612be6565b905095945050505050565b60006020820190506137206000830184612bd7565b92915050565b600060208201905081810360008301526137408184612c1f565b905092915050565b6000602082019050818103600083015261376181612c89565b9050919050565b6000602082019050818103600083015261378181612cc9565b9050919050565b600060208201905081810360008301526137a181612d2f565b9050919050565b600060208201905081810360008301526137c181612d95565b9050919050565b600060208201905081810360008301526137e181612e3b565b9050919050565b6000602082019050818103600083015261380181612e7b565b9050919050565b6000602082019050818103600083015261382181612ee1565b9050919050565b6000602082019050818103600083015261384181612f21565b9050919050565b6000602082019050818103600083015261386181612f87565b9050919050565b6000602082019050818103600083015261388181612fed565b9050919050565b600060208201905081810360008301526138a181613053565b9050919050565b600060208201905081810360008301526138c181613185565b9050919050565b600060208201905081810360008301526138e1816131c5565b9050919050565b600060208201905081810360008301526139018161322b565b9050919050565b600060208201905081810360008301526139218161326b565b9050919050565b60006020820190508181036000830152613941816132ab565b9050919050565b60006020820190508181036000830152613961816133b7565b9050919050565b600060208201905081810360008301526139818161341d565b9050919050565b600060208201905081810360008301526139a18161349d565b9050919050565b600060208201905081810360008301526139c181613503565b9050919050565b600060208201905081810360008301526139e181613569565b9050919050565b60006020820190506139fd60008301846135a9565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a2a57613a29613e05565b5b8060405250919050565b600067ffffffffffffffff821115613a4f57613a4e613e05565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a7f57613a7e613e05565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ae282613c56565b9150613aed83613c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b2257613b21613d78565b5b828201905092915050565b6000613b3882613c56565b9150613b4383613c56565b925082613b5357613b52613da7565b5b828204905092915050565b6000613b6982613c56565b9150613b7483613c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bad57613bac613d78565b5b828202905092915050565b6000613bc382613c56565b9150613bce83613c56565b925082821015613be157613be0613d78565b5b828203905092915050565b6000613bf782613c36565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c8d578082015181840152602081019050613c72565b83811115613c9c576000848401525b50505050565b6000613cad82613c56565b91506000821415613cc157613cc0613d78565b5b600182039050919050565b60006002820490506001821680613ce457607f821691505b60208210811415613cf857613cf7613dd6565b5b50919050565b6000613d0982613c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3c57613d3b613d78565b5b600182019050919050565b6000613d5282613c56565b9150613d5d83613c56565b925082613d6d57613d6c613da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613e4e81613bec565b8114613e5957600080fd5b50565b613e6581613bfe565b8114613e7057600080fd5b50565b613e7c81613c0a565b8114613e8757600080fd5b50565b613e9381613c56565b8114613e9e57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2222202f3e3c7465787420783d223238322220793d223333362220636c6173733d2262617365223ea2646970667358221220c21005892f2931796b389ef1631e2f2ba622d5a8b784f9d7013a9361ece0624b64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106101405760003560e01c806351b03390116100b6578063a22cb4651161006f578063a22cb46514610475578063a945bf801461049e578063b88d4fde146104c9578063c87b56dd146104f2578063e985e9c51461052f578063f2fde38b1461056c57610140565b806351b033901461035e5780636352211e1461038e57806370a08231146103cb578063715018a6146104085780638da5cb5b1461041f57806395d89b411461044a57610140565b806318160ddd1161010857806318160ddd1461023e57806323b872dd146102695780632f745c591461029257806342842e0e146102cf578063434f48c4146102f85780634f6ccce71461032157610140565b806301ffc9a71461014557806306fdde0314610182578063081812fc146101ad578063095ea7b3146101ea5780631249c58b14610213575b600080fd5b34801561015157600080fd5b5061016c60048036038101906101679190612b0c565b610595565b604051610179919061370b565b60405180910390f35b34801561018e57600080fd5b5061019761060f565b6040516101a49190613726565b60405180910390f35b3480156101b957600080fd5b506101d460048036038101906101cf9190612b9f565b6106a1565b6040516101e191906136a4565b60405180910390f35b3480156101f657600080fd5b50610211600480360381019061020c9190612ad0565b610726565b005b34801561021f57600080fd5b5061022861083e565b60405161023591906139e8565b60405180910390f35b34801561024a57600080fd5b50610253610879565b60405161026091906139e8565b60405180910390f35b34801561027557600080fd5b50610290600480360381019061028b91906129ca565b610886565b005b34801561029e57600080fd5b506102b960048036038101906102b49190612ad0565b6108e6565b6040516102c691906139e8565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906129ca565b61098b565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612b9f565b6109ab565b005b34801561032d57600080fd5b5061034860048036038101906103439190612b9f565b610ae2565b60405161035591906139e8565b60405180910390f35b61037860048036038101906103739190612b5e565b610b79565b60405161038591906139e8565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190612b9f565b610bdf565b6040516103c291906136a4565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190612965565b610c91565b6040516103ff91906139e8565b60405180910390f35b34801561041457600080fd5b5061041d610d49565b005b34801561042b57600080fd5b50610434610dd1565b60405161044191906136a4565b60405180910390f35b34801561045657600080fd5b5061045f610dfb565b60405161046c9190613726565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612a94565b610e8d565b005b3480156104aa57600080fd5b506104b361100e565b6040516104c091906139e8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb9190612a19565b611014565b005b3480156104fe57600080fd5b5061051960048036038101906105149190612b9f565b611076565b6040516105269190613726565b60405180910390f35b34801561053b57600080fd5b506105566004803603810190610551919061298e565b6111b2565b604051610563919061370b565b60405180910390f35b34801561057857600080fd5b50610593600480360381019061058e9190612965565b611246565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061060857506106078261133e565b5b9050919050565b60606000805461061e90613ccc565b80601f016020809104026020016040519081016040528092919081815260200182805461064a90613ccc565b80156106975780601f1061066c57610100808354040283529160200191610697565b820191906000526020600020905b81548152906001019060200180831161067a57829003601f168201915b5050505050905090565b60006106ac82611420565b6106eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e2906138c8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061073182610bdf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079990613948565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107c161148c565b73ffffffffffffffffffffffffffffffffffffffff1614806107f057506107ef816107ea61148c565b6111b2565b5b61082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690613848565b60405180910390fd5b6108398383611494565b505050565b60008061084961154d565b90505b61085581611420565b156108695761086261154d565b905061084c565b6108728161159b565b8091505090565b6000600880549050905090565b61089761089161148c565b82611656565b6108d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cd90613988565b60405180910390fd5b6108e1838383611734565b505050565b60006108f183610c91565b8210610932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092990613768565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109a683838360405180602001604052806000815250611014565b505050565b6002600a5414156109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e8906139c8565b60405180910390fd5b6002600a81905550610a0161148c565b73ffffffffffffffffffffffffffffffffffffffff16610a1f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610a75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6c906138e8565b60405180910390fd5b60008110158015610a875750600c5481105b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613908565b60405180910390fd5b610ad7610ad1610dd1565b82611990565b6001600a8190555050565b6000610aec610879565b8210610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b24906139a8565b60405180910390fd5b60088281548110610b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b600034600e541115610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb790613968565b60405180910390fd5b6000610bcb836119ae565b9050610bd68161159b565b80915050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7f90613888565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990613868565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d5161148c565b73ffffffffffffffffffffffffffffffffffffffff16610d6f610dd1565b73ffffffffffffffffffffffffffffffffffffffff1614610dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbc906138e8565b60405180910390fd5b610dcf6000611aa2565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e0a90613ccc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3690613ccc565b8015610e835780601f10610e5857610100808354040283529160200191610e83565b820191906000526020600020905b815481529060010190602001808311610e6657829003601f168201915b5050505050905090565b610e9561148c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efa90613808565b60405180910390fd5b8060056000610f1061148c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fbd61148c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611002919061370b565b60405180910390a35050565b600e5481565b61102561101f61148c565b83611656565b611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b90613988565b60405180910390fd5b61107084848484611b68565b50505050565b60606000611085836003611bc4565b9050600060405180610100016040528060d38152602001613ee260d3913990506000826040516020016110b89190613660565b60405160208183030381529060405290506000604051806060016040528060278152602001613fb560279139905060006040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525090506000848484868560405160200161113b9594939291906135b8565b60405160208183030381529060405290506000611182858661115c85611da0565b60405160200161116e93929190613603565b604051602081830303815290604052611da0565b9050806040516020016111959190613682565b604051602081830303815290604052975050505050505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61124e61148c565b73ffffffffffffffffffffffffffffffffffffffff1661126c610dd1565b73ffffffffffffffffffffffffffffffffffffffff16146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b9906138e8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611329906137a8565b60405180910390fd5b61133b81611aa2565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061140957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611419575061141882611f5e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661150783610bdf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c54905060006219660b90506000633c6ef35f90508281600d54846115769190613b5e565b6115809190613ad7565b61158a9190613d47565b600d81905550600d54935050505090565b6002600a5414156115e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d8906139c8565b60405180910390fd5b6002600a81905550600081101580156115fb5750600c5481105b61163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190613908565b60405180910390fd5b61164b61164561148c565b82611990565b6001600a8190555050565b600061166182611420565b6116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613828565b60405180910390fd5b60006116ab83610bdf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061171a57508373ffffffffffffffffffffffffffffffffffffffff16611702846106a1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061172b575061172a81856111b2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661175482610bdf565b73ffffffffffffffffffffffffffffffffffffffff16146117aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a190613928565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611811906137e8565b60405180910390fd5b611825838383611fc8565b611830600082611494565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118809190613bb8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118d79190613ad7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6119aa8282604051806020016040528060008152506120dc565b5050565b6000808290506000805b6006811015611a97578060056119ce9190613bb8565b60046119da9190613b5e565b60106000858481518110611a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002054901b82611a829190613ad7565b91508080611a8f90613cfe565b9150506119b8565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b73848484611734565b611b7f84848484612137565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613788565b60405180910390fd5b50505050565b60606000826002611bd59190613b5e565b67ffffffffffffffff811115611c14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c465781602001600182028036833780820191505090505b5090506000836002611c589190613b5e565b90505b6000811115611d52577f3031323334353637383941424344454600000000000000000000000000000000600f861660108110611cc0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b82600183611cd29190613bb8565b81518110611d09577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508080611d4a90613ca2565b915050611c5b565b5060008414611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613748565b60405180910390fd5b8091505092915050565b60606000825190506000811415611dc95760405180602001604052806000815250915050611f59565b60006003600283611dda9190613ad7565b611de49190613b2d565b6004611df09190613b5e565b90506000602082611e019190613ad7565b67ffffffffffffffff811115611e40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611e725781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001613ea2604091399050600181016020830160005b86811015611f165760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b90508084526004840193505050611e9d565b506003860660018114611f305760028114611f4057611f4b565b613d3d60f01b6002830352611f4b565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611fd38383836122ce565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561201657612011816122d3565b612055565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461205457612053838261231c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120985761209381612489565b6120d7565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146120d6576120d582826125cc565b5b5b505050565b6120e6838361264b565b6120f36000848484612137565b612132576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212990613788565b60405180910390fd5b505050565b60006121588473ffffffffffffffffffffffffffffffffffffffff16612819565b156122c1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261218161148c565b8786866040518563ffffffff1660e01b81526004016121a394939291906136bf565b602060405180830381600087803b1580156121bd57600080fd5b505af19250505080156121ee57506040513d601f19601f820116820180604052508101906121eb9190612b35565b60015b612271573d806000811461221e576040519150601f19603f3d011682016040523d82523d6000602084013e612223565b606091505b50600081511415612269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226090613788565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506122c6565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161232984610c91565b6123339190613bb8565b9050600060076000848152602001908152602001600020549050818114612418576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061249d9190613bb8565b90506000600960008481526020019081526020016000205490506000600883815481106124f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061253b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806125b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006125d783610c91565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b2906138a8565b60405180910390fd5b6126c481611420565b15612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb906137c8565b60405180910390fd5b61271060008383611fc8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127609190613ad7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b600061283f61283a84613a34565b613a03565b90508281526020810184848401111561285757600080fd5b612862848285613c60565b509392505050565b600061287d61287884613a64565b613a03565b90508281526020810184848401111561289557600080fd5b6128a0848285613c60565b509392505050565b6000813590506128b781613e45565b92915050565b6000813590506128cc81613e5c565b92915050565b6000813590506128e181613e73565b92915050565b6000815190506128f681613e73565b92915050565b600082601f83011261290d57600080fd5b813561291d84826020860161282c565b91505092915050565b600082601f83011261293757600080fd5b813561294784826020860161286a565b91505092915050565b60008135905061295f81613e8a565b92915050565b60006020828403121561297757600080fd5b6000612985848285016128a8565b91505092915050565b600080604083850312156129a157600080fd5b60006129af858286016128a8565b92505060206129c0858286016128a8565b9150509250929050565b6000806000606084860312156129df57600080fd5b60006129ed868287016128a8565b93505060206129fe868287016128a8565b9250506040612a0f86828701612950565b9150509250925092565b60008060008060808587031215612a2f57600080fd5b6000612a3d878288016128a8565b9450506020612a4e878288016128a8565b9350506040612a5f87828801612950565b925050606085013567ffffffffffffffff811115612a7c57600080fd5b612a88878288016128fc565b91505092959194509250565b60008060408385031215612aa757600080fd5b6000612ab5858286016128a8565b9250506020612ac6858286016128bd565b9150509250929050565b60008060408385031215612ae357600080fd5b6000612af1858286016128a8565b9250506020612b0285828601612950565b9150509250929050565b600060208284031215612b1e57600080fd5b6000612b2c848285016128d2565b91505092915050565b600060208284031215612b4757600080fd5b6000612b55848285016128e7565b91505092915050565b600060208284031215612b7057600080fd5b600082013567ffffffffffffffff811115612b8a57600080fd5b612b9684828501612926565b91505092915050565b600060208284031215612bb157600080fd5b6000612bbf84828501612950565b91505092915050565b612bd181613bec565b82525050565b612be081613bfe565b82525050565b6000612bf182613a94565b612bfb8185613aaa565b9350612c0b818560208601613c6f565b612c1481613e34565b840191505092915050565b6000612c2a82613a9f565b612c348185613abb565b9350612c44818560208601613c6f565b612c4d81613e34565b840191505092915050565b6000612c6382613a9f565b612c6d8185613acc565b9350612c7d818560208601613c6f565b80840191505092915050565b6000612c96602083613abb565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612cd6602b83613abb565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612d3c603283613abb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612da2602683613abb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e08600b83613acc565b91507f7b20226e616d65223a20220000000000000000000000000000000000000000006000830152600b82019050919050565b6000612e48601c83613abb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612e88602483613abb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612eee601983613abb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f2e602c83613abb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612f94603883613abb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000612ffa602a83613abb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613060602983613abb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006130c6600283613acc565b91507f227d0000000000000000000000000000000000000000000000000000000000006000830152600282019050919050565b6000613106605383613acc565b91507f222c20226465736372697074696f6e223a202254686973206973206120436f6c60008301527f6f722e2055736520697420616e792077617920796f752077616e742e222c202260208301527f6261636b67726f756e645f636f6c6f72223a22000000000000000000000000006040830152605382019050919050565b6000613192602083613abb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006131d2602c83613abb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613238602083613abb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613278601083613abb565b91507f546f6b656e20494420696e76616c6964000000000000000000000000000000006000830152602082019050919050565b60006132b8602983613abb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061331e602783613acc565b91507f222c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b60008301527f6261736536342c000000000000000000000000000000000000000000000000006020830152602782019050919050565b6000613384600183613acc565b91507f23000000000000000000000000000000000000000000000000000000000000006000830152600182019050919050565b60006133c4602183613abb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342a601583613abb565b91507f496e73756666696369656e7420457468657265756d00000000000000000000006000830152602082019050919050565b600061346a601d83613acc565b91507f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000006000830152601d82019050919050565b60006134aa603183613abb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613510602c83613abb565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613576601f83613abb565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b6135b281613c56565b82525050565b60006135c48288612c58565b91506135d08287612c58565b91506135dc8286612c58565b91506135e88285612c58565b91506135f48284612c58565b91508190509695505050505050565b600061360e82612dfb565b915061361a8286612c58565b9150613625826130f9565b91506136318285612c58565b915061363c82613311565b91506136488284612c58565b9150613653826130b9565b9150819050949350505050565b600061366b82613377565b91506136778284612c58565b915081905092915050565b600061368d8261345d565b91506136998284612c58565b915081905092915050565b60006020820190506136b96000830184612bc8565b92915050565b60006080820190506136d46000830187612bc8565b6136e16020830186612bc8565b6136ee60408301856135a9565b81810360608301526137008184612be6565b905095945050505050565b60006020820190506137206000830184612bd7565b92915050565b600060208201905081810360008301526137408184612c1f565b905092915050565b6000602082019050818103600083015261376181612c89565b9050919050565b6000602082019050818103600083015261378181612cc9565b9050919050565b600060208201905081810360008301526137a181612d2f565b9050919050565b600060208201905081810360008301526137c181612d95565b9050919050565b600060208201905081810360008301526137e181612e3b565b9050919050565b6000602082019050818103600083015261380181612e7b565b9050919050565b6000602082019050818103600083015261382181612ee1565b9050919050565b6000602082019050818103600083015261384181612f21565b9050919050565b6000602082019050818103600083015261386181612f87565b9050919050565b6000602082019050818103600083015261388181612fed565b9050919050565b600060208201905081810360008301526138a181613053565b9050919050565b600060208201905081810360008301526138c181613185565b9050919050565b600060208201905081810360008301526138e1816131c5565b9050919050565b600060208201905081810360008301526139018161322b565b9050919050565b600060208201905081810360008301526139218161326b565b9050919050565b60006020820190508181036000830152613941816132ab565b9050919050565b60006020820190508181036000830152613961816133b7565b9050919050565b600060208201905081810360008301526139818161341d565b9050919050565b600060208201905081810360008301526139a18161349d565b9050919050565b600060208201905081810360008301526139c181613503565b9050919050565b600060208201905081810360008301526139e181613569565b9050919050565b60006020820190506139fd60008301846135a9565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613a2a57613a29613e05565b5b8060405250919050565b600067ffffffffffffffff821115613a4f57613a4e613e05565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613a7f57613a7e613e05565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ae282613c56565b9150613aed83613c56565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b2257613b21613d78565b5b828201905092915050565b6000613b3882613c56565b9150613b4383613c56565b925082613b5357613b52613da7565b5b828204905092915050565b6000613b6982613c56565b9150613b7483613c56565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bad57613bac613d78565b5b828202905092915050565b6000613bc382613c56565b9150613bce83613c56565b925082821015613be157613be0613d78565b5b828203905092915050565b6000613bf782613c36565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c8d578082015181840152602081019050613c72565b83811115613c9c576000848401525b50505050565b6000613cad82613c56565b91506000821415613cc157613cc0613d78565b5b600182039050919050565b60006002820490506001821680613ce457607f821691505b60208210811415613cf857613cf7613dd6565b5b50919050565b6000613d0982613c56565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d3c57613d3b613d78565b5b600182019050919050565b6000613d5282613c56565b9150613d5d83613c56565b925082613d6d57613d6c613da7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613e4e81613bec565b8114613e5957600080fd5b50565b613e6581613bfe565b8114613e7057600080fd5b50565b613e7c81613c0a565b8114613e8757600080fd5b50565b613e9381613c56565b8114613e9e57600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d2222202f3e3c7465787420783d223238322220793d223333362220636c6173733d2262617365223ea2646970667358221220c21005892f2931796b389ef1631e2f2ba622d5a8b784f9d7013a9361ece0624b64736f6c63430008000033
Deployed Bytecode Sourcemap
46022:2909:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37913:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25027:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26586:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26109:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46761:234;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38553:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27476:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38221:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27886:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47007:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38743:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46493:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24721:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24451:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9419:94;;;;;;;;;;;;;:::i;:::-;;8768:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25196:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26879:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46166:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28142:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47202:1013;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27245:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9668:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37913:224;38015:4;38054:35;38039:50;;;:11;:50;;;;:90;;;;38093:36;38117:11;38093:23;:36::i;:::-;38039:90;38032:97;;37913:224;;;:::o;25027:100::-;25081:13;25114:5;25107:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25027:100;:::o;26586:221::-;26662:7;26690:16;26698:7;26690;:16::i;:::-;26682:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26775:15;:24;26791:7;26775:24;;;;;;;;;;;;;;;;;;;;;26768:31;;26586:221;;;:::o;26109:411::-;26190:13;26206:23;26221:7;26206:14;:23::i;:::-;26190:39;;26254:5;26248:11;;:2;:11;;;;26240:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26348:5;26332:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26357:37;26374:5;26381:12;:10;:12::i;:::-;26357:16;:37::i;:::-;26332:62;26310:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26491:21;26500:2;26504:7;26491:8;:21::i;:::-;26109:411;;;:::o;46761:234::-;46795:7;46815:15;46833:13;:11;:13::i;:::-;46815:31;;46859:75;46866:16;46874:7;46866;:16::i;:::-;46859:75;;;46909:13;:11;:13::i;:::-;46899:23;;46859:75;;;46944:18;46954:7;46944:9;:18::i;:::-;46980:7;46973:14;;;46761:234;:::o;38553:113::-;38614:7;38641:10;:17;;;;38634:24;;38553:113;:::o;27476:339::-;27671:41;27690:12;:10;:12::i;:::-;27704:7;27671:18;:41::i;:::-;27663:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27779:28;27789:4;27795:2;27799:7;27779:9;:28::i;:::-;27476:339;;;:::o;38221:256::-;38318:7;38354:23;38371:5;38354:16;:23::i;:::-;38346:5;:31;38338:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38443:12;:19;38456:5;38443:19;;;;;;;;;;;;;;;:26;38463:5;38443:26;;;;;;;;;;;;38436:33;;38221:256;;;;:::o;27886:185::-;28024:39;28041:4;28047:2;28051:7;28024:39;;;;;;;;;;;;:16;:39::i;:::-;27886:185;;;:::o;47007:187::-;11707:1;12303:7;;:19;;12295:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11707:1;12436:7;:18;;;;8999:12:::1;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47104:1:::2;47093:7;:12;;:34;;;;;47119:8;;47109:7;:18;47093:34;47085:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47159:27;47169:7;:5;:7::i;:::-;47178;47159:9;:27::i;:::-;11663:1:::0;12615:7;:22;;;;47007:187;:::o;38743:233::-;38818:7;38854:30;:28;:30::i;:::-;38846:5;:38;38838:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38951:10;38962:5;38951:17;;;;;;;;;;;;;;;;;;;;;;;;38944:24;;38743:233;;;:::o;46493:260::-;46558:7;46601:9;46586:11;;:24;;46578:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46657:15;46675:16;46684:6;46675:8;:16::i;:::-;46657:34;;46702:18;46712:7;46702:9;:18::i;:::-;46738:7;46731:14;;;46493:260;;;:::o;24721:239::-;24793:7;24813:13;24829:7;:16;24837:7;24829:16;;;;;;;;;;;;;;;;;;;;;24813:32;;24881:1;24864:19;;:5;:19;;;;24856:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24947:5;24940:12;;;24721:239;;;:::o;24451:208::-;24523:7;24568:1;24551:19;;:5;:19;;;;24543:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24635:9;:16;24645:5;24635:16;;;;;;;;;;;;;;;;24628:23;;24451:208;;;:::o;9419:94::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9484:21:::1;9502:1;9484:9;:21::i;:::-;9419:94::o:0;8768:87::-;8814:7;8841:6;;;;;;;;;;;8834:13;;8768:87;:::o;25196:104::-;25252:13;25285:7;25278:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25196:104;:::o;26879:295::-;26994:12;:10;:12::i;:::-;26982:24;;:8;:24;;;;26974:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27094:8;27049:18;:32;27068:12;:10;:12::i;:::-;27049:32;;;;;;;;;;;;;;;:42;27082:8;27049:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27147:8;27118:48;;27133:12;:10;:12::i;:::-;27118:48;;;27157:8;27118:48;;;;;;:::i;:::-;;;;;;;;26879:295;;:::o;46166:39::-;;;;:::o;28142:328::-;28317:41;28336:12;:10;:12::i;:::-;28350:7;28317:18;:41::i;:::-;28309:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28423:39;28437:4;28443:2;28447:7;28456:5;28423:13;:39::i;:::-;28142:328;;;;:::o;47202:1013::-;47267:13;47293:22;47318:31;47338:7;47347:1;47318:19;:31::i;:::-;47293:56;;47360:16;:232;;;;;;;;;;;;;;;;;;;47603:16;47651:8;47629:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;47603:58;;47672:16;:60;;;;;;;;;;;;;;;;;;;47743:16;:34;;;;;;;;;;;;;;;;;;;47788:22;47837:2;47841;47845;47849;47853;47820:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47788:69;;47868:18;47889:237;47948:2;48039;48086:30;48106:8;48086:13;:30::i;:::-;47916:207;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47889:13;:237::i;:::-;47868:258;;48201:4;48151:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;48137:70;;;;;;;;;47202:1013;;;:::o;27245:164::-;27342:4;27366:18;:25;27385:5;27366:25;;;;;;;;;;;;;;;:35;27392:8;27366:35;;;;;;;;;;;;;;;;;;;;;;;;;27359:42;;27245:164;;;;:::o;9668:192::-;8999:12;:10;:12::i;:::-;8988:23;;:7;:5;:7::i;:::-;:23;;;8980:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9777:1:::1;9757:22;;:8;:22;;;;9749:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9833:19;9843:8;9833:9;:19::i;:::-;9668:192:::0;:::o;24082:305::-;24184:4;24236:25;24221:40;;;:11;:40;;;;:105;;;;24293:33;24278:48;;;:11;:48;;;;24221:105;:158;;;;24343:36;24367:11;24343:23;:36::i;:::-;24221:158;24201:178;;24082:305;;;:::o;29980:127::-;30045:4;30097:1;30069:30;;:7;:16;30077:7;30069:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30062:37;;29980:127;;;:::o;7628:98::-;7681:7;7708:10;7701:17;;7628:98;:::o;33962:174::-;34064:2;34037:15;:24;34053:7;34037:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34120:7;34116:2;34082:46;;34091:23;34106:7;34091:14;:23::i;:::-;34082:46;;;;;;;;;;;;33962:174;;:::o;48706:222::-;48747:7;48767:6;48776:8;;48767:17;;48795:6;48804:7;48795:16;;48822:6;48831:10;48822:19;;48890:1;48885;48871:11;;48867:1;:15;;;;:::i;:::-;:19;;;;:::i;:::-;48866:25;;;;:::i;:::-;48852:11;:39;;;;48909:11;;48902:18;;;;;48706:222;:::o;48515:183::-;11707:1;12303:7;;:19;;12295:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11707:1;12436:7;:18;;;;48603:1:::1;48592:7;:12;;:34;;;;;48618:8;;48608:7;:18;48592:34;48584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;48658:32;48668:12;:10;:12::i;:::-;48682:7;48658:9;:32::i;:::-;11663:1:::0;12615:7;:22;;;;48515:183;:::o;30274:348::-;30367:4;30392:16;30400:7;30392;:16::i;:::-;30384:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30468:13;30484:23;30499:7;30484:14;:23::i;:::-;30468:39;;30537:5;30526:16;;:7;:16;;;:51;;;;30570:7;30546:31;;:20;30558:7;30546:11;:20::i;:::-;:31;;;30526:51;:87;;;;30581:32;30598:5;30605:7;30581:16;:32::i;:::-;30526:87;30518:96;;;30274:348;;;;:::o;33266:578::-;33425:4;33398:31;;:23;33413:7;33398:14;:23::i;:::-;:31;;;33390:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33508:1;33494:16;;:2;:16;;;;33486:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33564:39;33585:4;33591:2;33595:7;33564:20;:39::i;:::-;33668:29;33685:1;33689:7;33668:8;:29::i;:::-;33729:1;33710:9;:15;33720:4;33710:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33758:1;33741:9;:13;33751:2;33741:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33789:2;33770:7;:16;33778:7;33770:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33828:7;33824:2;33809:27;;33818:4;33809:27;;;;;;;;;;;;33266:578;;;:::o;30964:110::-;31040:26;31050:2;31054:7;31040:26;;;;;;;;;;;;:9;:26::i;:::-;30964:110;;:::o;48223:284::-;48286:7;48306:21;48336:6;48306:37;;48354:11;48384:6;48380:99;48400:1;48396;:5;48380:99;;;48464:1;48462;:3;;;;:::i;:::-;48459:1;:7;;;;:::i;:::-;48430:11;:24;48442:8;48451:1;48442:11;;;;;;;;;;;;;;;;;;;;;;;;48430:24;;;;;;;;;;;;;;;;;;:37;;48423:44;;;;;:::i;:::-;;;48403:3;;;;;:::i;:::-;;;;48380:99;;;;48496:3;48489:10;;;;48223:284;;;:::o;9868:173::-;9924:16;9943:6;;;;;;;;;;;9924:25;;9969:8;9960:6;;:17;;;;;;;;;;;;;;;;;;10024:8;9993:40;;10014:8;9993:40;;;;;;;;;;;;9868:173;;:::o;29352:315::-;29509:28;29519:4;29525:2;29529:7;29509:9;:28::i;:::-;29556:48;29579:4;29585:2;29589:7;29598:5;29556:22;:48::i;:::-;29548:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29352:315;;;;:::o;6683:393::-;6758:13;6784:19;6820:6;6816:1;:10;;;;:::i;:::-;6806:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6784:43;;6843:9;6859:6;6855:1;:10;;;;:::i;:::-;6843:22;;6838:133;6871:1;6867;:5;6838:133;;;6908:12;6929:3;6921:5;:11;6908:25;;;;;;;;;;;;;;;;;;6894:6;6903:1;6901;:3;;;;:::i;:::-;6894:11;;;;;;;;;;;;;;;;;;;:39;;;;;;;;;;;6958:1;6948:11;;;;;6874:3;;;;;:::i;:::-;;;;6838:133;;;;6998:1;6989:5;:10;6981:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;7061:6;7047:21;;;6683:393;;;;:::o;44408:1607::-;44466:13;44492:11;44506:4;:11;44492:25;;44539:1;44532:3;:8;44528:23;;;44542:9;;;;;;;;;;;;;;;;;44528:23;44603:18;44641:1;44636;44630:3;:7;;;;:::i;:::-;44629:13;;;;:::i;:::-;44624:1;:19;;;;:::i;:::-;44603:40;;44701:19;44746:2;44733:10;:15;;;;:::i;:::-;44723:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44701:48;;44762:18;44783:5;;;;;;;;;;;;;;;;;44762:26;;44852:1;44845:5;44841:13;44897:2;44889:6;44885:15;44948:1;44916:777;44971:3;44968:1;44965:10;44916:777;;;45026:1;45023;45019:9;45014:14;;45084:8;45079:1;45073:4;45069:12;45063:19;45059:34;45164:4;45156:5;45152:2;45148:14;45144:25;45134:8;45130:40;45124:47;45203:3;45200:1;45196:11;45189:18;;45294:4;45285;45277:5;45273:2;45269:14;45265:25;45255:8;45251:40;45245:47;45241:58;45236:3;45232:68;45225:75;;45332:3;45329:1;45325:11;45318:18;;45422:4;45413;45405:5;45402:1;45398:13;45394:24;45384:8;45380:39;45374:46;45370:57;45365:3;45361:67;45354:74;;45460:3;45457:1;45453:11;45446:18;;45542:4;45533;45526:5;45522:16;45512:8;45508:31;45502:38;45498:49;45493:3;45489:59;45482:66;;45582:3;45577;45573:13;45566:20;;45624:3;45613:9;45606:22;45676:1;45665:9;45661:17;45648:30;;44995:698;;44916:777;;;44920:44;45725:1;45720:3;45716:11;45746:1;45741:84;;;;45844:1;45839:82;;;;45709:212;;45741:84;45802:6;45797:3;45793:16;45789:1;45778:9;45774:17;45767:43;45741:84;;45839:82;45900:4;45895:3;45891:14;45887:1;45876:9;45872:17;45865:41;45709:212;;45952:10;45944:6;45937:26;44810:1164;;46000:6;45986:21;;;;;;44408:1607;;;;:::o;22689:157::-;22774:4;22813:25;22798:40;;;:11;:40;;;;22791:47;;22689:157;;;:::o;39589:589::-;39733:45;39760:4;39766:2;39770:7;39733:26;:45::i;:::-;39811:1;39795:18;;:4;:18;;;39791:187;;;39830:40;39862:7;39830:31;:40::i;:::-;39791:187;;;39900:2;39892:10;;:4;:10;;;39888:90;;39919:47;39952:4;39958:7;39919:32;:47::i;:::-;39888:90;39791:187;40006:1;39992:16;;:2;:16;;;39988:183;;;40025:45;40062:7;40025:36;:45::i;:::-;39988:183;;;40098:4;40092:10;;:2;:10;;;40088:83;;40119:40;40147:2;40151:7;40119:27;:40::i;:::-;40088:83;39988:183;39589:589;;;:::o;31301:321::-;31431:18;31437:2;31441:7;31431:5;:18::i;:::-;31482:54;31513:1;31517:2;31521:7;31530:5;31482:22;:54::i;:::-;31460:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31301:321;;;:::o;34701:803::-;34856:4;34877:15;:2;:13;;;:15::i;:::-;34873:624;;;34929:2;34913:36;;;34950:12;:10;:12::i;:::-;34964:4;34970:7;34979:5;34913:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34909:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35176:1;35159:6;:13;:18;35155:272;;;35202:60;;;;;;;;;;:::i;:::-;;;;;;;;35155:272;35377:6;35371:13;35362:6;35358:2;35354:15;35347:38;34909:533;35046:45;;;35036:55;;;:6;:55;;;;35029:62;;;;;34873:624;35481:4;35474:11;;34701:803;;;;;;;:::o;36076:126::-;;;;:::o;40901:164::-;41005:10;:17;;;;40978:15;:24;40994:7;40978:24;;;;;;;;;;;:44;;;;41033:10;41049:7;41033:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40901:164;:::o;41692:988::-;41958:22;42008:1;41983:22;42000:4;41983:16;:22::i;:::-;:26;;;;:::i;:::-;41958:51;;42020:18;42041:17;:26;42059:7;42041:26;;;;;;;;;;;;42020:47;;42188:14;42174:10;:28;42170:328;;42219:19;42241:12;:18;42254:4;42241:18;;;;;;;;;;;;;;;:34;42260:14;42241:34;;;;;;;;;;;;42219:56;;42325:11;42292:12;:18;42305:4;42292:18;;;;;;;;;;;;;;;:30;42311:10;42292:30;;;;;;;;;;;:44;;;;42442:10;42409:17;:30;42427:11;42409:30;;;;;;;;;;;:43;;;;42170:328;;42594:17;:26;42612:7;42594:26;;;;;;;;;;;42587:33;;;42638:12;:18;42651:4;42638:18;;;;;;;;;;;;;;;:34;42657:14;42638:34;;;;;;;;;;;42631:41;;;41692:988;;;;:::o;42975:1079::-;43228:22;43273:1;43253:10;:17;;;;:21;;;;:::i;:::-;43228:46;;43285:18;43306:15;:24;43322:7;43306:24;;;;;;;;;;;;43285:45;;43657:19;43679:10;43690:14;43679:26;;;;;;;;;;;;;;;;;;;;;;;;43657:48;;43743:11;43718:10;43729;43718:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43854:10;43823:15;:28;43839:11;43823:28;;;;;;;;;;;:41;;;;43995:15;:24;44011:7;43995:24;;;;;;;;;;;43988:31;;;44030:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42975:1079;;;;:::o;40479:221::-;40564:14;40581:20;40598:2;40581:16;:20::i;:::-;40564:37;;40639:7;40612:12;:16;40625:2;40612:16;;;;;;;;;;;;;;;:24;40629:6;40612:24;;;;;;;;;;;:34;;;;40686:6;40657:17;:26;40675:7;40657:26;;;;;;;;;;;:35;;;;40479:221;;;:::o;31958:382::-;32052:1;32038:16;;:2;:16;;;;32030:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32111:16;32119:7;32111;:16::i;:::-;32110:17;32102:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32173:45;32202:1;32206:2;32210:7;32173:20;:45::i;:::-;32248:1;32231:9;:13;32241:2;32231:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32279:2;32260:7;:16;32268:7;32260:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32324:7;32320:2;32299:33;;32316:1;32299:33;;;;;;;;;;;;31958:382;;:::o;14861:387::-;14921:4;15129:12;15196:7;15184:20;15176:28;;15239:1;15232:4;:8;15225:15;;;14861:387;;;:::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:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:260::-;;4988:2;4976:9;4967:7;4963:23;4959:32;4956:2;;;5004:1;5001;4994:12;4956:2;5047:1;5072:52;5116:7;5107:6;5096:9;5092:22;5072:52;:::i;:::-;5062:62;;5018:116;4946:195;;;;:::o;5147:282::-;;5265:2;5253:9;5244:7;5240:23;5236:32;5233:2;;;5281:1;5278;5271:12;5233:2;5324:1;5349:63;5404:7;5395:6;5384:9;5380:22;5349:63;:::i;:::-;5339:73;;5295:127;5223:206;;;;:::o;5435:375::-;;5553:2;5541:9;5532:7;5528:23;5524:32;5521:2;;;5569:1;5566;5559:12;5521:2;5640:1;5629:9;5625:17;5612:31;5670:18;5662:6;5659:30;5656:2;;;5702:1;5699;5692:12;5656:2;5730:63;5785:7;5776:6;5765:9;5761:22;5730:63;:::i;:::-;5720:73;;5583:220;5511:299;;;;:::o;5816:262::-;;5924:2;5912:9;5903:7;5899:23;5895:32;5892:2;;;5940:1;5937;5930:12;5892:2;5983:1;6008:53;6053:7;6044:6;6033:9;6029:22;6008:53;:::i;:::-;5998:63;;5954:117;5882:196;;;;:::o;6084:118::-;6171:24;6189:5;6171:24;:::i;:::-;6166:3;6159:37;6149:53;;:::o;6208:109::-;6289:21;6304:5;6289:21;:::i;:::-;6284:3;6277:34;6267:50;;:::o;6323:360::-;;6437:38;6469:5;6437:38;:::i;:::-;6491:70;6554:6;6549:3;6491:70;:::i;:::-;6484:77;;6570:52;6615:6;6610:3;6603:4;6596:5;6592:16;6570:52;:::i;:::-;6647:29;6669:6;6647:29;:::i;:::-;6642:3;6638:39;6631:46;;6413:270;;;;;:::o;6689:364::-;;6805:39;6838:5;6805:39;:::i;:::-;6860:71;6924:6;6919:3;6860:71;:::i;:::-;6853:78;;6940:52;6985:6;6980:3;6973:4;6966:5;6962:16;6940:52;:::i;:::-;7017:29;7039:6;7017:29;:::i;:::-;7012:3;7008:39;7001:46;;6781:272;;;;;:::o;7059:377::-;;7193:39;7226:5;7193:39;:::i;:::-;7248:89;7330:6;7325:3;7248:89;:::i;:::-;7241:96;;7346:52;7391:6;7386:3;7379:4;7372:5;7368:16;7346:52;:::i;:::-;7423:6;7418:3;7414:16;7407:23;;7169:267;;;;;:::o;7442:330::-;;7605:67;7669:2;7664:3;7605:67;:::i;:::-;7598:74;;7702:34;7698:1;7693:3;7689:11;7682:55;7763:2;7758:3;7754:12;7747:19;;7588:184;;;:::o;7778:375::-;;7941:67;8005:2;8000:3;7941:67;:::i;:::-;7934:74;;8038:34;8034:1;8029:3;8025:11;8018:55;8104:13;8099:2;8094:3;8090:12;8083:35;8144:2;8139:3;8135:12;8128:19;;7924:229;;;:::o;8159:382::-;;8322:67;8386:2;8381:3;8322:67;:::i;:::-;8315:74;;8419:34;8415:1;8410:3;8406:11;8399:55;8485:20;8480:2;8475:3;8471:12;8464:42;8532:2;8527:3;8523:12;8516:19;;8305:236;;;:::o;8547:370::-;;8710:67;8774:2;8769:3;8710:67;:::i;:::-;8703:74;;8807:34;8803:1;8798:3;8794:11;8787:55;8873:8;8868:2;8863:3;8859:12;8852:30;8908:2;8903:3;8899:12;8892:19;;8693:224;;;:::o;8923:398::-;;9104:85;9186:2;9181:3;9104:85;:::i;:::-;9097:92;;9219:66;9215:1;9210:3;9206:11;9199:87;9312:2;9307:3;9303:12;9296:19;;9087:234;;;:::o;9327:326::-;;9490:67;9554:2;9549:3;9490:67;:::i;:::-;9483:74;;9587:30;9583:1;9578:3;9574:11;9567:51;9644:2;9639:3;9635:12;9628:19;;9473:180;;;:::o;9659:368::-;;9822:67;9886:2;9881:3;9822:67;:::i;:::-;9815:74;;9919:34;9915:1;9910:3;9906:11;9899:55;9985:6;9980:2;9975:3;9971:12;9964:28;10018:2;10013:3;10009:12;10002:19;;9805:222;;;:::o;10033:323::-;;10196:67;10260:2;10255:3;10196:67;:::i;:::-;10189:74;;10293:27;10289:1;10284:3;10280:11;10273:48;10347:2;10342:3;10338:12;10331:19;;10179:177;;;:::o;10362:376::-;;10525:67;10589:2;10584:3;10525:67;:::i;:::-;10518:74;;10622:34;10618:1;10613:3;10609:11;10602:55;10688:14;10683:2;10678:3;10674:12;10667:36;10729:2;10724:3;10720:12;10713:19;;10508:230;;;:::o;10744:388::-;;10907:67;10971:2;10966:3;10907:67;:::i;:::-;10900:74;;11004:34;11000:1;10995:3;10991:11;10984:55;11070:26;11065:2;11060:3;11056:12;11049:48;11123:2;11118:3;11114:12;11107:19;;10890:242;;;:::o;11138:374::-;;11301:67;11365:2;11360:3;11301:67;:::i;:::-;11294:74;;11398:34;11394:1;11389:3;11385:11;11378:55;11464:12;11459:2;11454:3;11450:12;11443:34;11503:2;11498:3;11494:12;11487:19;;11284:228;;;:::o;11518:373::-;;11681:67;11745:2;11740:3;11681:67;:::i;:::-;11674:74;;11778:34;11774:1;11769:3;11765:11;11758:55;11844:11;11839:2;11834:3;11830:12;11823:33;11882:2;11877:3;11873:12;11866:19;;11664:227;;;:::o;11897:396::-;;12078:84;12160:1;12155:3;12078:84;:::i;:::-;12071:91;;12192:66;12188:1;12183:3;12179:11;12172:87;12285:1;12280:3;12276:11;12269:18;;12061:232;;;:::o;12299:594::-;;12480:85;12562:2;12557:3;12480:85;:::i;:::-;12473:92;;12595:66;12591:1;12586:3;12582:11;12575:87;12693:66;12688:2;12683:3;12679:12;12672:88;12791:66;12786:2;12781:3;12777:12;12770:88;12884:2;12879:3;12875:12;12868:19;;12463:430;;;:::o;12899:330::-;;13062:67;13126:2;13121:3;13062:67;:::i;:::-;13055:74;;13159:34;13155:1;13150:3;13146:11;13139:55;13220:2;13215:3;13211:12;13204:19;;13045:184;;;:::o;13235:376::-;;13398:67;13462:2;13457:3;13398:67;:::i;:::-;13391:74;;13495:34;13491:1;13486:3;13482:11;13475:55;13561:14;13556:2;13551:3;13547:12;13540:36;13602:2;13597:3;13593:12;13586:19;;13381:230;;;:::o;13617:330::-;;13780:67;13844:2;13839:3;13780:67;:::i;:::-;13773:74;;13877:34;13873:1;13868:3;13864:11;13857:55;13938:2;13933:3;13929:12;13922:19;;13763:184;;;:::o;13953:314::-;;14116:67;14180:2;14175:3;14116:67;:::i;:::-;14109:74;;14213:18;14209:1;14204:3;14200:11;14193:39;14258:2;14253:3;14249:12;14242:19;;14099:168;;;:::o;14273:373::-;;14436:67;14500:2;14495:3;14436:67;:::i;:::-;14429:74;;14533:34;14529:1;14524:3;14520:11;14513:55;14599:11;14594:2;14589:3;14585:12;14578:33;14637:2;14632:3;14628:12;14621:19;;14419:227;;;:::o;14652:439::-;;14833:85;14915:2;14910:3;14833:85;:::i;:::-;14826:92;;14948:66;14944:1;14939:3;14935:11;14928:87;15046:9;15041:2;15036:3;15032:12;15025:31;15082:2;15077:3;15073:12;15066:19;;14816:275;;;:::o;15097:333::-;;15278:84;15360:1;15355:3;15278:84;:::i;:::-;15271:91;;15392:3;15388:1;15383:3;15379:11;15372:24;15422:1;15417:3;15413:11;15406:18;;15261:169;;;:::o;15436:365::-;;15599:67;15663:2;15658:3;15599:67;:::i;:::-;15592:74;;15696:34;15692:1;15687:3;15683:11;15676:55;15762:3;15757:2;15752:3;15748:12;15741:25;15792:2;15787:3;15783:12;15776:19;;15582:219;;;:::o;15807:319::-;;15970:67;16034:2;16029:3;15970:67;:::i;:::-;15963:74;;16067:23;16063:1;16058:3;16054:11;16047:44;16117:2;16112:3;16108:12;16101:19;;15953:173;;;:::o;16132:363::-;;16313:85;16395:2;16390:3;16313:85;:::i;:::-;16306:92;;16428:31;16424:1;16419:3;16415:11;16408:52;16486:2;16481:3;16477:12;16470:19;;16296:199;;;:::o;16501:381::-;;16664:67;16728:2;16723:3;16664:67;:::i;:::-;16657:74;;16761:34;16757:1;16752:3;16748:11;16741:55;16827:19;16822:2;16817:3;16813:12;16806:41;16873:2;16868:3;16864:12;16857:19;;16647:235;;;:::o;16888:376::-;;17051:67;17115:2;17110:3;17051:67;:::i;:::-;17044:74;;17148:34;17144:1;17139:3;17135:11;17128:55;17214:14;17209:2;17204:3;17200:12;17193:36;17255:2;17250:3;17246:12;17239:19;;17034:230;;;:::o;17270:329::-;;17433:67;17497:2;17492:3;17433:67;:::i;:::-;17426:74;;17530:33;17526:1;17521:3;17517:11;17510:54;17590:2;17585:3;17581:12;17574:19;;17416:183;;;:::o;17605:118::-;17692:24;17710:5;17692:24;:::i;:::-;17687:3;17680:37;17670:53;;:::o;17729:915::-;;18075:95;18166:3;18157:6;18075:95;:::i;:::-;18068:102;;18187:95;18278:3;18269:6;18187:95;:::i;:::-;18180:102;;18299:95;18390:3;18381:6;18299:95;:::i;:::-;18292:102;;18411:95;18502:3;18493:6;18411:95;:::i;:::-;18404:102;;18523:95;18614:3;18605:6;18523:95;:::i;:::-;18516:102;;18635:3;18628:10;;18057:587;;;;;;;;:::o;18650:1659::-;;19304:148;19448:3;19304:148;:::i;:::-;19297:155;;19469:95;19560:3;19551:6;19469:95;:::i;:::-;19462:102;;19581:148;19725:3;19581:148;:::i;:::-;19574:155;;19746:95;19837:3;19828:6;19746:95;:::i;:::-;19739:102;;19858:148;20002:3;19858:148;:::i;:::-;19851:155;;20023:95;20114:3;20105:6;20023:95;:::i;:::-;20016:102;;20135:148;20279:3;20135:148;:::i;:::-;20128:155;;20300:3;20293:10;;19286:1023;;;;;;:::o;20315:541::-;;20570:148;20714:3;20570:148;:::i;:::-;20563:155;;20735:95;20826:3;20817:6;20735:95;:::i;:::-;20728:102;;20847:3;20840:10;;20552:304;;;;:::o;20862:541::-;;21117:148;21261:3;21117:148;:::i;:::-;21110:155;;21282:95;21373:3;21364:6;21282:95;:::i;:::-;21275:102;;21394:3;21387:10;;21099:304;;;;:::o;21409:222::-;;21540:2;21529:9;21525:18;21517:26;;21553:71;21621:1;21610:9;21606:17;21597:6;21553:71;:::i;:::-;21507:124;;;;:::o;21637:640::-;;21870:3;21859:9;21855:19;21847:27;;21884:71;21952:1;21941:9;21937:17;21928:6;21884:71;:::i;:::-;21965:72;22033:2;22022:9;22018:18;22009:6;21965:72;:::i;:::-;22047;22115:2;22104:9;22100:18;22091:6;22047:72;:::i;:::-;22166:9;22160:4;22156:20;22151:2;22140:9;22136:18;22129:48;22194:76;22265:4;22256:6;22194:76;:::i;:::-;22186:84;;21837:440;;;;;;;:::o;22283:210::-;;22408:2;22397:9;22393:18;22385:26;;22421:65;22483:1;22472:9;22468:17;22459:6;22421:65;:::i;:::-;22375:118;;;;:::o;22499:313::-;;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:78;22800:4;22791:6;22727:78;:::i;:::-;22719:86;;22617:195;;;;:::o;22818:419::-;;23022:2;23011:9;23007:18;22999:26;;23071:9;23065:4;23061:20;23057:1;23046:9;23042:17;23035:47;23099:131;23225:4;23099:131;:::i;:::-;23091:139;;22989:248;;;:::o;23243:419::-;;23447:2;23436:9;23432:18;23424:26;;23496:9;23490:4;23486:20;23482:1;23471:9;23467:17;23460:47;23524:131;23650:4;23524:131;:::i;:::-;23516:139;;23414:248;;;:::o;23668:419::-;;23872:2;23861:9;23857:18;23849:26;;23921:9;23915:4;23911:20;23907:1;23896:9;23892:17;23885:47;23949:131;24075:4;23949:131;:::i;:::-;23941:139;;23839:248;;;:::o;24093:419::-;;24297:2;24286:9;24282:18;24274:26;;24346:9;24340:4;24336:20;24332:1;24321:9;24317:17;24310:47;24374:131;24500:4;24374:131;:::i;:::-;24366:139;;24264:248;;;:::o;24518:419::-;;24722:2;24711:9;24707:18;24699:26;;24771:9;24765:4;24761:20;24757:1;24746:9;24742:17;24735:47;24799:131;24925:4;24799:131;:::i;:::-;24791:139;;24689:248;;;:::o;24943:419::-;;25147:2;25136:9;25132:18;25124:26;;25196:9;25190:4;25186:20;25182:1;25171:9;25167:17;25160:47;25224:131;25350:4;25224:131;:::i;:::-;25216:139;;25114:248;;;:::o;25368:419::-;;25572:2;25561:9;25557:18;25549:26;;25621:9;25615:4;25611:20;25607:1;25596:9;25592:17;25585:47;25649:131;25775:4;25649:131;:::i;:::-;25641:139;;25539:248;;;:::o;25793:419::-;;25997:2;25986:9;25982:18;25974:26;;26046:9;26040:4;26036:20;26032:1;26021:9;26017:17;26010:47;26074:131;26200:4;26074:131;:::i;:::-;26066:139;;25964:248;;;:::o;26218:419::-;;26422:2;26411:9;26407:18;26399:26;;26471:9;26465:4;26461:20;26457:1;26446:9;26442:17;26435:47;26499:131;26625:4;26499:131;:::i;:::-;26491:139;;26389:248;;;:::o;26643:419::-;;26847:2;26836:9;26832:18;26824:26;;26896:9;26890:4;26886:20;26882:1;26871:9;26867:17;26860:47;26924:131;27050:4;26924:131;:::i;:::-;26916:139;;26814:248;;;:::o;27068:419::-;;27272:2;27261:9;27257:18;27249:26;;27321:9;27315:4;27311:20;27307:1;27296:9;27292:17;27285:47;27349:131;27475:4;27349:131;:::i;:::-;27341:139;;27239:248;;;:::o;27493:419::-;;27697:2;27686:9;27682:18;27674:26;;27746:9;27740:4;27736:20;27732:1;27721:9;27717:17;27710:47;27774:131;27900:4;27774:131;:::i;:::-;27766:139;;27664:248;;;:::o;27918:419::-;;28122:2;28111:9;28107:18;28099:26;;28171:9;28165:4;28161:20;28157:1;28146:9;28142:17;28135:47;28199:131;28325:4;28199:131;:::i;:::-;28191:139;;28089:248;;;:::o;28343:419::-;;28547:2;28536:9;28532:18;28524:26;;28596:9;28590:4;28586:20;28582:1;28571:9;28567:17;28560:47;28624:131;28750:4;28624:131;:::i;:::-;28616:139;;28514:248;;;:::o;28768:419::-;;28972:2;28961:9;28957:18;28949:26;;29021:9;29015:4;29011:20;29007:1;28996:9;28992:17;28985:47;29049:131;29175:4;29049:131;:::i;:::-;29041:139;;28939:248;;;:::o;29193:419::-;;29397:2;29386:9;29382:18;29374:26;;29446:9;29440:4;29436:20;29432:1;29421:9;29417:17;29410:47;29474:131;29600:4;29474:131;:::i;:::-;29466:139;;29364:248;;;:::o;29618:419::-;;29822:2;29811:9;29807:18;29799:26;;29871:9;29865:4;29861:20;29857:1;29846:9;29842:17;29835:47;29899:131;30025:4;29899:131;:::i;:::-;29891:139;;29789:248;;;:::o;30043:419::-;;30247:2;30236:9;30232:18;30224:26;;30296:9;30290:4;30286:20;30282:1;30271:9;30267:17;30260:47;30324:131;30450:4;30324:131;:::i;:::-;30316:139;;30214:248;;;:::o;30468:419::-;;30672:2;30661:9;30657:18;30649:26;;30721:9;30715:4;30711:20;30707:1;30696:9;30692:17;30685:47;30749:131;30875:4;30749:131;:::i;:::-;30741:139;;30639:248;;;:::o;30893:419::-;;31097:2;31086:9;31082:18;31074:26;;31146:9;31140:4;31136:20;31132:1;31121:9;31117:17;31110:47;31174:131;31300:4;31174:131;:::i;:::-;31166:139;;31064:248;;;:::o;31318:419::-;;31522:2;31511:9;31507:18;31499:26;;31571:9;31565:4;31561:20;31557:1;31546:9;31542:17;31535:47;31599:131;31725:4;31599:131;:::i;:::-;31591:139;;31489:248;;;:::o;31743:222::-;;31874:2;31863:9;31859:18;31851:26;;31887:71;31955:1;31944:9;31940:17;31931:6;31887:71;:::i;:::-;31841:124;;;;:::o;31971:283::-;;32037:2;32031:9;32021:19;;32079:4;32071:6;32067:17;32186:6;32174:10;32171:22;32150:18;32138:10;32135:34;32132:62;32129:2;;;32197:18;;:::i;:::-;32129:2;32237:10;32233:2;32226:22;32011:243;;;;:::o;32260:331::-;;32411:18;32403:6;32400:30;32397:2;;;32433:18;;:::i;:::-;32397:2;32518:4;32514:9;32507:4;32499:6;32495:17;32491:33;32483:41;;32579:4;32573;32569:15;32561:23;;32326:265;;;:::o;32597:332::-;;32749:18;32741:6;32738:30;32735:2;;;32771:18;;:::i;:::-;32735:2;32856:4;32852:9;32845:4;32837:6;32833:17;32829:33;32821:41;;32917:4;32911;32907:15;32899:23;;32664:265;;;:::o;32935:98::-;;33020:5;33014:12;33004:22;;32993:40;;;:::o;33039:99::-;;33125:5;33119:12;33109:22;;33098:40;;;:::o;33144:168::-;;33261:6;33256:3;33249:19;33301:4;33296:3;33292:14;33277:29;;33239:73;;;;:::o;33318:169::-;;33436:6;33431:3;33424:19;33476:4;33471:3;33467:14;33452:29;;33414:73;;;;:::o;33493:148::-;;33632:3;33617:18;;33607:34;;;;:::o;33647:305::-;;33706:20;33724:1;33706:20;:::i;:::-;33701:25;;33740:20;33758:1;33740:20;:::i;:::-;33735:25;;33894:1;33826:66;33822:74;33819:1;33816:81;33813:2;;;33900:18;;:::i;:::-;33813:2;33944:1;33941;33937:9;33930:16;;33691:261;;;;:::o;33958:185::-;;34015:20;34033:1;34015:20;:::i;:::-;34010:25;;34049:20;34067:1;34049:20;:::i;:::-;34044:25;;34088:1;34078:2;;34093:18;;:::i;:::-;34078:2;34135:1;34132;34128:9;34123:14;;34000:143;;;;:::o;34149:348::-;;34212:20;34230:1;34212:20;:::i;:::-;34207:25;;34246:20;34264:1;34246:20;:::i;:::-;34241:25;;34434:1;34366:66;34362:74;34359:1;34356:81;34351:1;34344:9;34337:17;34333:105;34330:2;;;34441:18;;:::i;:::-;34330:2;34489:1;34486;34482:9;34471:20;;34197:300;;;;:::o;34503:191::-;;34563:20;34581:1;34563:20;:::i;:::-;34558:25;;34597:20;34615:1;34597:20;:::i;:::-;34592:25;;34636:1;34633;34630:8;34627:2;;;34641:18;;:::i;:::-;34627:2;34686:1;34683;34679:9;34671:17;;34548:146;;;;:::o;34700:96::-;;34766:24;34784:5;34766:24;:::i;:::-;34755:35;;34745:51;;;:::o;34802:90::-;;34879:5;34872:13;34865:21;34854:32;;34844:48;;;:::o;34898:149::-;;34974:66;34967:5;34963:78;34952:89;;34942:105;;;:::o;35053:126::-;;35130:42;35123:5;35119:54;35108:65;;35098:81;;;:::o;35185:77::-;;35251:5;35240:16;;35230:32;;;:::o;35268:154::-;35352:6;35347:3;35342;35329:30;35414:1;35405:6;35400:3;35396:16;35389:27;35319:103;;;:::o;35428:307::-;35496:1;35506:113;35520:6;35517:1;35514:13;35506:113;;;35605:1;35600:3;35596:11;35590:18;35586:1;35581:3;35577:11;35570:39;35542:2;35539:1;35535:10;35530:15;;35506:113;;;35637:6;35634:1;35631:13;35628:2;;;35717:1;35708:6;35703:3;35699:16;35692:27;35628:2;35477:258;;;;:::o;35741:171::-;;35803:24;35821:5;35803:24;:::i;:::-;35794:33;;35849:4;35842:5;35839:15;35836:2;;;35857:18;;:::i;:::-;35836:2;35904:1;35897:5;35893:13;35886:20;;35784:128;;;:::o;35918:320::-;;35999:1;35993:4;35989:12;35979:22;;36046:1;36040:4;36036:12;36067:18;36057:2;;36123:4;36115:6;36111:17;36101:27;;36057:2;36185;36177:6;36174:14;36154:18;36151:38;36148:2;;;36204:18;;:::i;:::-;36148:2;35969:269;;;;:::o;36244:233::-;;36306:24;36324:5;36306:24;:::i;:::-;36297:33;;36352:66;36345:5;36342:77;36339:2;;;36422:18;;:::i;:::-;36339:2;36469:1;36462:5;36458:13;36451:20;;36287:190;;;:::o;36483:176::-;;36532:20;36550:1;36532:20;:::i;:::-;36527:25;;36566:20;36584:1;36566:20;:::i;:::-;36561:25;;36605:1;36595:2;;36610:18;;:::i;:::-;36595:2;36651:1;36648;36644:9;36639:14;;36517:142;;;;:::o;36665:180::-;36713:77;36710:1;36703:88;36810:4;36807:1;36800:15;36834:4;36831:1;36824:15;36851:180;36899:77;36896:1;36889:88;36996:4;36993:1;36986:15;37020:4;37017:1;37010:15;37037:180;37085:77;37082:1;37075:88;37182:4;37179:1;37172:15;37206:4;37203:1;37196:15;37223:180;37271:77;37268:1;37261:88;37368:4;37365:1;37358:15;37392:4;37389:1;37382:15;37409:102;;37501:2;37497:7;37492:2;37485:5;37481:14;37477:28;37467:38;;37457:54;;;:::o;37517:122::-;37590:24;37608:5;37590:24;:::i;:::-;37583:5;37580:35;37570:2;;37629:1;37626;37619:12;37570:2;37560:79;:::o;37645:116::-;37715:21;37730:5;37715:21;:::i;:::-;37708:5;37705:32;37695:2;;37751:1;37748;37741:12;37695:2;37685:76;:::o;37767:120::-;37839:23;37856:5;37839:23;:::i;:::-;37832:5;37829:34;37819:2;;37877:1;37874;37867:12;37819:2;37809:78;:::o;37893:122::-;37966:24;37984:5;37966:24;:::i;:::-;37959:5;37956:35;37946:2;;38005:1;38002;37995:12;37946:2;37936:79;:::o
Swarm Source
ipfs://c21005892f2931796b389ef1631e2f2ba622d5a8b784f9d7013a9361ece0624b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,136.5 | 0.17 | $533.2 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.