Overview
TokenID
125
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Contract
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.6.6; pragma experimental ABIEncoderV2; import "./ERC721.sol"; import "./Ownable.sol"; contract Contract is ERC721, Ownable { using SafeMath for uint256; string public PROVENANCE = ""; string public LICENSE_TEXT = ""; uint256 public constant price = 0.04 * 10**18; uint256 public constant presalePrice = 0.05 * 10**18; uint256 public constant MAX = 8888; uint256 public constant maxPurchase = 20; bool public saleIsActive = true; bool public presaleIsActive = true; bool licenseLocked = false; address payable user1 = 0x23992951637DE01651efeF536A0e13b4B04cc16B; address payable user2 = 0xffCF9020799B4f03A63E11260e8C2e75CEB5c505; uint256 user1Fraction = 765; uint256 user2Fraction = 35; mapping(uint256 => string) public names; uint256 public reserve = 222; event nameChange(address _by, uint256 _tokenId, string _name); event licenseIsLocked(string _licenseText); constructor() public ERC721("Club Name", "SHORTCODE") {} function withdraw() public onlyOwner { uint256 u1total = (address(this).balance * user1Fraction) / 1000; uint256 u2total = (address(this).balance * user2Fraction) / 1000; user1.transfer(u1total); user2.transfer(u2total); msg.sender.transfer(address(this).balance); } function reserveTokens(address _to, uint256 _reserveAmount) public onlyOwner { uint256 supply = totalSupply(); require( _reserveAmount > 0 && _reserveAmount <= reserve, "Not enough reserve left for the team" ); for (uint256 i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } reserve = reserve.sub(_reserveAmount); } function setProvenanceHash(string memory _provenanceHash) public onlyOwner { PROVENANCE = _provenanceHash; } function setBaseURI(string memory _baseURI) public onlyOwner { _setBaseURI(_baseURI); } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function flipPresaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function tokenLicense(uint256 _id) public view returns (string memory) { require(_id < totalSupply(), "Choose a NFT within range!"); return LICENSE_TEXT; } function lockLicense() public onlyOwner { licenseLocked = true; emit licenseIsLocked(LICENSE_TEXT); } function changeLicense(string memory _license) public onlyOwner { require(licenseLocked == false, "License already locked!"); LICENSE_TEXT = _license; } function mint(uint256 _numberOfTokens) public payable { require(saleIsActive, "Sale must be active to mint NFT..."); require( _numberOfTokens > 0 && _numberOfTokens <= maxPurchase, "Can only mint 20 tokens at a time!" ); require( totalSupply().add(_numberOfTokens) <= MAX, "Not enough tokens available for minting..." ); require( msg.value >= price.mul(_numberOfTokens), "Ether value sent is not enough..." ); if (presaleIsActive) { require( msg.value >= presalePrice.mul(_numberOfTokens), "Ether value sent is not enough..." ); } else { require( msg.value >= price.mul(_numberOfTokens), "Ether value sent is not enough..." ); } for (uint256 i = 0; i < _numberOfTokens; i++) { uint256 mintIndex = totalSupply(); if (totalSupply() < MAX) { _safeMint(msg.sender, mintIndex); } } } function changeName(uint256 _tokenId, string memory _name) public { require( ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this NFT!" ); require(sha256(bytes(_name)) != sha256(bytes(names[_tokenId]))); names[_tokenId] = _name; emit nameChange(msg.sender, _tokenId, _name); } function viewName(uint256 _tokenId) public view returns (string memory) { require(_tokenId < totalSupply(), "Choose a NFT within range."); return names[_tokenId]; } function namesOfOwners(address _owner) external view returns (string[] memory) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new string[](0); } else { string[] memory result = new string[](tokenCount); for (uint256 index = 0; index < tokenCount; index++) { result[index] = names[tokenOfOwnerByIndex(_owner, index)]; } return result; } } }
// File: @openzeppelin/contracts/utils/Context.sol pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/EnumerableSet.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require( set._values.length > index, "EnumerableSet: index out of bounds" ); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File: @openzeppelin/contracts/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping(bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set( Map storage map, bytes32 key, bytes32 value ) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({_key: key, _value: value})); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require( map._entries.length > index, "EnumerableMap: index out of bounds" ); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get( Map storage map, bytes32 key, string memory errorMessage ) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set( UintToAddressMap storage map, uint256 key, address value ) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get( UintToAddressMap storage map, uint256 key, string memory errorMessage ) internal view returns (address) { return address( uint160(uint256(_get(map._inner, bytes32(key), errorMessage))) ); } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + (temp % 10))); temp /= 10; } return string(buffer); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping(address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get( tokenId, "ERC721: owner query for nonexistent token" ); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 || ERC721.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 _tokenOwners.contains(tokenId); } /** * @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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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" ); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall( abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer" ); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @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 {} }
// File: @openzeppelin/contracts/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @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() internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseIsLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"nameChange","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"names","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"namesOfOwners","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveTokens","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600b90805190602001906200002b92919062000404565b5060405180602001604052806000815250600c90805190602001906200005392919062000404565b506001600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055506000600d60026101000a81548160ff0219169083151502179055507323992951637de01651efef536a0e13b4b04cc16b600d60036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ffcf9020799b4f03a63e11260e8c2e75ceb5c505600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506102fd600f55602360105560de6012553480156200016c57600080fd5b506040518060400160405280600981526020017f436c7562204e616d6500000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f53484f5254434f44450000000000000000000000000000000000000000000000815250620001f16301ffc9a760e01b6200032460201b60201c565b81600690805190602001906200020992919062000404565b5080600790805190602001906200022292919062000404565b506200023b6380ac58cd60e01b6200032460201b60201c565b62000253635b5e139f60e01b6200032460201b60201c565b6200026b63780e9d6360e01b6200032460201b60201c565b505060006200027f620003fc60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200051f565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038790620004ec565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200044757805160ff191683800117855562000478565b8280016001018555821562000478579182015b82811115620004775782518255916020019190600101906200045a565b5b5090506200048791906200048b565b5090565b5b80821115620004a65760008160009055506001016200048c565b5090565b6000620004b9601c836200050e565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600060208201905081810360008301526200050781620004aa565b9050919050565b600082825260208201905092915050565b61562c806200052f6000396000f3fe6080604052600436106102665760003560e01c806378cf19e911610144578063bf4702fc116100b6578063d49d51811161007a578063d49d518114610920578063d9b137b21461094b578063e985e9c514610988578063eb8d2444146109c5578063f2fde38b146109f0578063f81227d414610a1957610266565b8063bf4702fc1461083b578063c39cbef114610852578063c87b56dd1461087b578063cd3293de146108b8578063d33cceb1146108e357610266565b80639c3e72bd116101085780639c3e72bd1461074e578063a035b1fe14610779578063a0712d68146107a4578063a22cb465146107c0578063b09904b5146107e9578063b88d4fde1461081257610266565b806378cf19e9146106675780638462151c146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b1461072357610266565b806334918dfd116101dd57806355f804b3116101a157806355f804b3146105575780636352211e146105805780636373a6b1146105bd5780636c0360eb146105e857806370a0823114610613578063715018a61461065057610266565b806334918dfd146104865780633ccfd60b1461049d57806342842e0e146104b45780634622ab03146104dd5780634f6ccce71461051a57610266565b8063109695231161022f578063109695231461036457806318160ddd1461038d5780631b868d00146103b857806323b872dd146103f55780632f745c591461041e57806330f72cd41461045b57610266565b80620e7fa81461026b57806301ffc9a71461029657806306fdde03146102d3578063081812fc146102fe578063095ea7b31461033b575b600080fd5b34801561027757600080fd5b50610280610a30565b60405161028d9190615274565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613d89565b610a3b565b6040516102ca9190614e35565b60405180910390f35b3480156102df57600080fd5b506102e8610aa2565b6040516102f59190614e50565b60405180910390f35b34801561030a57600080fd5b5061032560048036038101906103209190613e1c565b610b44565b6040516103329190614d4c565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613d24565b610bc9565b005b34801561037057600080fd5b5061038b60048036038101906103869190613ddb565b610ce1565b005b34801561039957600080fd5b506103a2610d77565b6040516103af9190615274565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613e1c565b610d88565b6040516103ec9190614e50565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613c1e565b610e86565b005b34801561042a57600080fd5b5061044560048036038101906104409190613d24565b610ee6565b6040516104529190615274565b60405180910390f35b34801561046757600080fd5b50610470610f41565b60405161047d9190614e35565b60405180910390f35b34801561049257600080fd5b5061049b610f54565b005b3480156104a957600080fd5b506104b2610ffc565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613c1e565b6111bd565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e1c565b6111dd565b6040516105119190614e50565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613e1c565b61128d565b60405161054e9190615274565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613ddb565b6112b0565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613e1c565b611338565b6040516105b49190614d4c565b60405180910390f35b3480156105c957600080fd5b506105d261136f565b6040516105df9190614e50565b60405180910390f35b3480156105f457600080fd5b506105fd61140d565b60405161060a9190614e50565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613bb9565b6114af565b6040516106479190615274565b60405180910390f35b34801561065c57600080fd5b5061066561156e565b005b34801561067357600080fd5b5061068e60048036038101906106899190613d24565b6116ab565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613bb9565b6117c9565b6040516106c49190614e13565b60405180910390f35b3480156106d957600080fd5b506106e26118c2565b6040516106ef9190614d4c565b60405180910390f35b34801561070457600080fd5b5061070d6118ec565b60405161071a9190614e50565b60405180910390f35b34801561072f57600080fd5b5061073861198e565b6040516107459190615274565b60405180910390f35b34801561075a57600080fd5b50610763611993565b6040516107709190614e50565b60405180910390f35b34801561078557600080fd5b5061078e611a31565b60405161079b9190615274565b60405180910390f35b6107be60048036038101906107b99190613e1c565b611a3c565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613ce8565b611cad565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ddb565b611e2e565b005b34801561081e57600080fd5b5061083960048036038101906108349190613c6d565b611f1a565b005b34801561084757600080fd5b50610850611f7c565b005b34801561085e57600080fd5b5061087960048036038101906108749190613e45565b61204d565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613e1c565b6121e7565b6040516108af9190614e50565b60405180910390f35b3480156108c457600080fd5b506108cd61236a565b6040516108da9190615274565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613bb9565b612370565b6040516109179190614df1565b60405180910390f35b34801561092c57600080fd5b5061093561251d565b6040516109429190615274565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613e1c565b612523565b60405161097f9190614e50565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613be2565b612610565b6040516109bc9190614e35565b60405180910390f35b3480156109d157600080fd5b506109da6126a4565b6040516109e79190614e35565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190613bb9565b6126b7565b005b348015610a2557600080fd5b50610a2e612863565b005b66b1a2bc2ec5000081565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b4f8261290b565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590615114565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd482611338565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c906151b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c64612928565b73ffffffffffffffffffffffffffffffffffffffff161480610c935750610c9281610c8d612928565b612610565b5b610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990615034565b60405180910390fd5b610cdc8383612930565b505050565b610ce9612928565b73ffffffffffffffffffffffffffffffffffffffff16610d076118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490615134565b60405180910390fd5b80600b9080519060200190610d739291906139f6565b5050565b6000610d8360026129e9565b905090565b6060610d92610d77565b8210610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90615174565b60405180910390fd5b601160008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b50505050509050919050565b610e97610e91612928565b826129fe565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906151d4565b60405180910390fd5b610ee1838383612adc565b505050565b6000610f3982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf390919063ffffffff16565b905092915050565b600d60019054906101000a900460ff1681565b610f5c612928565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b611004612928565b73ffffffffffffffffffffffffffffffffffffffff166110226118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90615134565b60405180910390fd5b60006103e8600f5447028161108957fe5b04905060006103e860105447028161109d57fe5b049050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611108573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611171573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111b8573d6000803e3d6000fd5b505050565b6111d883838360405180602001604052806000815250611f1a565b505050565b60116020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b505050505081565b6000806112a4836002612d0d90919063ffffffff16565b50905080915050919050565b6112b8612928565b73ffffffffffffffffffffffffffffffffffffffff166112d66118c2565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390615134565b60405180910390fd5b61133581612d39565b50565b6000611368826040518060600160405280602981526020016155ce602991396002612d539092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790615054565b60405180910390fd5b611567600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d72565b9050919050565b611576612928565b73ffffffffffffffffffffffffffffffffffffffff166115946118c2565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116b3612928565b73ffffffffffffffffffffffffffffffffffffffff166116d16118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615134565b60405180910390fd5b6000611731610d77565b905060008211801561174557506012548211155b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90614eb4565b60405180910390fd5b60005b828110156117a85761179b84828401612d87565b8080600101915050611787565b506117be82601254612da590919063ffffffff16565b601281905550505050565b606060006117d6836114af565b9050600081141561183157600067ffffffffffffffff811180156117f957600080fd5b506040519080825280602002602001820160405280156118285781602001602082028036833780820191505090505b509150506118bd565b60608167ffffffffffffffff8111801561184a57600080fd5b506040519080825280602002602001820160405280156118795781602001602082028036833780820191505090505b50905060005b828110156118b6576118918582610ee6565b82828151811061189d57fe5b602002602001018181525050808060010191505061187f565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b601481565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b668e1bc9bf04000081565b600d60009054906101000a900460ff16611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290615234565b60405180910390fd5b600081118015611a9c575060148111155b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614fd4565b60405180910390fd5b6122b8611af882611aea610d77565b612df590919063ffffffff16565b1115611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090615074565b60405180910390fd5b611b5381668e1bc9bf040000612e4a90919063ffffffff16565b341015611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90615214565b60405180910390fd5b600d60019054906101000a900460ff1615611c0b57611bc48166b1a2bc2ec50000612e4a90919063ffffffff16565b341015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90615214565b60405180910390fd5b611c68565b611c2581668e1bc9bf040000612e4a90919063ffffffff16565b341015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90615214565b60405180910390fd5b5b60005b81811015611ca9576000611c7d610d77565b90506122b8611c8a610d77565b1015611c9b57611c9a3382612d87565b5b508080600101915050611c6b565b5050565b611cb5612928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614f94565b60405180910390fd5b8060056000611d30612928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd612928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e229190614e35565b60405180910390a35050565b611e36612928565b73ffffffffffffffffffffffffffffffffffffffff16611e546118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190615134565b60405180910390fd5b60001515600d60029054906101000a900460ff16151514611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790615254565b60405180910390fd5b80600c9080519060200190611f169291906139f6565b5050565b611f2b611f25612928565b836129fe565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61906151d4565b60405180910390fd5b611f7684848484612eba565b50505050565b611f84612928565b73ffffffffffffffffffffffffffffffffffffffff16611fa26118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90615134565b60405180910390fd5b6001600d60026101000a81548160ff0219169083151502179055507ff27a6fa5c2c9783f2c131f659c2119106077b81db9f21c76357aa819ad314f7e600c6040516120439190614e72565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff1661206d83611338565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614f54565b60405180910390fd5b6002601160008481526020019081526020016000206040516120e59190614d11565b602060405180830381855afa158015612102573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121259190613d60565b6002826040516121359190614cfa565b602060405180830381855afa158015612152573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121759190613d60565b141561218057600080fd5b806011600084815260200190815260200160002090805190602001906121a79291906139f6565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a3383836040516121db93929190614db3565b60405180910390a15050565b60606121f28261290b565b612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222890615194565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905060606122eb61140d565b9050600081511415612301578192505050612365565b60008251111561233657808260405160200161231e929190614d28565b60405160208183030381529060405292505050612365565b8061234085612f16565b604051602001612351929190614d28565b604051602081830303815290604052925050505b919050565b60125481565b6060600061237d836114af565b905060008114156123dd57600067ffffffffffffffff811180156123a057600080fd5b506040519080825280602002602001820160405280156123d457816020015b60608152602001906001900390816123bf5790505b50915050612518565b60608167ffffffffffffffff811180156123f657600080fd5b5060405190808252806020026020018201604052801561242a57816020015b60608152602001906001900390816124155790505b50905060005b8281101561251157601160006124468784610ee6565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124e85780601f106124bd576101008083540402835291602001916124e8565b820191906000526020600020905b8154815290600101906020018083116124cb57829003601f168201915b50505050508282815181106124f957fe5b60200260200101819052508080600101915050612430565b5080925050505b919050565b6122b881565b606061252d610d77565b821061256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906150b4565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126045780601f106125d957610100808354040283529160200191612604565b820191906000526020600020905b8154815290600101906020018083116125e757829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6126bf612928565b73ffffffffffffffffffffffffffffffffffffffff166126dd6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61286b612928565b73ffffffffffffffffffffffffffffffffffffffff166128896118c2565b73ffffffffffffffffffffffffffffffffffffffff16146128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600061292182600261305d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a383611338565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f782600001613077565b9050919050565b6000612a098261290b565b612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f90615014565b60405180910390fd5b6000612a5383611338565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac257508373ffffffffffffffffffffffffffffffffffffffff16612aaa84610b44565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad35750612ad28185612610565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611338565b73ffffffffffffffffffffffffffffffffffffffff1614612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615154565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614f74565b60405180910390fd5b612bcd838383613088565b612bd8600082612930565b612c2981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061308d90919063ffffffff16565b50612c7b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b50612c92818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d0283600001836130f6565b60001c905092915050565b600080600080612d208660000186613163565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612d4f9291906139f6565b5050565b6000612d66846000018460001b846131e6565b60001c90509392505050565b6000612d8082600001613277565b9050919050565b612da1828260405180602001604052806000815250613288565b5050565b600082821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190614fb4565b60405180910390fd5b818303905092915050565b600080828401905083811015612e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3790614f34565b60405180910390fd5b8091505092915050565b600080831415612e5d5760009050612eb4565b6000828402905082848281612e6e57fe5b0414612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906150f4565b60405180910390fd5b809150505b92915050565b612ec5848484612adc565b612ed1848484846132e3565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614ed4565b60405180910390fd5b50505050565b60606000821415612f5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f88578080600101915050600a8281612f8057fe5b049150612f66565b60608167ffffffffffffffff81118015612fa157600080fd5b506040519080825280601f01601f191660200182016040528015612fd45781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461305057600a8481612ff557fe5b0660300160f81b8282806001900393508151811061300f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161304857fe5b049350612fe3565b819450505050505b919050565b600061306f836000018360001b613447565b905092915050565b600081600001805490509050919050565b505050565b600061309f836000018360001b61346a565b905092915050565b60006130b9836000018360001b613552565b905092915050565b60006130ed846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6135c2565b90509392505050565b600081836000018054905011613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614e94565b60405180910390fd5b82600001828154811061315057fe5b9060005260206000200154905092915050565b600080828460000180549050116131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a690615094565b60405180910390fd5b60008460000184815481106131c057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f9190614e50565b60405180910390fd5b5084600001600182038154811061325b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613292838361369e565b61329f60008484846132e3565b6132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d590614ed4565b60405180910390fd5b505050565b60006133048473ffffffffffffffffffffffffffffffffffffffff1661382c565b613311576001905061343f565b60606133d863150b7a0260e01b613326612928565b88878760405160240161333c9493929190614d67565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161559c603291398773ffffffffffffffffffffffffffffffffffffffff1661383f9092919063ffffffff16565b90506000818060200190518101906133f09190613db2565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461354657600060018203905060006001866000018054905003905060008660000182815481106134b557fe5b90600052602060002001549050808760000184815481106134d257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061350a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061354c565b60009150505b92915050565b600061355e8383613857565b6135b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506135bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561366957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613697565b8285600001600183038154811061367c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906150d4565b60405180910390fd5b6137178161290b565b15613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e90614f14565b60405180910390fd5b61376360008383613088565b6137b481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b506137cb818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061384e848460008561387a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614ff4565b60405180910390fd5b6138c88561382c565b613907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fe906151f4565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516139319190614cfa565b60006040518083038185875af1925050503d806000811461396e576040519150601f19603f3d011682016040523d82523d6000602084013e613973565b606091505b509150915061398382828661398f565b92505050949350505050565b6060831561399f578290506139ef565b6000835111156139b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e69190614e50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a3757805160ff1916838001178555613a65565b82800160010185558215613a65579182015b82811115613a64578251825591602001919060010190613a49565b5b509050613a729190613a76565b5090565b5b80821115613a8f576000816000905550600101613a77565b5090565b600081359050613aa281615528565b92915050565b600081359050613ab78161553f565b92915050565b600081519050613acc81615556565b92915050565b600081359050613ae18161556d565b92915050565b600081519050613af68161556d565b92915050565b600082601f830112613b0d57600080fd5b8135613b20613b1b826152bc565b61528f565b91508082526020830160208301858383011115613b3c57600080fd5b613b478382846154d5565b50505092915050565b600082601f830112613b6157600080fd5b8135613b74613b6f826152e8565b61528f565b91508082526020830160208301858383011115613b9057600080fd5b613b9b8382846154d5565b50505092915050565b600081359050613bb381615584565b92915050565b600060208284031215613bcb57600080fd5b6000613bd984828501613a93565b91505092915050565b60008060408385031215613bf557600080fd5b6000613c0385828601613a93565b9250506020613c1485828601613a93565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c4186828701613a93565b9350506020613c5286828701613a93565b9250506040613c6386828701613ba4565b9150509250925092565b60008060008060808587031215613c8357600080fd5b6000613c9187828801613a93565b9450506020613ca287828801613a93565b9350506040613cb387828801613ba4565b925050606085013567ffffffffffffffff811115613cd057600080fd5b613cdc87828801613afc565b91505092959194509250565b60008060408385031215613cfb57600080fd5b6000613d0985828601613a93565b9250506020613d1a85828601613aa8565b9150509250929050565b60008060408385031215613d3757600080fd5b6000613d4585828601613a93565b9250506020613d5685828601613ba4565b9150509250929050565b600060208284031215613d7257600080fd5b6000613d8084828501613abd565b91505092915050565b600060208284031215613d9b57600080fd5b6000613da984828501613ad2565b91505092915050565b600060208284031215613dc457600080fd5b6000613dd284828501613ae7565b91505092915050565b600060208284031215613ded57600080fd5b600082013567ffffffffffffffff811115613e0757600080fd5b613e1384828501613b50565b91505092915050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613ba4565b91505092915050565b60008060408385031215613e5857600080fd5b6000613e6685828601613ba4565b925050602083013567ffffffffffffffff811115613e8357600080fd5b613e8f85828601613b50565b9150509250929050565b6000613ea583836140cc565b905092915050565b6000613eb98383614cdc565b60208301905092915050565b613ece8161549f565b82525050565b613edd81615421565b82525050565b613eec8161540f565b82525050565b6000613efd8261535e565b613f0781856153a4565b935083602082028501613f1985615314565b8060005b85811015613f555784840389528151613f368582613e99565b9450613f418361538a565b925060208a01995050600181019050613f1d565b50829750879550505050505092915050565b6000613f7282615369565b613f7c81856153b5565b9350613f8783615324565b8060005b83811015613fb8578151613f9f8882613ead565b9750613faa83615397565b925050600181019050613f8b565b5085935050505092915050565b613fce81615433565b82525050565b6000613fdf82615374565b613fe981856153c6565b9350613ff98185602086016154e4565b61400281615517565b840191505092915050565b600061401882615374565b61402281856153d7565b93506140328185602086016154e4565b80840191505092915050565b60008154600181166000811461405b5760018114614080576140c4565b607f600283041661406c81876153d7565b955060ff19831686528086019350506140c4565b6002820461408e81876153d7565b955061409985615334565b60005b828110156140bb5781548189015260018201915060208101905061409c565b82880195505050505b505092915050565b60006140d78261537f565b6140e181856153e2565b93506140f18185602086016154e4565b6140fa81615517565b840191505092915050565b60006141108261537f565b61411a81856153f3565b935061412a8185602086016154e4565b61413381615517565b840191505092915050565b60006141498261537f565b6141538185615404565b93506141638185602086016154e4565b80840191505092915050565b60008154600181166000811461418c57600181146141b2576141f6565b607f600283041661419d81876153f3565b955060ff1983168652602086019350506141f6565b600282046141c081876153f3565b95506141cb85615349565b60005b828110156141ed578154818901526001820191506020810190506141ce565b80880195505050505b505092915050565b600061420b6022836153f3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142716024836153f3565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008301527f7465616d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142d76032836153f3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061433d6026836153f3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3601c836153f3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143e3601b836153f3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006144236026836153f3565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204e46542100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144896024836153f3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ef6019836153f3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452f601e836153f3565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456f6022836153f3565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d56026836153f3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061463b602c836153f3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146a16038836153f3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614707602a836153f3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061476d602a836153f3565b91507f4e6f7420656e6f75676820746f6b656e7320617661696c61626c6520666f722060008301527f6d696e74696e672e2e2e000000000000000000000000000000000000000000006020830152604082019050919050565b60006147d36022836153f3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614839601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e6765210000000000006000830152602082019050919050565b60006148796020836153f3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148b96021836153f3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061491f602c836153f3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149856020836153f3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149c56029836153f3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a2b601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e67652e0000000000006000830152602082019050919050565b6000614a6b602f836153f3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614ad16021836153f3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b376031836153f3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b9d601d836153f3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bdd6021836153f3565b91507f45746865722076616c75652073656e74206973206e6f7420656e6f7567682e2e60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436022836153f3565b91507f53616c65206d7573742062652061637469766520746f206d696e74204e46542e60008301527f2e2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca96017836153f3565b91507f4c6963656e736520616c7265616479206c6f636b6564210000000000000000006000830152602082019050919050565b614ce581615495565b82525050565b614cf481615495565b82525050565b6000614d06828461400d565b915081905092915050565b6000614d1d828461403e565b915081905092915050565b6000614d34828561413e565b9150614d40828461413e565b91508190509392505050565b6000602082019050614d616000830184613ee3565b92915050565b6000608082019050614d7c6000830187613ed4565b614d896020830186613ee3565b614d966040830185614ceb565b8181036060830152614da88184613fd4565b905095945050505050565b6000606082019050614dc86000830186613ec5565b614dd56020830185614ceb565b8181036040830152614de78184614105565b9050949350505050565b60006020820190508181036000830152614e0b8184613ef2565b905092915050565b60006020820190508181036000830152614e2d8184613f67565b905092915050565b6000602082019050614e4a6000830184613fc5565b92915050565b60006020820190508181036000830152614e6a8184614105565b905092915050565b60006020820190508181036000830152614e8c818461416f565b905092915050565b60006020820190508181036000830152614ead816141fe565b9050919050565b60006020820190508181036000830152614ecd81614264565b9050919050565b60006020820190508181036000830152614eed816142ca565b9050919050565b60006020820190508181036000830152614f0d81614330565b9050919050565b60006020820190508181036000830152614f2d81614396565b9050919050565b60006020820190508181036000830152614f4d816143d6565b9050919050565b60006020820190508181036000830152614f6d81614416565b9050919050565b60006020820190508181036000830152614f8d8161447c565b9050919050565b60006020820190508181036000830152614fad816144e2565b9050919050565b60006020820190508181036000830152614fcd81614522565b9050919050565b60006020820190508181036000830152614fed81614562565b9050919050565b6000602082019050818103600083015261500d816145c8565b9050919050565b6000602082019050818103600083015261502d8161462e565b9050919050565b6000602082019050818103600083015261504d81614694565b9050919050565b6000602082019050818103600083015261506d816146fa565b9050919050565b6000602082019050818103600083015261508d81614760565b9050919050565b600060208201905081810360008301526150ad816147c6565b9050919050565b600060208201905081810360008301526150cd8161482c565b9050919050565b600060208201905081810360008301526150ed8161486c565b9050919050565b6000602082019050818103600083015261510d816148ac565b9050919050565b6000602082019050818103600083015261512d81614912565b9050919050565b6000602082019050818103600083015261514d81614978565b9050919050565b6000602082019050818103600083015261516d816149b8565b9050919050565b6000602082019050818103600083015261518d81614a1e565b9050919050565b600060208201905081810360008301526151ad81614a5e565b9050919050565b600060208201905081810360008301526151cd81614ac4565b9050919050565b600060208201905081810360008301526151ed81614b2a565b9050919050565b6000602082019050818103600083015261520d81614b90565b9050919050565b6000602082019050818103600083015261522d81614bd0565b9050919050565b6000602082019050818103600083015261524d81614c36565b9050919050565b6000602082019050818103600083015261526d81614c9c565b9050919050565b60006020820190506152896000830184614ceb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152b257600080fd5b8060405250919050565b600067ffffffffffffffff8211156152d357600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152ff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061541a82615475565b9050919050565b600061542c82615475565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154aa826154b1565b9050919050565b60006154bc826154c3565b9050919050565b60006154ce82615475565b9050919050565b82818337600083830152505050565b60005b838110156155025780820151818401526020810190506154e7565b83811115615511576000848401525b50505050565b6000601f19601f8301169050919050565b6155318161540f565b811461553c57600080fd5b50565b61554881615433565b811461555357600080fd5b50565b61555f8161543f565b811461556a57600080fd5b50565b61557681615449565b811461558157600080fd5b50565b61558d81615495565b811461559857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212204efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106102665760003560e01c806378cf19e911610144578063bf4702fc116100b6578063d49d51811161007a578063d49d518114610920578063d9b137b21461094b578063e985e9c514610988578063eb8d2444146109c5578063f2fde38b146109f0578063f81227d414610a1957610266565b8063bf4702fc1461083b578063c39cbef114610852578063c87b56dd1461087b578063cd3293de146108b8578063d33cceb1146108e357610266565b80639c3e72bd116101085780639c3e72bd1461074e578063a035b1fe14610779578063a0712d68146107a4578063a22cb465146107c0578063b09904b5146107e9578063b88d4fde1461081257610266565b806378cf19e9146106675780638462151c146106905780638da5cb5b146106cd57806395d89b41146106f8578063977b055b1461072357610266565b806334918dfd116101dd57806355f804b3116101a157806355f804b3146105575780636352211e146105805780636373a6b1146105bd5780636c0360eb146105e857806370a0823114610613578063715018a61461065057610266565b806334918dfd146104865780633ccfd60b1461049d57806342842e0e146104b45780634622ab03146104dd5780634f6ccce71461051a57610266565b8063109695231161022f578063109695231461036457806318160ddd1461038d5780631b868d00146103b857806323b872dd146103f55780632f745c591461041e57806330f72cd41461045b57610266565b80620e7fa81461026b57806301ffc9a71461029657806306fdde03146102d3578063081812fc146102fe578063095ea7b31461033b575b600080fd5b34801561027757600080fd5b50610280610a30565b60405161028d9190615274565b60405180910390f35b3480156102a257600080fd5b506102bd60048036038101906102b89190613d89565b610a3b565b6040516102ca9190614e35565b60405180910390f35b3480156102df57600080fd5b506102e8610aa2565b6040516102f59190614e50565b60405180910390f35b34801561030a57600080fd5b5061032560048036038101906103209190613e1c565b610b44565b6040516103329190614d4c565b60405180910390f35b34801561034757600080fd5b50610362600480360381019061035d9190613d24565b610bc9565b005b34801561037057600080fd5b5061038b60048036038101906103869190613ddb565b610ce1565b005b34801561039957600080fd5b506103a2610d77565b6040516103af9190615274565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613e1c565b610d88565b6040516103ec9190614e50565b60405180910390f35b34801561040157600080fd5b5061041c60048036038101906104179190613c1e565b610e86565b005b34801561042a57600080fd5b5061044560048036038101906104409190613d24565b610ee6565b6040516104529190615274565b60405180910390f35b34801561046757600080fd5b50610470610f41565b60405161047d9190614e35565b60405180910390f35b34801561049257600080fd5b5061049b610f54565b005b3480156104a957600080fd5b506104b2610ffc565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613c1e565b6111bd565b005b3480156104e957600080fd5b5061050460048036038101906104ff9190613e1c565b6111dd565b6040516105119190614e50565b60405180910390f35b34801561052657600080fd5b50610541600480360381019061053c9190613e1c565b61128d565b60405161054e9190615274565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190613ddb565b6112b0565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613e1c565b611338565b6040516105b49190614d4c565b60405180910390f35b3480156105c957600080fd5b506105d261136f565b6040516105df9190614e50565b60405180910390f35b3480156105f457600080fd5b506105fd61140d565b60405161060a9190614e50565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613bb9565b6114af565b6040516106479190615274565b60405180910390f35b34801561065c57600080fd5b5061066561156e565b005b34801561067357600080fd5b5061068e60048036038101906106899190613d24565b6116ab565b005b34801561069c57600080fd5b506106b760048036038101906106b29190613bb9565b6117c9565b6040516106c49190614e13565b60405180910390f35b3480156106d957600080fd5b506106e26118c2565b6040516106ef9190614d4c565b60405180910390f35b34801561070457600080fd5b5061070d6118ec565b60405161071a9190614e50565b60405180910390f35b34801561072f57600080fd5b5061073861198e565b6040516107459190615274565b60405180910390f35b34801561075a57600080fd5b50610763611993565b6040516107709190614e50565b60405180910390f35b34801561078557600080fd5b5061078e611a31565b60405161079b9190615274565b60405180910390f35b6107be60048036038101906107b99190613e1c565b611a3c565b005b3480156107cc57600080fd5b506107e760048036038101906107e29190613ce8565b611cad565b005b3480156107f557600080fd5b50610810600480360381019061080b9190613ddb565b611e2e565b005b34801561081e57600080fd5b5061083960048036038101906108349190613c6d565b611f1a565b005b34801561084757600080fd5b50610850611f7c565b005b34801561085e57600080fd5b5061087960048036038101906108749190613e45565b61204d565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613e1c565b6121e7565b6040516108af9190614e50565b60405180910390f35b3480156108c457600080fd5b506108cd61236a565b6040516108da9190615274565b60405180910390f35b3480156108ef57600080fd5b5061090a60048036038101906109059190613bb9565b612370565b6040516109179190614df1565b60405180910390f35b34801561092c57600080fd5b5061093561251d565b6040516109429190615274565b60405180910390f35b34801561095757600080fd5b50610972600480360381019061096d9190613e1c565b612523565b60405161097f9190614e50565b60405180910390f35b34801561099457600080fd5b506109af60048036038101906109aa9190613be2565b612610565b6040516109bc9190614e35565b60405180910390f35b3480156109d157600080fd5b506109da6126a4565b6040516109e79190614e35565b60405180910390f35b3480156109fc57600080fd5b50610a176004803603810190610a129190613bb9565b6126b7565b005b348015610a2557600080fd5b50610a2e612863565b005b66b1a2bc2ec5000081565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b3a5780601f10610b0f57610100808354040283529160200191610b3a565b820191906000526020600020905b815481529060010190602001808311610b1d57829003601f168201915b5050505050905090565b6000610b4f8261290b565b610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8590615114565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bd482611338565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3c906151b4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c64612928565b73ffffffffffffffffffffffffffffffffffffffff161480610c935750610c9281610c8d612928565b612610565b5b610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990615034565b60405180910390fd5b610cdc8383612930565b505050565b610ce9612928565b73ffffffffffffffffffffffffffffffffffffffff16610d076118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5490615134565b60405180910390fd5b80600b9080519060200190610d739291906139f6565b5050565b6000610d8360026129e9565b905090565b6060610d92610d77565b8210610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca90615174565b60405180910390fd5b601160008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610e7a5780601f10610e4f57610100808354040283529160200191610e7a565b820191906000526020600020905b815481529060010190602001808311610e5d57829003601f168201915b50505050509050919050565b610e97610e91612928565b826129fe565b610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd906151d4565b60405180910390fd5b610ee1838383612adc565b505050565b6000610f3982600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612cf390919063ffffffff16565b905092915050565b600d60019054906101000a900460ff1681565b610f5c612928565b73ffffffffffffffffffffffffffffffffffffffff16610f7a6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b611004612928565b73ffffffffffffffffffffffffffffffffffffffff166110226118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f90615134565b60405180910390fd5b60006103e8600f5447028161108957fe5b04905060006103e860105447028161109d57fe5b049050600d60039054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015611108573d6000803e3d6000fd5b50600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611171573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156111b8573d6000803e3d6000fd5b505050565b6111d883838360405180602001604052806000815250611f1a565b505050565b60116020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112855780601f1061125a57610100808354040283529160200191611285565b820191906000526020600020905b81548152906001019060200180831161126857829003601f168201915b505050505081565b6000806112a4836002612d0d90919063ffffffff16565b50905080915050919050565b6112b8612928565b73ffffffffffffffffffffffffffffffffffffffff166112d66118c2565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390615134565b60405180910390fd5b61133581612d39565b50565b6000611368826040518060600160405280602981526020016155ce602991396002612d539092919063ffffffff16565b9050919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b505050505081565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114a55780601f1061147a576101008083540402835291602001916114a5565b820191906000526020600020905b81548152906001019060200180831161148857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611520576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151790615054565b60405180910390fd5b611567600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612d72565b9050919050565b611576612928565b73ffffffffffffffffffffffffffffffffffffffff166115946118c2565b73ffffffffffffffffffffffffffffffffffffffff16146115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e190615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6116b3612928565b73ffffffffffffffffffffffffffffffffffffffff166116d16118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611727576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171e90615134565b60405180910390fd5b6000611731610d77565b905060008211801561174557506012548211155b611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90614eb4565b60405180910390fd5b60005b828110156117a85761179b84828401612d87565b8080600101915050611787565b506117be82601254612da590919063ffffffff16565b601281905550505050565b606060006117d6836114af565b9050600081141561183157600067ffffffffffffffff811180156117f957600080fd5b506040519080825280602002602001820160405280156118285781602001602082028036833780820191505090505b509150506118bd565b60608167ffffffffffffffff8111801561184a57600080fd5b506040519080825280602002602001820160405280156118795781602001602082028036833780820191505090505b50905060005b828110156118b6576118918582610ee6565b82828151811061189d57fe5b602002602001018181525050808060010191505061187f565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156119845780601f1061195957610100808354040283529160200191611984565b820191906000526020600020905b81548152906001019060200180831161196757829003601f168201915b5050505050905090565b601481565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a295780601f106119fe57610100808354040283529160200191611a29565b820191906000526020600020905b815481529060010190602001808311611a0c57829003601f168201915b505050505081565b668e1bc9bf04000081565b600d60009054906101000a900460ff16611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290615234565b60405180910390fd5b600081118015611a9c575060148111155b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614fd4565b60405180910390fd5b6122b8611af882611aea610d77565b612df590919063ffffffff16565b1115611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3090615074565b60405180910390fd5b611b5381668e1bc9bf040000612e4a90919063ffffffff16565b341015611b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8c90615214565b60405180910390fd5b600d60019054906101000a900460ff1615611c0b57611bc48166b1a2bc2ec50000612e4a90919063ffffffff16565b341015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd90615214565b60405180910390fd5b611c68565b611c2581668e1bc9bf040000612e4a90919063ffffffff16565b341015611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90615214565b60405180910390fd5b5b60005b81811015611ca9576000611c7d610d77565b90506122b8611c8a610d77565b1015611c9b57611c9a3382612d87565b5b508080600101915050611c6b565b5050565b611cb5612928565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614f94565b60405180910390fd5b8060056000611d30612928565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ddd612928565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e229190614e35565b60405180910390a35050565b611e36612928565b73ffffffffffffffffffffffffffffffffffffffff16611e546118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea190615134565b60405180910390fd5b60001515600d60029054906101000a900460ff16151514611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef790615254565b60405180910390fd5b80600c9080519060200190611f169291906139f6565b5050565b611f2b611f25612928565b836129fe565b611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f61906151d4565b60405180910390fd5b611f7684848484612eba565b50505050565b611f84612928565b73ffffffffffffffffffffffffffffffffffffffff16611fa26118c2565b73ffffffffffffffffffffffffffffffffffffffff1614611ff8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fef90615134565b60405180910390fd5b6001600d60026101000a81548160ff0219169083151502179055507ff27a6fa5c2c9783f2c131f659c2119106077b81db9f21c76357aa819ad314f7e600c6040516120439190614e72565b60405180910390a1565b3373ffffffffffffffffffffffffffffffffffffffff1661206d83611338565b73ffffffffffffffffffffffffffffffffffffffff16146120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614f54565b60405180910390fd5b6002601160008481526020019081526020016000206040516120e59190614d11565b602060405180830381855afa158015612102573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121259190613d60565b6002826040516121359190614cfa565b602060405180830381855afa158015612152573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906121759190613d60565b141561218057600080fd5b806011600084815260200190815260200160002090805190602001906121a79291906139f6565b507fc19a2e831d67ca309cf36e8e5d6ac83e8c34f277a669bfcc437619794d25157a3383836040516121db93929190614db3565b60405180910390a15050565b60606121f28261290b565b612231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222890615194565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156122da5780601f106122af576101008083540402835291602001916122da565b820191906000526020600020905b8154815290600101906020018083116122bd57829003601f168201915b5050505050905060606122eb61140d565b9050600081511415612301578192505050612365565b60008251111561233657808260405160200161231e929190614d28565b60405160208183030381529060405292505050612365565b8061234085612f16565b604051602001612351929190614d28565b604051602081830303815290604052925050505b919050565b60125481565b6060600061237d836114af565b905060008114156123dd57600067ffffffffffffffff811180156123a057600080fd5b506040519080825280602002602001820160405280156123d457816020015b60608152602001906001900390816123bf5790505b50915050612518565b60608167ffffffffffffffff811180156123f657600080fd5b5060405190808252806020026020018201604052801561242a57816020015b60608152602001906001900390816124155790505b50905060005b8281101561251157601160006124468784610ee6565b81526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124e85780601f106124bd576101008083540402835291602001916124e8565b820191906000526020600020905b8154815290600101906020018083116124cb57829003601f168201915b50505050508282815181106124f957fe5b60200260200101819052508080600101915050612430565b5080925050505b919050565b6122b881565b606061252d610d77565b821061256e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612565906150b4565b60405180910390fd5b600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126045780601f106125d957610100808354040283529160200191612604565b820191906000526020600020905b8154815290600101906020018083116125e757829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b6126bf612928565b73ffffffffffffffffffffffffffffffffffffffff166126dd6118c2565b73ffffffffffffffffffffffffffffffffffffffff1614612733576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272a90615134565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279a90614ef4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61286b612928565b73ffffffffffffffffffffffffffffffffffffffff166128896118c2565b73ffffffffffffffffffffffffffffffffffffffff16146128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690615134565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b600061292182600261305d90919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166129a383611338565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f782600001613077565b9050919050565b6000612a098261290b565b612a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3f90615014565b60405180910390fd5b6000612a5383611338565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612ac257508373ffffffffffffffffffffffffffffffffffffffff16612aaa84610b44565b73ffffffffffffffffffffffffffffffffffffffff16145b80612ad35750612ad28185612610565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612afc82611338565b73ffffffffffffffffffffffffffffffffffffffff1614612b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4990615154565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb990614f74565b60405180910390fd5b612bcd838383613088565b612bd8600082612930565b612c2981600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061308d90919063ffffffff16565b50612c7b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b50612c92818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612d0283600001836130f6565b60001c905092915050565b600080600080612d208660000186613163565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190612d4f9291906139f6565b5050565b6000612d66846000018460001b846131e6565b60001c90509392505050565b6000612d8082600001613277565b9050919050565b612da1828260405180602001604052806000815250613288565b5050565b600082821115612dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612de190614fb4565b60405180910390fd5b818303905092915050565b600080828401905083811015612e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3790614f34565b60405180910390fd5b8091505092915050565b600080831415612e5d5760009050612eb4565b6000828402905082848281612e6e57fe5b0414612eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea6906150f4565b60405180910390fd5b809150505b92915050565b612ec5848484612adc565b612ed1848484846132e3565b612f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0790614ed4565b60405180910390fd5b50505050565b60606000821415612f5e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613058565b600082905060005b60008214612f88578080600101915050600a8281612f8057fe5b049150612f66565b60608167ffffffffffffffff81118015612fa157600080fd5b506040519080825280601f01601f191660200182016040528015612fd45781602001600182028036833780820191505090505b50905060006001830390508593505b6000841461305057600a8481612ff557fe5b0660300160f81b8282806001900393508151811061300f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a848161304857fe5b049350612fe3565b819450505050505b919050565b600061306f836000018360001b613447565b905092915050565b600081600001805490509050919050565b505050565b600061309f836000018360001b61346a565b905092915050565b60006130b9836000018360001b613552565b905092915050565b60006130ed846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6135c2565b90509392505050565b600081836000018054905011613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161313890614e94565b60405180910390fd5b82600001828154811061315057fe5b9060005260206000200154905092915050565b600080828460000180549050116131af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a690615094565b60405180910390fd5b60008460000184815481106131c057fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161323f9190614e50565b60405180910390fd5b5084600001600182038154811061325b57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613292838361369e565b61329f60008484846132e3565b6132de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132d590614ed4565b60405180910390fd5b505050565b60006133048473ffffffffffffffffffffffffffffffffffffffff1661382c565b613311576001905061343f565b60606133d863150b7a0260e01b613326612928565b88878760405160240161333c9493929190614d67565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405180606001604052806032815260200161559c603291398773ffffffffffffffffffffffffffffffffffffffff1661383f9092919063ffffffff16565b90506000818060200190518101906133f09190613db2565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461354657600060018203905060006001866000018054905003905060008660000182815481106134b557fe5b90600052602060002001549050808760000184815481106134d257fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061350a57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061354c565b60009150505b92915050565b600061355e8383613857565b6135b75782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506135bc565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561366957846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613697565b8285600001600183038154811061367c57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561370e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613705906150d4565b60405180910390fd5b6137178161290b565b15613757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374e90614f14565b60405180910390fd5b61376360008383613088565b6137b481600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206130a790919063ffffffff16565b506137cb818360026130c19092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606061384e848460008561387a565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060824710156138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b690614ff4565b60405180910390fd5b6138c88561382c565b613907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138fe906151f4565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516139319190614cfa565b60006040518083038185875af1925050503d806000811461396e576040519150601f19603f3d011682016040523d82523d6000602084013e613973565b606091505b509150915061398382828661398f565b92505050949350505050565b6060831561399f578290506139ef565b6000835111156139b25782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139e69190614e50565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613a3757805160ff1916838001178555613a65565b82800160010185558215613a65579182015b82811115613a64578251825591602001919060010190613a49565b5b509050613a729190613a76565b5090565b5b80821115613a8f576000816000905550600101613a77565b5090565b600081359050613aa281615528565b92915050565b600081359050613ab78161553f565b92915050565b600081519050613acc81615556565b92915050565b600081359050613ae18161556d565b92915050565b600081519050613af68161556d565b92915050565b600082601f830112613b0d57600080fd5b8135613b20613b1b826152bc565b61528f565b91508082526020830160208301858383011115613b3c57600080fd5b613b478382846154d5565b50505092915050565b600082601f830112613b6157600080fd5b8135613b74613b6f826152e8565b61528f565b91508082526020830160208301858383011115613b9057600080fd5b613b9b8382846154d5565b50505092915050565b600081359050613bb381615584565b92915050565b600060208284031215613bcb57600080fd5b6000613bd984828501613a93565b91505092915050565b60008060408385031215613bf557600080fd5b6000613c0385828601613a93565b9250506020613c1485828601613a93565b9150509250929050565b600080600060608486031215613c3357600080fd5b6000613c4186828701613a93565b9350506020613c5286828701613a93565b9250506040613c6386828701613ba4565b9150509250925092565b60008060008060808587031215613c8357600080fd5b6000613c9187828801613a93565b9450506020613ca287828801613a93565b9350506040613cb387828801613ba4565b925050606085013567ffffffffffffffff811115613cd057600080fd5b613cdc87828801613afc565b91505092959194509250565b60008060408385031215613cfb57600080fd5b6000613d0985828601613a93565b9250506020613d1a85828601613aa8565b9150509250929050565b60008060408385031215613d3757600080fd5b6000613d4585828601613a93565b9250506020613d5685828601613ba4565b9150509250929050565b600060208284031215613d7257600080fd5b6000613d8084828501613abd565b91505092915050565b600060208284031215613d9b57600080fd5b6000613da984828501613ad2565b91505092915050565b600060208284031215613dc457600080fd5b6000613dd284828501613ae7565b91505092915050565b600060208284031215613ded57600080fd5b600082013567ffffffffffffffff811115613e0757600080fd5b613e1384828501613b50565b91505092915050565b600060208284031215613e2e57600080fd5b6000613e3c84828501613ba4565b91505092915050565b60008060408385031215613e5857600080fd5b6000613e6685828601613ba4565b925050602083013567ffffffffffffffff811115613e8357600080fd5b613e8f85828601613b50565b9150509250929050565b6000613ea583836140cc565b905092915050565b6000613eb98383614cdc565b60208301905092915050565b613ece8161549f565b82525050565b613edd81615421565b82525050565b613eec8161540f565b82525050565b6000613efd8261535e565b613f0781856153a4565b935083602082028501613f1985615314565b8060005b85811015613f555784840389528151613f368582613e99565b9450613f418361538a565b925060208a01995050600181019050613f1d565b50829750879550505050505092915050565b6000613f7282615369565b613f7c81856153b5565b9350613f8783615324565b8060005b83811015613fb8578151613f9f8882613ead565b9750613faa83615397565b925050600181019050613f8b565b5085935050505092915050565b613fce81615433565b82525050565b6000613fdf82615374565b613fe981856153c6565b9350613ff98185602086016154e4565b61400281615517565b840191505092915050565b600061401882615374565b61402281856153d7565b93506140328185602086016154e4565b80840191505092915050565b60008154600181166000811461405b5760018114614080576140c4565b607f600283041661406c81876153d7565b955060ff19831686528086019350506140c4565b6002820461408e81876153d7565b955061409985615334565b60005b828110156140bb5781548189015260018201915060208101905061409c565b82880195505050505b505092915050565b60006140d78261537f565b6140e181856153e2565b93506140f18185602086016154e4565b6140fa81615517565b840191505092915050565b60006141108261537f565b61411a81856153f3565b935061412a8185602086016154e4565b61413381615517565b840191505092915050565b60006141498261537f565b6141538185615404565b93506141638185602086016154e4565b80840191505092915050565b60008154600181166000811461418c57600181146141b2576141f6565b607f600283041661419d81876153f3565b955060ff1983168652602086019350506141f6565b600282046141c081876153f3565b95506141cb85615349565b60005b828110156141ed578154818901526001820191506020810190506141ce565b80880195505050505b505092915050565b600061420b6022836153f3565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142716024836153f3565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207468652060008301527f7465616d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142d76032836153f3565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061433d6026836153f3565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a3601c836153f3565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006143e3601b836153f3565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b60006144236026836153f3565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f73204e46542100000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144896024836153f3565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ef6019836153f3565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061452f601e836153f3565b91507f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006000830152602082019050919050565b600061456f6022836153f3565b91507f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d60008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d56026836153f3565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061463b602c836153f3565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006146a16038836153f3565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614707602a836153f3565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061476d602a836153f3565b91507f4e6f7420656e6f75676820746f6b656e7320617661696c61626c6520666f722060008301527f6d696e74696e672e2e2e000000000000000000000000000000000000000000006020830152604082019050919050565b60006147d36022836153f3565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614839601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e6765210000000000006000830152602082019050919050565b60006148796020836153f3565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006148b96021836153f3565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061491f602c836153f3565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006149856020836153f3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006149c56029836153f3565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a2b601a836153f3565b91507f43686f6f73652061204e46542077697468696e2072616e67652e0000000000006000830152602082019050919050565b6000614a6b602f836153f3565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614ad16021836153f3565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b376031836153f3565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614b9d601d836153f3565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000614bdd6021836153f3565b91507f45746865722076616c75652073656e74206973206e6f7420656e6f7567682e2e60008301527f2e000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614c436022836153f3565b91507f53616c65206d7573742062652061637469766520746f206d696e74204e46542e60008301527f2e2e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ca96017836153f3565b91507f4c6963656e736520616c7265616479206c6f636b6564210000000000000000006000830152602082019050919050565b614ce581615495565b82525050565b614cf481615495565b82525050565b6000614d06828461400d565b915081905092915050565b6000614d1d828461403e565b915081905092915050565b6000614d34828561413e565b9150614d40828461413e565b91508190509392505050565b6000602082019050614d616000830184613ee3565b92915050565b6000608082019050614d7c6000830187613ed4565b614d896020830186613ee3565b614d966040830185614ceb565b8181036060830152614da88184613fd4565b905095945050505050565b6000606082019050614dc86000830186613ec5565b614dd56020830185614ceb565b8181036040830152614de78184614105565b9050949350505050565b60006020820190508181036000830152614e0b8184613ef2565b905092915050565b60006020820190508181036000830152614e2d8184613f67565b905092915050565b6000602082019050614e4a6000830184613fc5565b92915050565b60006020820190508181036000830152614e6a8184614105565b905092915050565b60006020820190508181036000830152614e8c818461416f565b905092915050565b60006020820190508181036000830152614ead816141fe565b9050919050565b60006020820190508181036000830152614ecd81614264565b9050919050565b60006020820190508181036000830152614eed816142ca565b9050919050565b60006020820190508181036000830152614f0d81614330565b9050919050565b60006020820190508181036000830152614f2d81614396565b9050919050565b60006020820190508181036000830152614f4d816143d6565b9050919050565b60006020820190508181036000830152614f6d81614416565b9050919050565b60006020820190508181036000830152614f8d8161447c565b9050919050565b60006020820190508181036000830152614fad816144e2565b9050919050565b60006020820190508181036000830152614fcd81614522565b9050919050565b60006020820190508181036000830152614fed81614562565b9050919050565b6000602082019050818103600083015261500d816145c8565b9050919050565b6000602082019050818103600083015261502d8161462e565b9050919050565b6000602082019050818103600083015261504d81614694565b9050919050565b6000602082019050818103600083015261506d816146fa565b9050919050565b6000602082019050818103600083015261508d81614760565b9050919050565b600060208201905081810360008301526150ad816147c6565b9050919050565b600060208201905081810360008301526150cd8161482c565b9050919050565b600060208201905081810360008301526150ed8161486c565b9050919050565b6000602082019050818103600083015261510d816148ac565b9050919050565b6000602082019050818103600083015261512d81614912565b9050919050565b6000602082019050818103600083015261514d81614978565b9050919050565b6000602082019050818103600083015261516d816149b8565b9050919050565b6000602082019050818103600083015261518d81614a1e565b9050919050565b600060208201905081810360008301526151ad81614a5e565b9050919050565b600060208201905081810360008301526151cd81614ac4565b9050919050565b600060208201905081810360008301526151ed81614b2a565b9050919050565b6000602082019050818103600083015261520d81614b90565b9050919050565b6000602082019050818103600083015261522d81614bd0565b9050919050565b6000602082019050818103600083015261524d81614c36565b9050919050565b6000602082019050818103600083015261526d81614c9c565b9050919050565b60006020820190506152896000830184614ceb565b92915050565b6000604051905081810181811067ffffffffffffffff821117156152b257600080fd5b8060405250919050565b600067ffffffffffffffff8211156152d357600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152ff57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061541a82615475565b9050919050565b600061542c82615475565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006154aa826154b1565b9050919050565b60006154bc826154c3565b9050919050565b60006154ce82615475565b9050919050565b82818337600083830152505050565b60005b838110156155025780820151818401526020810190506154e7565b83811115615511576000848401525b50505050565b6000601f19601f8301169050919050565b6155318161540f565b811461553c57600080fd5b50565b61554881615433565b811461555357600080fd5b50565b61555f8161543f565b811461556a57600080fd5b50565b61557681615449565b811461558157600080fd5b50565b61558d81615495565b811461559857600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212204efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d64736f6c634300060c0033
Deployed Bytecode Sourcemap
113:5462:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;320:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9529:200:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53016:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56024:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55523:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1849:122:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54951:211:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4860:187:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57083:376:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54663:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;509:34:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2088:89;;;;;;;;;;;;;:::i;:::-;;1068:316;;;;;;;;;;;;;:::i;:::-;;57530:185:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;800:39:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55239:222:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1979:101:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52660:289:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;192:29:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54482:97:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52290:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1809:148:3;;;;;;;;;;;;;:::i;:::-;;1392:449:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1158:87:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53185:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;422:40:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;228:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;268:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3328:1147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56404:327:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3145:175:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57786:365:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3013:124:1;;;;;;;;;;;;;:::i;:::-;;4483:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53360:879:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;848:28:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5055:517;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;379:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2827:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56802:214:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;471:31:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2112:281:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2185:92:1;;;;;;;;;;;;;:::i;:::-;;320:52;359:13;320:52;:::o;9529:200:2:-;9659:4;9688:20;:33;9709:11;9688:33;;;;;;;;;;;;;;;;;;;;;;;;;;;9681:40;;9529:200;;;:::o;53016:100::-;53070:13;53103:5;53096:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53016:100;:::o;56024:308::-;56145:7;56192:16;56200:7;56192;:16::i;:::-;56170:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;56300:15;:24;56316:7;56300:24;;;;;;;;;;;;;;;;;;;;;56293:31;;56024:308;;;:::o;55523:435::-;55604:13;55620:23;55635:7;55620:14;:23::i;:::-;55604:39;;55668:5;55662:11;;:2;:11;;;;55654:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;55762:5;55746:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;55788:44;55812:5;55819:12;:10;:12::i;:::-;55788:23;:44::i;:::-;55746:86;55724:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;55929:21;55938:2;55942:7;55929:8;:21::i;:::-;55523:435;;;:::o;1849:122:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1948:15:1::1;1935:10;:28;;;;;;;;;;;;:::i;:::-;;1849:122:::0;:::o;54951:211:2:-;55012:7;55133:21;:12;:19;:21::i;:::-;55126:28;;54951:211;:::o;4860:187:1:-;4917:13;4962;:11;:13::i;:::-;4951:8;:24;4943:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5024:5;:15;5030:8;5024:15;;;;;;;;;;;5017:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4860:187;;;:::o;57083:376:2:-;57292:41;57311:12;:10;:12::i;:::-;57325:7;57292:18;:41::i;:::-;57270:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;57423:28;57433:4;57439:2;57443:7;57423:9;:28::i;:::-;57083:376;;;:::o;54663:212::-;54805:7;54837:30;54861:5;54837:13;:20;54851:5;54837:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;54830:37;;54663:212;;;;:::o;509:34:1:-;;;;;;;;;;;;;:::o;2088:89::-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2157:12:1::1;;;;;;;;;;;2156:13;2141:12;;:28;;;;;;;;;;;;;;;;;;2088:89::o:0;1068:316::-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1116:15:1::1;1176:4;1159:13;;1135:21;:37;1134:46;;;;;;1116:64;;1191:15;1251:4;1234:13;;1210:21;:37;1209:46;;;;;;1191:64;;1266:5;;;;;;;;;;;:14;;:23;1281:7;1266:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1300:5;;;;;;;;;;;:14;;:23;1315:7;1300:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1334:10;:19;;:42;1354:21;1334:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1449:1:3;;1068:316:1:o:0;57530:185:2:-;57668:39;57685:4;57691:2;57695:7;57668:39;;;;;;;;;;;;:16;:39::i;:::-;57530:185;;;:::o;800:39:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55239:222:2:-;55359:7;55385:15;55406:22;55422:5;55406:12;:15;;:22;;;;:::i;:::-;55384:44;;;55446:7;55439:14;;;55239:222;;;:::o;1979:101:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2051:21:1::1;2063:8;2051:11;:21::i;:::-;1979:101:::0;:::o;52660:289:2:-;52777:7;52822:119;52857:7;52822:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;52802:139;;52660:289;;;:::o;192:29:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54482:97:2:-;54530:13;54563:8;54556:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54482:97;:::o;52290:308::-;52407:7;52471:1;52454:19;;:5;:19;;;;52432:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;52561:29;:13;:20;52575:5;52561:20;;;;;;;;;;;;;;;:27;:29::i;:::-;52554:36;;52290:308;;;:::o;1809:148:3:-;1389:12;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1916:1:::1;1879:40;;1900:6;;;;;;;;;;;1879:40;;;;;;;;;;;;1947:1;1930:6;;:19;;;;;;;;;;;;;;;;;;1809:148::o:0;1392:449:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1503:14:1::1;1520:13;:11;:13::i;:::-;1503:30;;1583:1;1566:14;:18;:47;;;;;1606:7;;1588:14;:25;;1566:47;1544:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;1693:9;1688:98;1712:14;1708:1;:18;1688:98;;;1748:26;1758:3;1772:1;1763:6;:10;1748:9;:26::i;:::-;1728:3;;;;;;;1688:98;;;;1806:27;1818:14;1806:7;;:11;;:27;;;;:::i;:::-;1796:7;:37;;;;1449:1:3;1392:449:1::0;;:::o;2285:534::-;2374:16;2408:18;2429:17;2439:6;2429:9;:17::i;:::-;2408:38;;2475:1;2461:10;:15;2457:355;;;2514:1;2500:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:23;;;;;2457:355;2549:23;2589:10;2575:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2549:51;;2615:13;2643:130;2667:10;2659:5;:18;2643:130;;;2723:34;2743:6;2751:5;2723:19;:34::i;:::-;2707:6;2714:5;2707:13;;;;;;;;;;;;;:50;;;;;2679:7;;;;;;;2643:130;;;2794:6;2787:13;;;;;2285:534;;;;:::o;1158:87:3:-;1204:7;1231:6;;;;;;;;;;;1224:13;;1158:87;:::o;53185:104:2:-;53241:13;53274:7;53267:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53185:104;:::o;422:40:1:-;460:2;422:40;:::o;228:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;268:45::-;300:13;268:45;:::o;3328:1147::-;3401:12;;;;;;;;;;;3393:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;3503:1;3485:15;:19;:53;;;;;460:2;3508:15;:30;;3485:53;3463:137;;;;;;;;;;;;:::i;:::-;;;;;;;;;409:4;3633:34;3651:15;3633:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:41;;3611:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;3790:26;3800:15;300:13;3790:9;;:26;;;;:::i;:::-;3777:9;:39;;3755:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;3892:15;;;;;;;;;;;3888:356;;;3963:33;3980:15;359:13;3963:16;;:33;;;;:::i;:::-;3950:9;:46;;3924:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:356;;;4137:26;4147:15;300:13;4137:9;;:26;;;;:::i;:::-;4124:9;:39;;4098:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;3888:356;4261:9;4256:212;4280:15;4276:1;:19;4256:212;;;4317:17;4337:13;:11;:13::i;:::-;4317:33;;409:4;4369:13;:11;:13::i;:::-;:19;4365:92;;;4409:32;4419:10;4431:9;4409;:32::i;:::-;4365:92;4256:212;4297:3;;;;;;;4256:212;;;;3328:1147;:::o;56404:327:2:-;56551:12;:10;:12::i;:::-;56539:24;;:8;:24;;;;56531:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;56651:8;56606:18;:32;56625:12;:10;:12::i;:::-;56606:32;;;;;;;;;;;;;;;:42;56639:8;56606:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;56704:8;56675:48;;56690:12;:10;:12::i;:::-;56675:48;;;56714:8;56675:48;;;;;;:::i;:::-;;;;;;;;56404:327;;:::o;3145:175:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:5:1::1;3228:22;;:13;;;;;;;;;;;:22;;;3220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3304:8;3289:12;:23;;;;;;;;;;;;:::i;:::-;;3145:175:::0;:::o;57786:365:2:-;57975:41;57994:12;:10;:12::i;:::-;58008:7;57975:18;:41::i;:::-;57953:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;58104:39;58118:4;58124:2;58128:7;58137:5;58104:13;:39::i;:::-;57786:365;;;;:::o;3013:124:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3080:4:1::1;3064:13;;:20;;;;;;;;;;;;;;;;;;3100:29;3116:12;3100:29;;;;;;:::i;:::-;;;;;;;;3013:124::o:0;4483:369::-;4603:10;4582:31;;:17;4590:8;4582:7;:17::i;:::-;:31;;;4560:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;4722:30;4735:5;:15;4741:8;4735:15;;;;;;;;;;;4722:30;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4698:20;4711:5;4698:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4690:63;;;;;;4782:5;4764;:15;4770:8;4764:15;;;;;;;;;;;:23;;;;;;;;;;;;:::i;:::-;;4805:39;4816:10;4828:8;4838:5;4805:39;;;;;;;;:::i;:::-;;;;;;;;4483:369;;:::o;53360:879:2:-;53478:13;53531:16;53539:7;53531;:16::i;:::-;53509:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53635:23;53661:10;:19;53672:7;53661:19;;;;;;;;;;;53635:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53691:18;53712:9;:7;:9::i;:::-;53691:30;;53819:1;53803:4;53797:18;:23;53793:72;;;53844:9;53837:16;;;;;;53793:72;53995:1;53975:9;53969:23;:27;53965:108;;;54044:4;54050:9;54027:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54013:48;;;;;;53965:108;54205:4;54211:18;:7;:16;:18::i;:::-;54188:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54174:57;;;;53360:879;;;;:::o;848:28:1:-;;;;:::o;5055:517::-;5144:15;5177:18;5198:17;5208:6;5198:9;:17::i;:::-;5177:38;;5244:1;5230:10;:15;5226:339;;;5282:1;5269:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5262:22;;;;;5226:339;5317:22;5355:10;5342:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5317:49;;5386:13;5381:145;5413:10;5405:5;:18;5381:145;;;5469:5;:41;5475:34;5495:6;5503:5;5475:19;:34::i;:::-;5469:41;;;;;;;;;;;5453:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;5460:5;5453:13;;;;;;;;;;;;;:57;;;;5425:7;;;;;;;5381:145;;;;5547:6;5540:13;;;;5055:517;;;;:::o;379:34::-;409:4;379:34;:::o;2827:178::-;2883:13;2923;:11;:13::i;:::-;2917:3;:19;2909:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:12;2978:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2827:178;;;:::o;56802:214:2:-;56944:4;56973:18;:25;56992:5;56973:25;;;;;;;;;;;;;;;:35;56999:8;56973:35;;;;;;;;;;;;;;;;;;;;;;;;;56966:42;;56802:214;;;;:::o;471:31:1:-;;;;;;;;;;;;;:::o;2112:281:3:-;1389:12;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2235:1:::1;2215:22;;:8;:22;;;;2193:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;2348:8;2319:38;;2340:6;;;;;;;;;;;2319:38;;;;;;;;;;;;2377:8;2368:6;;:17;;;;;;;;;;;;;;;;;;2112:281:::0;:::o;2185:92:1:-;1389:12:3;:10;:12::i;:::-;1378:23;;:7;:5;:7::i;:::-;:23;;;1370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2257:12:1::1;;;;;;;;;;;2256:13;2241:12;;:28;;;;;;;;;;;;;;;;;;2185:92::o:0;59698:127:2:-;59763:4;59787:30;59809:7;59787:12;:21;;:30;;;;:::i;:::-;59780:37;;59698:127;;;:::o;632:106:0:-;685:15;720:10;713:17;;632:106;:::o;66112:192:2:-;66214:2;66187:15;:24;66203:7;66187:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66270:7;66266:2;66232:46;;66241:23;66256:7;66241:14;:23::i;:::-;66232:46;;;;;;;;;;;;66112:192;;:::o;45346:155::-;45442:7;45474:19;45482:3;:10;;45474:7;:19::i;:::-;45467:26;;45346:155;;;:::o;59992:459::-;60121:4;60165:16;60173:7;60165;:16::i;:::-;60143:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;60264:13;60280:23;60295:7;60280:14;:23::i;:::-;60264:39;;60333:5;60322:16;;:7;:16;;;:64;;;;60379:7;60355:31;;:20;60367:7;60355:11;:20::i;:::-;:31;;;60322:64;:120;;;;60403:39;60427:5;60434:7;60403:23;:39::i;:::-;60322:120;60314:129;;;59992:459;;;;:::o;63303:670::-;63476:4;63449:31;;:23;63464:7;63449:14;:23::i;:::-;:31;;;63427:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;63600:1;63586:16;;:2;:16;;;;63578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;63656:39;63677:4;63683:2;63687:7;63656:20;:39::i;:::-;63760:29;63777:1;63781:7;63760:8;:29::i;:::-;63802:35;63829:7;63802:13;:19;63816:4;63802:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;63848:30;63870:7;63848:13;:17;63862:2;63848:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;63891:29;63908:7;63917:2;63891:12;:16;;:29;;;;;:::i;:::-;;63957:7;63953:2;63938:27;;63947:4;63938:27;;;;;;;;;;;;63303:670;;;:::o;36788:169::-;36886:7;36926:22;36930:3;:10;;36942:5;36926:3;:22::i;:::-;36918:31;;36911:38;;36788:169;;;;:::o;45849:268::-;45956:7;45965;45991:11;46004:13;46021:22;46025:3;:10;;46037:5;46021:3;:22::i;:::-;45990:53;;;;46070:3;46062:12;;46100:5;46092:14;;46054:55;;;;;;45849:268;;;;;:::o;64634:100::-;64718:8;64707;:19;;;;;;;;;;;;:::i;:::-;;64634:100;:::o;47231:292::-;47372:7;47454:44;47459:3;:10;;47479:3;47471:12;;47485;47454:4;:44::i;:::-;47446:53;;47392:123;;47231:292;;;;;:::o;36320:114::-;36380:7;36407:19;36415:3;:10;;36407:7;:19::i;:::-;36400:26;;36320:114;;;:::o;60794:110::-;60870:26;60880:2;60884:7;60870:26;;;;;;;;;;;;:9;:26::i;:::-;60794:110;;:::o;13759:158::-;13817:7;13850:1;13845;:6;;13837:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;13908:1;13904;:5;13897:12;;13759:158;;;;:::o;13297:179::-;13355:7;13375:9;13391:1;13387;:5;13375:17;;13416:1;13411;:6;;13403:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;13467:1;13460:8;;;13297:179;;;;:::o;14176:220::-;14234:7;14263:1;14258;:6;14254:20;;;14273:1;14266:8;;;;14254:20;14285:9;14301:1;14297;:5;14285:17;;14330:1;14325;14321;:5;;;;;;:10;14313:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;14387:1;14380:8;;;14176:220;;;;;:::o;59033:352::-;59190:28;59200:4;59206:2;59210:7;59190:9;:28::i;:::-;59251:48;59274:4;59280:2;59284:7;59293:5;59251:22;:48::i;:::-;59229:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;59033:352;;;;:::o;47770:748::-;47826:13;48056:1;48047:5;:10;48043:53;;;48074:10;;;;;;;;;;;;;;;;;;;;;48043:53;48106:12;48121:5;48106:20;;48137:14;48162:78;48177:1;48169:4;:9;48162:78;;48195:8;;;;;;;48226:2;48218:10;;;;;;;;;48162:78;;;48250:19;48282:6;48272:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48250:39;;48300:13;48325:1;48316:6;:10;48300:26;;48344:5;48337:12;;48360:119;48375:1;48367:4;:9;48360:119;;48437:2;48430:4;:9;;;;;;48424:2;:16;48411:31;;48393:6;48400:7;;;;;;;48393:15;;;;;;;;;;;:49;;;;;;;;;;;48465:2;48457:10;;;;;;;;;48360:119;;;48503:6;48489:21;;;;;;47770:748;;;;:::o;45075:183::-;45186:4;45215:35;45225:3;:10;;45245:3;45237:12;;45215:9;:35::i;:::-;45208:42;;45075:183;;;;:::o;41691:110::-;41747:7;41774:3;:12;;:19;;;;41767:26;;41691:110;;;:::o;66917:126::-;;;;:::o;35810:160::-;35898:4;35927:35;35935:3;:10;;35955:5;35947:14;;35927:7;:35::i;:::-;35920:42;;35810:160;;;;:::o;35503:131::-;35570:4;35594:32;35599:3;:10;;35619:5;35611:14;;35594:4;:32::i;:::-;35587:39;;35503:131;;;;:::o;44441:219::-;44564:4;44588:64;44593:3;:10;;44613:3;44605:12;;44643:5;44627:23;;44619:32;;44588:4;:64::i;:::-;44581:71;;44441:219;;;;;:::o;31454:273::-;31548:7;31616:5;31595:3;:11;;:18;;;;:26;31573:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;31701:3;:11;;31713:5;31701:18;;;;;;;;;;;;;;;;31694:25;;31454:273;;;;:::o;42166:348::-;42260:7;42269;42338:5;42316:3;:12;;:19;;;;:27;42294:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;42418:22;42443:3;:12;;42456:5;42443:19;;;;;;;;;;;;;;;;;;42418:44;;42481:5;:10;;;42493:5;:12;;;42473:33;;;;;42166:348;;;;;:::o;43764:353::-;43892:7;43912:16;43931:3;:12;;:17;43944:3;43931:17;;;;;;;;;;;;43912:36;;43979:1;43967:8;:13;;43982:12;43959:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;44049:3;:12;;44073:1;44062:8;:12;44049:26;;;;;;;;;;;;;;;;;;:33;;;44042:40;;;43764:353;;;;;:::o;30991:109::-;31047:7;31074:3;:11;;:18;;;;31067:25;;30991:109;;;:::o;61131:321::-;61261:18;61267:2;61271:7;61261:5;:18::i;:::-;61312:54;61343:1;61347:2;61351:7;61360:5;61312:22;:54::i;:::-;61290:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;61131:321;;;:::o;65299:694::-;65454:4;65476:15;:2;:13;;;:15::i;:::-;65471:60;;65515:4;65508:11;;;;65471:60;65541:23;65567:313;65638:45;;;65702:12;:10;:12::i;:::-;65733:4;65756:7;65782:5;65597:205;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65567:313;;;;;;;;;;;;;;;;;:2;:15;;;;:313;;;;;:::i;:::-;65541:339;;65891:13;65918:10;65907:32;;;;;;;;;;;;:::i;:::-;65891:48;;49293:10;65968:16;;65958:26;;;:6;:26;;;;65950:35;;;;65299:694;;;;;;;:::o;41439:157::-;41537:4;41587:1;41566:3;:12;;:17;41579:3;41566:17;;;;;;;;;;;;:22;;41559:29;;41439:157;;;;:::o;29101:1557::-;29167:4;29285:18;29306:3;:12;;:19;29319:5;29306:19;;;;;;;;;;;;29285:40;;29356:1;29342:10;:15;29338:1313;;29717:21;29754:1;29741:10;:14;29717:38;;29770:17;29811:1;29790:3;:11;;:18;;;;:22;29770:42;;30057:17;30077:3;:11;;30089:9;30077:22;;;;;;;;;;;;;;;;30057:42;;30223:9;30194:3;:11;;30206:13;30194:26;;;;;;;;;;;;;;;:38;;;;30342:1;30326:13;:17;30300:3;:12;;:23;30313:9;30300:23;;;;;;;;;;;:43;;;;30452:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30547:3;:12;;:19;30560:5;30547:19;;;;;;;;;;;30540:26;;;30590:4;30583:11;;;;;;;;29338:1313;30634:5;30627:12;;;29101:1557;;;;;:::o;28511:414::-;28574:4;28596:21;28606:3;28611:5;28596:9;:21::i;:::-;28591:327;;28634:3;:11;;28651:5;28634:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28817:3;:11;;:18;;;;28795:3;:12;;:19;28808:5;28795:19;;;;;;;;;;;:40;;;;28857:4;28850:11;;;;28591:327;28901:5;28894:12;;28511:414;;;;;:::o;38881:737::-;38991:4;39107:16;39126:3;:12;;:17;39139:3;39126:17;;;;;;;;;;;;39107:36;;39172:1;39160:8;:13;39156:455;;;39240:3;:12;;39258:36;;;;;;;;39274:3;39258:36;;;;39287:5;39258:36;;;39240:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39453:3;:12;;:19;;;;39433:3;:12;;:17;39446:3;39433:17;;;;;;;;;;;:39;;;;39494:4;39487:11;;;;;39156:455;39567:5;39531:3;:12;;39555:1;39544:8;:12;39531:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;39594:5;39587:12;;;38881:737;;;;;;:::o;61788:404::-;61882:1;61868:16;;:2;:16;;;;61860:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;61941:16;61949:7;61941;:16::i;:::-;61940:17;61932:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;62003:45;62032:1;62036:2;62040:7;62003:20;:45::i;:::-;62061:30;62083:7;62061:13;:17;62075:2;62061:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;62104:29;62121:7;62130:2;62104:12;:16;;:29;;;;;:::i;:::-;;62176:7;62172:2;62151:33;;62168:1;62151:33;;;;;;;;;;;;61788:404;;:::o;18836:444::-;18896:4;19104:12;19228:7;19216:20;19208:28;;19271:1;19264:4;:8;19257:15;;;18836:444;;;:::o;21873:229::-;22010:12;22042:52;22064:6;22072:4;22078:1;22081:12;22042:21;:52::i;:::-;22035:59;;21873:229;;;;;:::o;30744:161::-;30844:4;30896:1;30873:3;:12;;:19;30886:5;30873:19;;;;;;;;;;;;:24;;30866:31;;30744:161;;;;:::o;23089:632::-;23259:12;23331:5;23306:21;:30;;23284:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;23421:18;23432:6;23421:10;:18::i;:::-;23413:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23547:12;23561:23;23588:6;:11;;23607:5;23628:4;23588:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23546:97;;;;23661:52;23679:7;23688:10;23700:12;23661:17;:52::i;:::-;23654:59;;;;23089:632;;;;;;:::o;26012:777::-;26162:12;26191:7;26187:595;;;26222:10;26215:17;;;;26187:595;26356:1;26336:10;:17;:21;26332:439;;;26599:10;26593:17;26660:15;26647:10;26643:2;26639:19;26632:44;26547:148;26742:12;26735:20;;;;;;;;;;;:::i;:::-;;;;;;;;26012:777;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:124::-;;219:6;206:20;197:29;;231:30;255:5;231:30;:::i;:::-;191:75;;;;:::o;273:134::-;;357:6;351:13;342:22;;369:33;396:5;369:33;:::i;:::-;336:71;;;;:::o;414:128::-;;493:6;480:20;471:29;;505:32;531:5;505:32;:::i;:::-;465:77;;;;:::o;549:132::-;;632:6;626:13;617:22;;644:32;670:5;644:32;:::i;:::-;611:70;;;;:::o;689:440::-;;790:3;783:4;775:6;771:17;767:27;757:2;;808:1;805;798:12;757:2;845:6;832:20;867:64;882:48;923:6;882:48;:::i;:::-;867:64;:::i;:::-;858:73;;951:6;944:5;937:21;987:4;979:6;975:17;1020:4;1013:5;1009:16;1055:3;1046:6;1041:3;1037:16;1034:25;1031:2;;;1072:1;1069;1062:12;1031:2;1082:41;1116:6;1111:3;1106;1082:41;:::i;:::-;750:379;;;;;;;:::o;1138:442::-;;1240:3;1233:4;1225:6;1221:17;1217:27;1207:2;;1258:1;1255;1248:12;1207:2;1295:6;1282:20;1317:65;1332:49;1374:6;1332:49;:::i;:::-;1317:65;:::i;:::-;1308:74;;1402:6;1395:5;1388:21;1438:4;1430:6;1426:17;1471:4;1464:5;1460:16;1506:3;1497:6;1492:3;1488:16;1485:25;1482:2;;;1523:1;1520;1513:12;1482:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1200:380;;;;;;;:::o;1588:130::-;;1668:6;1655:20;1646:29;;1680:33;1707:5;1680:33;:::i;:::-;1640:78;;;;:::o;1725:241::-;;1829:2;1817:9;1808:7;1804:23;1800:32;1797:2;;;1845:1;1842;1835:12;1797:2;1880:1;1897:53;1942:7;1933:6;1922:9;1918:22;1897:53;:::i;:::-;1887:63;;1859:97;1791:175;;;;:::o;1973:366::-;;;2094:2;2082:9;2073:7;2069:23;2065:32;2062:2;;;2110:1;2107;2100:12;2062:2;2145:1;2162:53;2207:7;2198:6;2187:9;2183:22;2162:53;:::i;:::-;2152:63;;2124:97;2252:2;2270:53;2315:7;2306:6;2295:9;2291:22;2270:53;:::i;:::-;2260:63;;2231:98;2056:283;;;;;:::o;2346:491::-;;;;2484:2;2472:9;2463:7;2459:23;2455:32;2452:2;;;2500:1;2497;2490:12;2452:2;2535:1;2552:53;2597:7;2588:6;2577:9;2573:22;2552:53;:::i;:::-;2542:63;;2514:97;2642:2;2660:53;2705:7;2696:6;2685:9;2681:22;2660:53;:::i;:::-;2650:63;;2621:98;2750:2;2768:53;2813:7;2804:6;2793:9;2789:22;2768:53;:::i;:::-;2758:63;;2729:98;2446:391;;;;;:::o;2844:721::-;;;;;3008:3;2996:9;2987:7;2983:23;2979:33;2976:2;;;3025:1;3022;3015:12;2976:2;3060:1;3077:53;3122:7;3113:6;3102:9;3098:22;3077:53;:::i;:::-;3067:63;;3039:97;3167:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3146:98;3275:2;3293:53;3338:7;3329:6;3318:9;3314:22;3293:53;:::i;:::-;3283:63;;3254:98;3411:2;3400:9;3396:18;3383:32;3435:18;3427:6;3424:30;3421:2;;;3467:1;3464;3457:12;3421:2;3487:62;3541:7;3532:6;3521:9;3517:22;3487:62;:::i;:::-;3477:72;;3362:193;2970:595;;;;;;;:::o;3572:360::-;;;3690:2;3678:9;3669:7;3665:23;3661:32;3658:2;;;3706:1;3703;3696:12;3658:2;3741:1;3758:53;3803:7;3794:6;3783:9;3779:22;3758:53;:::i;:::-;3748:63;;3720:97;3848:2;3866:50;3908:7;3899:6;3888:9;3884:22;3866:50;:::i;:::-;3856:60;;3827:95;3652:280;;;;;:::o;3939:366::-;;;4060:2;4048:9;4039:7;4035:23;4031:32;4028:2;;;4076:1;4073;4066:12;4028:2;4111:1;4128:53;4173:7;4164:6;4153:9;4149:22;4128:53;:::i;:::-;4118:63;;4090:97;4218:2;4236:53;4281:7;4272:6;4261:9;4257:22;4236:53;:::i;:::-;4226:63;;4197:98;4022:283;;;;;:::o;4312:263::-;;4427:2;4415:9;4406:7;4402:23;4398:32;4395:2;;;4443:1;4440;4433:12;4395:2;4478:1;4495:64;4551:7;4542:6;4531:9;4527:22;4495:64;:::i;:::-;4485:74;;4457:108;4389:186;;;;:::o;4582:239::-;;4685:2;4673:9;4664:7;4660:23;4656:32;4653:2;;;4701:1;4698;4691:12;4653:2;4736:1;4753:52;4797:7;4788:6;4777:9;4773:22;4753:52;:::i;:::-;4743:62;;4715:96;4647:174;;;;:::o;4828:261::-;;4942:2;4930:9;4921:7;4917:23;4913:32;4910:2;;;4958:1;4955;4948:12;4910:2;4993:1;5010:63;5065:7;5056:6;5045:9;5041:22;5010:63;:::i;:::-;5000:73;;4972:107;4904:185;;;;:::o;5096:347::-;;5210:2;5198:9;5189:7;5185:23;5181:32;5178:2;;;5226:1;5223;5216:12;5178:2;5289:1;5278:9;5274:17;5261:31;5312:18;5304:6;5301:30;5298:2;;;5344:1;5341;5334:12;5298:2;5364:63;5419:7;5410:6;5399:9;5395:22;5364:63;:::i;:::-;5354:73;;5240:193;5172:271;;;;:::o;5450:241::-;;5554:2;5542:9;5533:7;5529:23;5525:32;5522:2;;;5570:1;5567;5560:12;5522:2;5605:1;5622:53;5667:7;5658:6;5647:9;5643:22;5622:53;:::i;:::-;5612:63;;5584:97;5516:175;;;;:::o;5698:472::-;;;5829:2;5817:9;5808:7;5804:23;5800:32;5797:2;;;5845:1;5842;5835:12;5797:2;5880:1;5897:53;5942:7;5933:6;5922:9;5918:22;5897:53;:::i;:::-;5887:63;;5859:97;6015:2;6004:9;6000:18;5987:32;6039:18;6031:6;6028:30;6025:2;;;6071:1;6068;6061:12;6025:2;6091:63;6146:7;6137:6;6126:9;6122:22;6091:63;:::i;:::-;6081:73;;5966:194;5791:379;;;;;:::o;6178:193::-;;6299:66;6361:3;6353:6;6299:66;:::i;:::-;6285:80;;6278:93;;;;:::o;6380:173::-;;6467:46;6509:3;6501:6;6467:46;:::i;:::-;6542:4;6537:3;6533:14;6519:28;;6460:93;;;;:::o;6561:142::-;6652:45;6691:5;6652:45;:::i;:::-;6647:3;6640:58;6634:69;;:::o;6710:137::-;6809:32;6835:5;6809:32;:::i;:::-;6804:3;6797:45;6791:56;;:::o;6854:113::-;6937:24;6955:5;6937:24;:::i;:::-;6932:3;6925:37;6919:48;;:::o;7003:928::-;;7168:64;7226:5;7168:64;:::i;:::-;7245:96;7334:6;7329:3;7245:96;:::i;:::-;7238:103;;7364:3;7406:4;7398:6;7394:17;7389:3;7385:27;7433:66;7493:5;7433:66;:::i;:::-;7519:7;7547:1;7532:360;7557:6;7554:1;7551:13;7532:360;;;7619:9;7613:4;7609:20;7604:3;7597:33;7664:6;7658:13;7686:84;7765:4;7750:13;7686:84;:::i;:::-;7678:92;;7787:70;7850:6;7787:70;:::i;:::-;7777:80;;7880:4;7875:3;7871:14;7864:21;;7589:303;7579:1;7576;7572:9;7567:14;;7532:360;;;7536:14;7905:4;7898:11;;7922:3;7915:10;;7147:784;;;;;;;;;:::o;7970:690::-;;8115:54;8163:5;8115:54;:::i;:::-;8182:86;8261:6;8256:3;8182:86;:::i;:::-;8175:93;;8289:56;8339:5;8289:56;:::i;:::-;8365:7;8393:1;8378:260;8403:6;8400:1;8397:13;8378:260;;;8470:6;8464:13;8491:63;8550:3;8535:13;8491:63;:::i;:::-;8484:70;;8571:60;8624:6;8571:60;:::i;:::-;8561:70;;8435:203;8425:1;8422;8418:9;8413:14;;8378:260;;;8382:14;8651:3;8644:10;;8094:566;;;;;;;:::o;8668:104::-;8745:21;8760:5;8745:21;:::i;:::-;8740:3;8733:34;8727:45;;:::o;8779:343::-;;8889:38;8921:5;8889:38;:::i;:::-;8939:70;9002:6;8997:3;8939:70;:::i;:::-;8932:77;;9014:52;9059:6;9054:3;9047:4;9040:5;9036:16;9014:52;:::i;:::-;9087:29;9109:6;9087:29;:::i;:::-;9082:3;9078:39;9071:46;;8869:253;;;;;:::o;9129:356::-;;9257:38;9289:5;9257:38;:::i;:::-;9307:88;9388:6;9383:3;9307:88;:::i;:::-;9300:95;;9400:52;9445:6;9440:3;9433:4;9426:5;9422:16;9400:52;:::i;:::-;9473:6;9468:3;9464:16;9457:23;;9237:248;;;;;:::o;9515:887::-;;9654:5;9648:12;9688:1;9677:9;9673:17;9701:1;9696:267;;;;9974:1;9969:427;;;;9666:730;;9696:267;9774:4;9770:1;9759:9;9755:17;9751:28;9793:88;9874:6;9869:3;9793:88;:::i;:::-;9786:95;;9919:4;9915:9;9904;9900:25;9895:3;9888:38;9949:6;9944:3;9940:16;9933:23;;9703:260;9696:267;;9969:427;10038:1;10027:9;10023:17;10054:88;10135:6;10130:3;10054:88;:::i;:::-;10047:95;;10164:41;10199:5;10164:41;:::i;:::-;10221:1;10229:130;10243:6;10240:1;10237:13;10229:130;;;10308:7;10302:14;10298:1;10293:3;10289:11;10282:35;10349:1;10340:7;10336:15;10325:26;;10265:4;10262:1;10258:12;10253:17;;10229:130;;;10382:6;10377:3;10373:16;10366:23;;9976:420;;;9666:730;;9624:778;;;;;:::o;10410:327::-;;10512:39;10545:5;10512:39;:::i;:::-;10563:61;10617:6;10612:3;10563:61;:::i;:::-;10556:68;;10629:52;10674:6;10669:3;10662:4;10655:5;10651:16;10629:52;:::i;:::-;10702:29;10724:6;10702:29;:::i;:::-;10697:3;10693:39;10686:46;;10492:245;;;;;:::o;10744:347::-;;10856:39;10889:5;10856:39;:::i;:::-;10907:71;10971:6;10966:3;10907:71;:::i;:::-;10900:78;;10983:52;11028:6;11023:3;11016:4;11009:5;11005:16;10983:52;:::i;:::-;11056:29;11078:6;11056:29;:::i;:::-;11051:3;11047:39;11040:46;;10836:255;;;;;:::o;11098:360::-;;11228:39;11261:5;11228:39;:::i;:::-;11279:89;11361:6;11356:3;11279:89;:::i;:::-;11272:96;;11373:52;11418:6;11413:3;11406:4;11399:5;11395:16;11373:52;:::i;:::-;11446:6;11441:3;11437:16;11430:23;;11208:250;;;;;:::o;11490:823::-;;11609:5;11603:12;11643:1;11632:9;11628:17;11656:1;11651:248;;;;11910:1;11905:402;;;;11621:686;;11651:248;11729:4;11725:1;11714:9;11710:17;11706:28;11748:71;11812:6;11807:3;11748:71;:::i;:::-;11741:78;;11857:4;11853:9;11842;11838:25;11833:3;11826:38;11887:4;11882:3;11878:14;11871:21;;11658:241;11651:248;;11905:402;11974:1;11963:9;11959:17;11990:71;12054:6;12049:3;11990:71;:::i;:::-;11983:78;;12083:38;12115:5;12083:38;:::i;:::-;12137:1;12145:130;12159:6;12156:1;12153:13;12145:130;;;12224:7;12218:14;12214:1;12209:3;12205:11;12198:35;12265:1;12256:7;12252:15;12241:26;;12181:4;12178:1;12174:12;12169:17;;12145:130;;;12298:1;12293:3;12289:11;12282:18;;11912:395;;;11621:686;;11579:734;;;;;:::o;12322:371::-;;12482:67;12546:2;12541:3;12482:67;:::i;:::-;12475:74;;12582:34;12578:1;12573:3;12569:11;12562:55;12651:4;12646:2;12641:3;12637:12;12630:26;12684:2;12679:3;12675:12;12668:19;;12468:225;;;:::o;12702:373::-;;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12962:34;12958:1;12953:3;12949:11;12942:55;13031:6;13026:2;13021:3;13017:12;13010:28;13066:2;13061:3;13057:12;13050:19;;12848:227;;;:::o;13084:387::-;;13244:67;13308:2;13303:3;13244:67;:::i;:::-;13237:74;;13344:34;13340:1;13335:3;13331:11;13324:55;13413:20;13408:2;13403:3;13399:12;13392:42;13462:2;13457:3;13453:12;13446:19;;13230:241;;;:::o;13480:375::-;;13640:67;13704:2;13699:3;13640:67;:::i;:::-;13633:74;;13740:34;13736:1;13731:3;13727:11;13720:55;13809:8;13804:2;13799:3;13795:12;13788:30;13846:2;13841:3;13837:12;13830:19;;13626:229;;;:::o;13864:328::-;;14024:67;14088:2;14083:3;14024:67;:::i;:::-;14017:74;;14124:30;14120:1;14115:3;14111:11;14104:51;14183:2;14178:3;14174:12;14167:19;;14010:182;;;:::o;14201:327::-;;14361:67;14425:2;14420:3;14361:67;:::i;:::-;14354:74;;14461:29;14457:1;14452:3;14448:11;14441:50;14519:2;14514:3;14510:12;14503:19;;14347:181;;;:::o;14537:375::-;;14697:67;14761:2;14756:3;14697:67;:::i;:::-;14690:74;;14797:34;14793:1;14788:3;14784:11;14777:55;14866:8;14861:2;14856:3;14852:12;14845:30;14903:2;14898:3;14894:12;14887:19;;14683:229;;;:::o;14921:373::-;;15081:67;15145:2;15140:3;15081:67;:::i;:::-;15074:74;;15181:34;15177:1;15172:3;15168:11;15161:55;15250:6;15245:2;15240:3;15236:12;15229:28;15285:2;15280:3;15276:12;15269:19;;15067:227;;;:::o;15303:325::-;;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15563:27;15559:1;15554:3;15550:11;15543:48;15619:2;15614:3;15610:12;15603:19;;15449:179;;;:::o;15637:330::-;;15797:67;15861:2;15856:3;15797:67;:::i;:::-;15790:74;;15897:32;15893:1;15888:3;15884:11;15877:53;15958:2;15953:3;15949:12;15942:19;;15783:184;;;:::o;15976:371::-;;16136:67;16200:2;16195:3;16136:67;:::i;:::-;16129:74;;16236:34;16232:1;16227:3;16223:11;16216:55;16305:4;16300:2;16295:3;16291:12;16284:26;16338:2;16333:3;16329:12;16322:19;;16122:225;;;:::o;16356:375::-;;16516:67;16580:2;16575:3;16516:67;:::i;:::-;16509:74;;16616:34;16612:1;16607:3;16603:11;16596:55;16685:8;16680:2;16675:3;16671:12;16664:30;16722:2;16717:3;16713:12;16706:19;;16502:229;;;:::o;16740:381::-;;16900:67;16964:2;16959:3;16900:67;:::i;:::-;16893:74;;17000:34;16996:1;16991:3;16987:11;16980:55;17069:14;17064:2;17059:3;17055:12;17048:36;17112:2;17107:3;17103:12;17096:19;;16886:235;;;:::o;17130:393::-;;17290:67;17354:2;17349:3;17290:67;:::i;:::-;17283:74;;17390:34;17386:1;17381:3;17377:11;17370:55;17459:26;17454:2;17449:3;17445:12;17438:48;17514:2;17509:3;17505:12;17498:19;;17276:247;;;:::o;17532:379::-;;17692:67;17756:2;17751:3;17692:67;:::i;:::-;17685:74;;17792:34;17788:1;17783:3;17779:11;17772:55;17861:12;17856:2;17851:3;17847:12;17840:34;17902:2;17897:3;17893:12;17886:19;;17678:233;;;:::o;17920:379::-;;18080:67;18144:2;18139:3;18080:67;:::i;:::-;18073:74;;18180:34;18176:1;18171:3;18167:11;18160:55;18249:12;18244:2;18239:3;18235:12;18228:34;18290:2;18285:3;18281:12;18274:19;;18066:233;;;:::o;18308:371::-;;18468:67;18532:2;18527:3;18468:67;:::i;:::-;18461:74;;18568:34;18564:1;18559:3;18555:11;18548:55;18637:4;18632:2;18627:3;18623:12;18616:26;18670:2;18665:3;18661:12;18654:19;;18454:225;;;:::o;18688:326::-;;18848:67;18912:2;18907:3;18848:67;:::i;:::-;18841:74;;18948:28;18944:1;18939:3;18935:11;18928:49;19005:2;19000:3;18996:12;18989:19;;18834:180;;;:::o;19023:332::-;;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19283:34;19279:1;19274:3;19270:11;19263:55;19346:2;19341:3;19337:12;19330:19;;19169:186;;;:::o;19364:370::-;;19524:67;19588:2;19583:3;19524:67;:::i;:::-;19517:74;;19624:34;19620:1;19615:3;19611:11;19604:55;19693:3;19688:2;19683:3;19679:12;19672:25;19725:2;19720:3;19716:12;19709:19;;19510:224;;;:::o;19743:381::-;;19903:67;19967:2;19962:3;19903:67;:::i;:::-;19896:74;;20003:34;19999:1;19994:3;19990:11;19983:55;20072:14;20067:2;20062:3;20058:12;20051:36;20115:2;20110:3;20106:12;20099:19;;19889:235;;;:::o;20133:332::-;;20293:67;20357:2;20352:3;20293:67;:::i;:::-;20286:74;;20393:34;20389:1;20384:3;20380:11;20373:55;20456:2;20451:3;20447:12;20440:19;;20279:186;;;:::o;20474:378::-;;20634:67;20698:2;20693:3;20634:67;:::i;:::-;20627:74;;20734:34;20730:1;20725:3;20721:11;20714:55;20803:11;20798:2;20793:3;20789:12;20782:33;20843:2;20838:3;20834:12;20827:19;;20620:232;;;:::o;20861:326::-;;21021:67;21085:2;21080:3;21021:67;:::i;:::-;21014:74;;21121:28;21117:1;21112:3;21108:11;21101:49;21178:2;21173:3;21169:12;21162:19;;21007:180;;;:::o;21196:384::-;;21356:67;21420:2;21415:3;21356:67;:::i;:::-;21349:74;;21456:34;21452:1;21447:3;21443:11;21436:55;21525:17;21520:2;21515:3;21511:12;21504:39;21571:2;21566:3;21562:12;21555:19;;21342:238;;;:::o;21589:370::-;;21749:67;21813:2;21808:3;21749:67;:::i;:::-;21742:74;;21849:34;21845:1;21840:3;21836:11;21829:55;21918:3;21913:2;21908:3;21904:12;21897:25;21950:2;21945:3;21941:12;21934:19;;21735:224;;;:::o;21968:386::-;;22128:67;22192:2;22187:3;22128:67;:::i;:::-;22121:74;;22228:34;22224:1;22219:3;22215:11;22208:55;22297:19;22292:2;22287:3;22283:12;22276:41;22345:2;22340:3;22336:12;22329:19;;22114:240;;;:::o;22363:329::-;;22523:67;22587:2;22582:3;22523:67;:::i;:::-;22516:74;;22623:31;22619:1;22614:3;22610:11;22603:52;22683:2;22678:3;22674:12;22667:19;;22509:183;;;:::o;22701:370::-;;22861:67;22925:2;22920:3;22861:67;:::i;:::-;22854:74;;22961:34;22957:1;22952:3;22948:11;22941:55;23030:3;23025:2;23020:3;23016:12;23009:25;23062:2;23057:3;23053:12;23046:19;;22847:224;;;:::o;23080:371::-;;23240:67;23304:2;23299:3;23240:67;:::i;:::-;23233:74;;23340:34;23336:1;23331:3;23327:11;23320:55;23409:4;23404:2;23399:3;23395:12;23388:26;23442:2;23437:3;23433:12;23426:19;;23226:225;;;:::o;23460:323::-;;23620:67;23684:2;23679:3;23620:67;:::i;:::-;23613:74;;23720:25;23716:1;23711:3;23707:11;23700:46;23774:2;23769:3;23765:12;23758:19;;23606:177;;;:::o;23791:103::-;23864:24;23882:5;23864:24;:::i;:::-;23859:3;23852:37;23846:48;;:::o;23901:113::-;23984:24;24002:5;23984:24;:::i;:::-;23979:3;23972:37;23966:48;;:::o;24021:271::-;;24174:93;24263:3;24254:6;24174:93;:::i;:::-;24167:100;;24284:3;24277:10;;24155:137;;;;:::o;24299:273::-;;24453:94;24543:3;24534:6;24453:94;:::i;:::-;24446:101;;24564:3;24557:10;;24434:138;;;;:::o;24579:436::-;;24782:95;24873:3;24864:6;24782:95;:::i;:::-;24775:102;;24895:95;24986:3;24977:6;24895:95;:::i;:::-;24888:102;;25007:3;25000:10;;24763:252;;;;;:::o;25022:222::-;;25149:2;25138:9;25134:18;25126:26;;25163:71;25231:1;25220:9;25216:17;25207:6;25163:71;:::i;:::-;25120:124;;;;:::o;25251:672::-;;25496:3;25485:9;25481:19;25473:27;;25511:87;25595:1;25584:9;25580:17;25571:6;25511:87;:::i;:::-;25609:72;25677:2;25666:9;25662:18;25653:6;25609:72;:::i;:::-;25692;25760:2;25749:9;25745:18;25736:6;25692:72;:::i;:::-;25812:9;25806:4;25802:20;25797:2;25786:9;25782:18;25775:48;25837:76;25908:4;25899:6;25837:76;:::i;:::-;25829:84;;25467:456;;;;;;;:::o;25930:548::-;;26141:2;26130:9;26126:18;26118:26;;26155:79;26231:1;26220:9;26216:17;26207:6;26155:79;:::i;:::-;26245:72;26313:2;26302:9;26298:18;26289:6;26245:72;:::i;:::-;26365:9;26359:4;26355:20;26350:2;26339:9;26335:18;26328:48;26390:78;26463:4;26454:6;26390:78;:::i;:::-;26382:86;;26112:366;;;;;;:::o;26485:410::-;;26682:2;26671:9;26667:18;26659:26;;26732:9;26726:4;26722:20;26718:1;26707:9;26703:17;26696:47;26757:128;26880:4;26871:6;26757:128;:::i;:::-;26749:136;;26653:242;;;;:::o;26902:370::-;;27079:2;27068:9;27064:18;27056:26;;27129:9;27123:4;27119:20;27115:1;27104:9;27100:17;27093:47;27154:108;27257:4;27248:6;27154:108;:::i;:::-;27146:116;;27050:222;;;;:::o;27279:210::-;;27400:2;27389:9;27385:18;27377:26;;27414:65;27476:1;27465:9;27461:17;27452:6;27414:65;:::i;:::-;27371:118;;;;:::o;27496:310::-;;27643:2;27632:9;27628:18;27620:26;;27693:9;27687:4;27683:20;27679:1;27668:9;27664:17;27657:47;27718:78;27791:4;27782:6;27718:78;:::i;:::-;27710:86;;27614:192;;;;:::o;27813:304::-;;27957:2;27946:9;27942:18;27934:26;;28007:9;28001:4;27997:20;27993:1;27982:9;27978:17;27971:47;28032:75;28102:4;28093:6;28032:75;:::i;:::-;28024:83;;27928:189;;;;:::o;28124:416::-;;28324:2;28313:9;28309:18;28301:26;;28374:9;28368:4;28364:20;28360:1;28349:9;28345:17;28338:47;28399:131;28525:4;28399:131;:::i;:::-;28391:139;;28295:245;;;:::o;28547:416::-;;28747:2;28736:9;28732:18;28724:26;;28797:9;28791:4;28787:20;28783:1;28772:9;28768:17;28761:47;28822:131;28948:4;28822:131;:::i;:::-;28814:139;;28718:245;;;:::o;28970:416::-;;29170:2;29159:9;29155:18;29147:26;;29220:9;29214:4;29210:20;29206:1;29195:9;29191:17;29184:47;29245:131;29371:4;29245:131;:::i;:::-;29237:139;;29141:245;;;:::o;29393:416::-;;29593:2;29582:9;29578:18;29570:26;;29643:9;29637:4;29633:20;29629:1;29618:9;29614:17;29607:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29564:245;;;:::o;29816:416::-;;30016:2;30005:9;30001:18;29993:26;;30066:9;30060:4;30056:20;30052:1;30041:9;30037:17;30030:47;30091:131;30217:4;30091:131;:::i;:::-;30083:139;;29987:245;;;:::o;30239:416::-;;30439:2;30428:9;30424:18;30416:26;;30489:9;30483:4;30479:20;30475:1;30464:9;30460:17;30453:47;30514:131;30640:4;30514:131;:::i;:::-;30506:139;;30410:245;;;:::o;30662:416::-;;30862:2;30851:9;30847:18;30839:26;;30912:9;30906:4;30902:20;30898:1;30887:9;30883:17;30876:47;30937:131;31063:4;30937:131;:::i;:::-;30929:139;;30833:245;;;:::o;31085:416::-;;31285:2;31274:9;31270:18;31262:26;;31335:9;31329:4;31325:20;31321:1;31310:9;31306:17;31299:47;31360:131;31486:4;31360:131;:::i;:::-;31352:139;;31256:245;;;:::o;31508:416::-;;31708:2;31697:9;31693:18;31685:26;;31758:9;31752:4;31748:20;31744:1;31733:9;31729:17;31722:47;31783:131;31909:4;31783:131;:::i;:::-;31775:139;;31679:245;;;:::o;31931:416::-;;32131:2;32120:9;32116:18;32108:26;;32181:9;32175:4;32171:20;32167:1;32156:9;32152:17;32145:47;32206:131;32332:4;32206:131;:::i;:::-;32198:139;;32102:245;;;:::o;32354:416::-;;32554:2;32543:9;32539:18;32531:26;;32604:9;32598:4;32594:20;32590:1;32579:9;32575:17;32568:47;32629:131;32755:4;32629:131;:::i;:::-;32621:139;;32525:245;;;:::o;32777:416::-;;32977:2;32966:9;32962:18;32954:26;;33027:9;33021:4;33017:20;33013:1;33002:9;32998:17;32991:47;33052:131;33178:4;33052:131;:::i;:::-;33044:139;;32948:245;;;:::o;33200:416::-;;33400:2;33389:9;33385:18;33377:26;;33450:9;33444:4;33440:20;33436:1;33425:9;33421:17;33414:47;33475:131;33601:4;33475:131;:::i;:::-;33467:139;;33371:245;;;:::o;33623:416::-;;33823:2;33812:9;33808:18;33800:26;;33873:9;33867:4;33863:20;33859:1;33848:9;33844:17;33837:47;33898:131;34024:4;33898:131;:::i;:::-;33890:139;;33794:245;;;:::o;34046:416::-;;34246:2;34235:9;34231:18;34223:26;;34296:9;34290:4;34286:20;34282:1;34271:9;34267:17;34260:47;34321:131;34447:4;34321:131;:::i;:::-;34313:139;;34217:245;;;:::o;34469:416::-;;34669:2;34658:9;34654:18;34646:26;;34719:9;34713:4;34709:20;34705:1;34694:9;34690:17;34683:47;34744:131;34870:4;34744:131;:::i;:::-;34736:139;;34640:245;;;:::o;34892:416::-;;35092:2;35081:9;35077:18;35069:26;;35142:9;35136:4;35132:20;35128:1;35117:9;35113:17;35106:47;35167:131;35293:4;35167:131;:::i;:::-;35159:139;;35063:245;;;:::o;35315:416::-;;35515:2;35504:9;35500:18;35492:26;;35565:9;35559:4;35555:20;35551:1;35540:9;35536:17;35529:47;35590:131;35716:4;35590:131;:::i;:::-;35582:139;;35486:245;;;:::o;35738:416::-;;35938:2;35927:9;35923:18;35915:26;;35988:9;35982:4;35978:20;35974:1;35963:9;35959:17;35952:47;36013:131;36139:4;36013:131;:::i;:::-;36005:139;;35909:245;;;:::o;36161:416::-;;36361:2;36350:9;36346:18;36338:26;;36411:9;36405:4;36401:20;36397:1;36386:9;36382:17;36375:47;36436:131;36562:4;36436:131;:::i;:::-;36428:139;;36332:245;;;:::o;36584:416::-;;36784:2;36773:9;36769:18;36761:26;;36834:9;36828:4;36824:20;36820:1;36809:9;36805:17;36798:47;36859:131;36985:4;36859:131;:::i;:::-;36851:139;;36755:245;;;:::o;37007:416::-;;37207:2;37196:9;37192:18;37184:26;;37257:9;37251:4;37247:20;37243:1;37232:9;37228:17;37221:47;37282:131;37408:4;37282:131;:::i;:::-;37274:139;;37178:245;;;:::o;37430:416::-;;37630:2;37619:9;37615:18;37607:26;;37680:9;37674:4;37670:20;37666:1;37655:9;37651:17;37644:47;37705:131;37831:4;37705:131;:::i;:::-;37697:139;;37601:245;;;:::o;37853:416::-;;38053:2;38042:9;38038:18;38030:26;;38103:9;38097:4;38093:20;38089:1;38078:9;38074:17;38067:47;38128:131;38254:4;38128:131;:::i;:::-;38120:139;;38024:245;;;:::o;38276:416::-;;38476:2;38465:9;38461:18;38453:26;;38526:9;38520:4;38516:20;38512:1;38501:9;38497:17;38490:47;38551:131;38677:4;38551:131;:::i;:::-;38543:139;;38447:245;;;:::o;38699:416::-;;38899:2;38888:9;38884:18;38876:26;;38949:9;38943:4;38939:20;38935:1;38924:9;38920:17;38913:47;38974:131;39100:4;38974:131;:::i;:::-;38966:139;;38870:245;;;:::o;39122:416::-;;39322:2;39311:9;39307:18;39299:26;;39372:9;39366:4;39362:20;39358:1;39347:9;39343:17;39336:47;39397:131;39523:4;39397:131;:::i;:::-;39389:139;;39293:245;;;:::o;39545:416::-;;39745:2;39734:9;39730:18;39722:26;;39795:9;39789:4;39785:20;39781:1;39770:9;39766:17;39759:47;39820:131;39946:4;39820:131;:::i;:::-;39812:139;;39716:245;;;:::o;39968:416::-;;40168:2;40157:9;40153:18;40145:26;;40218:9;40212:4;40208:20;40204:1;40193:9;40189:17;40182:47;40243:131;40369:4;40243:131;:::i;:::-;40235:139;;40139:245;;;:::o;40391:416::-;;40591:2;40580:9;40576:18;40568:26;;40641:9;40635:4;40631:20;40627:1;40616:9;40612:17;40605:47;40666:131;40792:4;40666:131;:::i;:::-;40658:139;;40562:245;;;:::o;40814:416::-;;41014:2;41003:9;40999:18;40991:26;;41064:9;41058:4;41054:20;41050:1;41039:9;41035:17;41028:47;41089:131;41215:4;41089:131;:::i;:::-;41081:139;;40985:245;;;:::o;41237:222::-;;41364:2;41353:9;41349:18;41341:26;;41378:71;41446:1;41435:9;41431:17;41422:6;41378:71;:::i;:::-;41335:124;;;;:::o;41466:256::-;;41528:2;41522:9;41512:19;;41566:4;41558:6;41554:17;41665:6;41653:10;41650:22;41629:18;41617:10;41614:34;41611:62;41608:2;;;41686:1;41683;41676:12;41608:2;41706:10;41702:2;41695:22;41506:216;;;;:::o;41729:321::-;;41872:18;41864:6;41861:30;41858:2;;;41904:1;41901;41894:12;41858:2;41971:4;41967:9;41960:4;41952:6;41948:17;41944:33;41936:41;;42035:4;42029;42025:15;42017:23;;41795:255;;;:::o;42057:322::-;;42201:18;42193:6;42190:30;42187:2;;;42233:1;42230;42223:12;42187:2;42300:4;42296:9;42289:4;42281:6;42277:17;42273:33;42265:41;;42364:4;42358;42354:15;42346:23;;42124:255;;;:::o;42386:161::-;;42482:3;42474:11;;42520:4;42515:3;42511:14;42503:22;;42468:79;;;:::o;42554:151::-;;42640:3;42632:11;;42678:4;42673:3;42669:14;42661:22;;42626:79;;;:::o;42712:161::-;;42783:3;42775:11;;42820:3;42817:1;42810:14;42852:4;42849:1;42839:18;42831:26;;42769:104;;;:::o;42880:158::-;;42948:3;42940:11;;42985:3;42982:1;42975:14;43017:4;43014:1;43004:18;42996:26;;42934:104;;;:::o;43045:147::-;;43164:5;43158:12;43148:22;;43129:63;;;:::o;43199:137::-;;43308:5;43302:12;43292:22;;43273:63;;;:::o;43343:121::-;;43436:5;43430:12;43420:22;;43401:63;;;:::o;43471:122::-;;43565:5;43559:12;43549:22;;43530:63;;;:::o;43600:118::-;;43708:4;43703:3;43699:14;43691:22;;43685:33;;;:::o;43725:108::-;;43823:4;43818:3;43814:14;43806:22;;43800:33;;;:::o;43841:188::-;;43981:6;43976:3;43969:19;44018:4;44013:3;44009:14;43994:29;;43962:67;;;;:::o;44038:178::-;;44168:6;44163:3;44156:19;44205:4;44200:3;44196:14;44181:29;;44149:67;;;;:::o;44225:162::-;;44339:6;44334:3;44327:19;44376:4;44371:3;44367:14;44352:29;;44320:67;;;;:::o;44396:144::-;;44531:3;44516:18;;44509:31;;;;:::o;44549:153::-;;44654:6;44649:3;44642:19;44691:4;44686:3;44682:14;44667:29;;44635:67;;;;:::o;44711:163::-;;44826:6;44821:3;44814:19;44863:4;44858:3;44854:14;44839:29;;44807:67;;;;:::o;44883:145::-;;45019:3;45004:18;;44997:31;;;;:::o;45036:91::-;;45098:24;45116:5;45098:24;:::i;:::-;45087:35;;45081:46;;;:::o;45134:99::-;;45204:24;45222:5;45204:24;:::i;:::-;45193:35;;45187:46;;;:::o;45240:85::-;;45313:5;45306:13;45299:21;45288:32;;45282:43;;;:::o;45332:72::-;;45394:5;45383:16;;45377:27;;;:::o;45411:144::-;;45483:66;45476:5;45472:78;45461:89;;45455:100;;;:::o;45562:121::-;;45635:42;45628:5;45624:54;45613:65;;45607:76;;;:::o;45690:72::-;;45752:5;45741:16;;45735:27;;;:::o;45769:129::-;;45856:37;45887:5;45856:37;:::i;:::-;45843:50;;45837:61;;;:::o;45905:121::-;;45984:37;46015:5;45984:37;:::i;:::-;45971:50;;45965:61;;;:::o;46033:108::-;;46112:24;46130:5;46112:24;:::i;:::-;46099:37;;46093:48;;;:::o;46149:145::-;46230:6;46225:3;46220;46207:30;46286:1;46277:6;46272:3;46268:16;46261:27;46200:94;;;:::o;46303:268::-;46368:1;46375:101;46389:6;46386:1;46383:13;46375:101;;;46465:1;46460:3;46456:11;46450:18;46446:1;46441:3;46437:11;46430:39;46411:2;46408:1;46404:10;46399:15;;46375:101;;;46491:6;46488:1;46485:13;46482:2;;;46556:1;46547:6;46542:3;46538:16;46531:27;46482:2;46352:219;;;;:::o;46579:97::-;;46667:2;46663:7;46658:2;46651:5;46647:14;46643:28;46633:38;;46627:49;;;:::o;46684:117::-;46753:24;46771:5;46753:24;:::i;:::-;46746:5;46743:35;46733:2;;46792:1;46789;46782:12;46733:2;46727:74;:::o;46808:111::-;46874:21;46889:5;46874:21;:::i;:::-;46867:5;46864:32;46854:2;;46910:1;46907;46900:12;46854:2;46848:71;:::o;46926:117::-;46995:24;47013:5;46995:24;:::i;:::-;46988:5;46985:35;46975:2;;47034:1;47031;47024:12;46975:2;46969:74;:::o;47050:115::-;47118:23;47135:5;47118:23;:::i;:::-;47111:5;47108:34;47098:2;;47156:1;47153;47146:12;47098:2;47092:73;:::o;47172:117::-;47241:24;47259:5;47241:24;:::i;:::-;47234:5;47231:35;47221:2;;47280:1;47277;47270:12;47221:2;47215:74;:::o
Swarm Source
ipfs://4efaa42e83b36f3247841b0621a5c7c833f944731b721a349fbaf4238762e70d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.