- Contract name:
- Periphery
- Optimization enabled
- true
- Compiler version
- v0.8.10+commit.fc410830
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-07-26T12:58:22.151272Z
Contract source code
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; library DataTypes { struct MigrateData { address account; string handle; string uri; address[] toAddresses; bytes32 linkType; } struct CreateCharacterData { address to; string handle; string uri; address linkModule; bytes linkModuleInitData; } struct createThenLinkCharacterData { uint256 fromCharacterId; address to; bytes32 linkType; } struct linkNoteData { uint256 fromCharacterId; uint256 toCharacterId; uint256 toNoteId; bytes32 linkType; bytes data; } struct unlinkNoteData { uint256 fromCharacterId; uint256 toCharacterId; uint256 toNoteId; bytes32 linkType; } struct linkCharacterData { uint256 fromCharacterId; uint256 toCharacterId; bytes32 linkType; bytes data; } struct unlinkCharacterData { uint256 fromCharacterId; uint256 toCharacterId; bytes32 linkType; } struct linkERC721Data { uint256 fromCharacterId; address tokenAddress; uint256 tokenId; bytes32 linkType; bytes data; } struct unlinkERC721Data { uint256 fromCharacterId; address tokenAddress; uint256 tokenId; bytes32 linkType; } struct linkAddressData { uint256 fromCharacterId; address ethAddress; bytes32 linkType; bytes data; } struct unlinkAddressData { uint256 fromCharacterId; address ethAddress; bytes32 linkType; } struct linkAnyUriData { uint256 fromCharacterId; string toUri; bytes32 linkType; bytes data; } struct unlinkAnyUriData { uint256 fromCharacterId; string toUri; bytes32 linkType; } struct linkLinklistData { uint256 fromCharacterId; uint256 toLinkListId; bytes32 linkType; bytes data; } struct unlinkLinklistData { uint256 fromCharacterId; uint256 toLinkListId; bytes32 linkType; } struct setLinkModule4CharacterData { uint256 characterId; address linkModule; bytes linkModuleInitData; } struct setLinkModule4NoteData { uint256 characterId; uint256 noteId; address linkModule; bytes linkModuleInitData; } struct setLinkModule4LinklistData { uint256 linklistId; address linkModule; bytes linkModuleInitData; } struct setLinkModule4ERC721Data { address tokenAddress; uint256 tokenId; address linkModule; bytes linkModuleInitData; } struct setLinkModule4AddressData { address account; address linkModule; bytes linkModuleInitData; } struct setMintModule4NoteData { uint256 characterId; uint256 noteId; address mintModule; bytes mintModuleInitData; } struct linkCharactersInBatchData { uint256 fromCharacterId; uint256[] toCharacterIds; bytes[] data; address[] toAddresses; bytes32 linkType; } struct LinkData { uint256 linklistId; uint256 linkItemType; uint256 linkingCharacterId; address linkingAddress; uint256 linkingLinklistId; bytes32 linkKey; } struct PostNoteData { uint256 characterId; string contentUri; address linkModule; bytes linkModuleInitData; address mintModule; bytes mintModuleInitData; bool locked; } struct MintNoteData { uint256 characterId; uint256 noteId; address to; bytes mintModuleData; } // character struct struct Character { uint256 characterId; string handle; string uri; uint256 noteCount; address socialToken; address linkModule; } // note struct struct Note { bytes32 linkItemType; // type of note with link bytes32 linkKey; // if linkKey is not empty, it is a note with link string contentUri; address linkModule; address mintModule; address mintNFT; bool deleted; bool locked; } struct CharacterLinkStruct { uint256 fromCharacterId; uint256 toCharacterId; bytes32 linkType; } struct NoteStruct { uint256 characterId; uint256 noteId; } struct ERC721Struct { address tokenAddress; uint256 erc721TokenId; } } interface IWeb3Entry { function initialize( string calldata _name, string calldata _symbol, address _linklistContract, address _mintNFTImpl, address _periphery, address resolver ) external; function createCharacter(DataTypes.CreateCharacterData calldata vars) external; function setHandle(uint256 characterId, string calldata newHandle) external; function setSocialToken(uint256 characterId, address tokenAddress) external; function setCharacterUri(uint256 characterId, string calldata newUri) external; function setPrimaryCharacterId(uint256 characterId) external; function setOperator(uint256 characterId, address operator) external; function setLinklistUri(uint256 linkListId, string calldata uri) external; function linkAddress(DataTypes.linkAddressData calldata vars) external; function unlinkAddress(DataTypes.unlinkAddressData calldata vars) external; function linkCharacter(DataTypes.linkCharacterData calldata vars) external; function unlinkCharacter(DataTypes.unlinkCharacterData calldata vars) external; function createThenLinkCharacter(DataTypes.createThenLinkCharacterData calldata vars) external; function linkNote(DataTypes.linkNoteData calldata vars) external; function unlinkNote(DataTypes.unlinkNoteData calldata vars) external; function linkERC721(DataTypes.linkERC721Data calldata vars) external; function unlinkERC721(DataTypes.unlinkERC721Data calldata vars) external; function linkAnyUri(DataTypes.linkAnyUriData calldata vars) external; function unlinkAnyUri(DataTypes.unlinkAnyUriData calldata vars) external; /* function linkCharacterLink( uint256 fromCharacterId, DataTypes.CharacterLinkStruct calldata linkData, bytes32 linkType ) external; function unlinkCharacterLink( uint256 fromCharacterId, DataTypes.CharacterLinkStruct calldata linkData, bytes32 linkType ) external; */ function linkLinklist(DataTypes.linkLinklistData calldata vars) external; function unlinkLinklist(DataTypes.unlinkLinklistData calldata vars) external; function setLinkModule4Character(DataTypes.setLinkModule4CharacterData calldata vars) external; function setLinkModule4Note(DataTypes.setLinkModule4NoteData calldata vars) external; function setLinkModule4Linklist(DataTypes.setLinkModule4LinklistData calldata vars) external; function setLinkModule4ERC721(DataTypes.setLinkModule4ERC721Data calldata vars) external; function setLinkModule4Address(DataTypes.setLinkModule4AddressData calldata vars) external; function mintNote(DataTypes.MintNoteData calldata vars) external returns (uint256); function setMintModule4Note(DataTypes.setMintModule4NoteData calldata vars) external; function postNote(DataTypes.PostNoteData calldata vars) external returns (uint256); function setNoteUri( uint256 characterId, uint256 noteId, string calldata newUri ) external; function lockNote(uint256 characterId, uint256 noteId) external; function deleteNote(uint256 characterId, uint256 noteId) external; function postNote4Character(DataTypes.PostNoteData calldata postNoteData, uint256 toCharacterId) external returns (uint256); function postNote4Address(DataTypes.PostNoteData calldata noteData, address ethAddress) external returns (uint256); function postNote4Linklist(DataTypes.PostNoteData calldata noteData, uint256 toLinklistId) external returns (uint256); function postNote4Note( DataTypes.PostNoteData calldata postNoteData, DataTypes.NoteStruct calldata note ) external returns (uint256); function postNote4ERC721( DataTypes.PostNoteData calldata postNoteData, DataTypes.ERC721Struct calldata erc721 ) external returns (uint256); function postNote4AnyUri(DataTypes.PostNoteData calldata postNoteData, string calldata uri) external returns (uint256); function getPrimaryCharacterId(address account) external view returns (uint256); function isPrimaryCharacter(uint256 characterId) external view returns (bool); function getCharacter(uint256 characterId) external view returns (DataTypes.Character memory); function getCharacterByHandle(string calldata handle) external view returns (DataTypes.Character memory); function getHandle(uint256 characterId) external view returns (string memory); function getCharacterUri(uint256 characterId) external view returns (string memory); function getOperator(uint256 characterId) external view returns (address); function getNote(uint256 characterId, uint256 noteId) external view returns (DataTypes.Note memory); function getLinkModule4Address(address account) external view returns (address); function getLinkModule4Linklist(uint256 tokenId) external view returns (address); function getLinkModule4ERC721(address tokenAddress, uint256 tokenId) external view returns (address); function getLinklistUri(uint256 tokenId) external view returns (string memory); function getLinklistId(uint256 characterId, bytes32 linkType) external view returns (uint256); function getLinklistType(uint256 linkListId) external view returns (bytes32); function getLinklistContract() external view returns (address); function getRevision() external pure returns (uint256); } interface ILinklist { function mint( address to, bytes32 linkType, uint256 tokenId ) external; function setTakeOver( uint256 tokenId, address to, uint256 characterId ) external; function setUri(uint256 tokenId, string memory uri) external; ///////////////////////////////// // linking Character ///////////////////////////////// function addLinkingCharacterId(uint256 tokenId, uint256 toCharacterId) external; function removeLinkingCharacterId(uint256 tokenId, uint256 toCharacterId) external; function getLinkingCharacterIds(uint256 tokenId) external view returns (uint256[] memory); function getLinkingCharacterListLength(uint256 tokenId) external view returns (uint256); ///////////////////////////////// // linking Note ///////////////////////////////// function addLinkingNote( uint256 tokenId, uint256 toCharacterId, uint256 toNoteId ) external returns (bytes32); function removeLinkingNote( uint256 tokenId, uint256 toCharacterId, uint256 toNoteId ) external; function getLinkingNotes(uint256 tokenId) external view returns (DataTypes.NoteStruct[] memory results); function getLinkingNote(bytes32 linkKey) external view returns (DataTypes.NoteStruct memory); function getLinkingNoteListLength(uint256 tokenId) external view returns (uint256); function addLinkingCharacterLink( uint256 tokenId, DataTypes.CharacterLinkStruct calldata linkData ) external; function removeLinkingCharacterLink( uint256 tokenId, DataTypes.CharacterLinkStruct calldata linkData ) external; function getLinkingCharacterLinks(uint256 tokenId) external view returns (DataTypes.CharacterLinkStruct[] memory results); function getLinkingCharacterLink(bytes32 linkKey) external view returns (DataTypes.CharacterLinkStruct memory); function getLinkingCharacterLinkListLength(uint256 tokenId) external view returns (uint256); ///////////////////////////////// // linking ERC721 ///////////////////////////////// function addLinkingERC721( uint256 tokenId, address tokenAddress, uint256 erc721TokenId ) external returns (bytes32); function removeLinkingERC721( uint256 tokenId, address tokenAddress, uint256 erc721TokenId ) external; function getLinkingERC721s(uint256 tokenId) external view returns (DataTypes.ERC721Struct[] memory results); function getLinkingERC721(bytes32 linkKey) external view returns (DataTypes.ERC721Struct memory); function getLinkingERC721ListLength(uint256 tokenId) external view returns (uint256); ///////////////////////////////// // linking Address ///////////////////////////////// function addLinkingAddress(uint256 tokenId, address ethAddress) external; function removeLinkingAddress(uint256 tokenId, address ethAddress) external; function getLinkingAddresses(uint256 tokenId) external view returns (address[] memory); function getLinkingAddressListLength(uint256 tokenId) external view returns (uint256); ///////////////////////////////// // linking Any ///////////////////////////////// function addLinkingAnyUri(uint256 tokenId, string memory toUri) external returns (bytes32); function removeLinkingAnyUri(uint256 tokenId, string memory toUri) external; function getLinkingAnyUris(uint256 tokenId) external view returns (string[] memory results); function getLinkingAnyUri(bytes32 linkKey) external view returns (string memory); function getLinkingAnyListLength(uint256 tokenId) external view returns (uint256); ///////////////////////////////// // linking Linklist ///////////////////////////////// function addLinkingLinklistId(uint256 tokenId, uint256 linklistId) external; function removeLinkingLinklistId(uint256 tokenId, uint256 linklistId) external; function getLinkingLinklistIds(uint256 tokenId) external view returns (uint256[] memory); function getLinkingLinklistLength(uint256 tokenId) external view returns (uint256); function getCurrentTakeOver(uint256 tokenId) external view returns (uint256); function getLinkType(uint256 tokenId) external view returns (bytes32); function Uri(uint256 tokenId) external view returns (string memory); } // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.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); } /** * @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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev 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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. // We also know that `k`, the position of the most significant bit, is such that `msb(a) = 2**k`. // This gives `2**k < a <= 2**(k+1)` → `2**(k/2) <= sqrt(a) < 2 ** (k/2+1)`. // Using an algorithm similar to the msb computation, we are able to compute `result = 2**(k/2)` which is a // good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1; uint256 x = a; if (x >> 128 > 0) { x >>= 128; result <<= 64; } if (x >> 64 > 0) { x >>= 64; result <<= 32; } if (x >> 32 > 0) { x >>= 32; result <<= 16; } if (x >> 16 > 0) { x >>= 16; result <<= 8; } if (x >> 8 > 0) { x >>= 8; result <<= 4; } if (x >> 4 > 0) { x >>= 4; result <<= 2; } if (x >> 2 > 0) { result <<= 1; } // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { uint256 result = sqrt(a); if (rounding == Rounding.Up && result * result < a) { result += 1; } return result; } } contract Periphery is Initializable { address public web3Entry; bool private linklistInitialized; address public linklist; function initialize(address _web3Entry, address _linklist) external initializer { web3Entry = _web3Entry; linklist = _linklist; } function getNotesByCharacterId( uint256 characterId, uint256 offset, uint256 limit ) external view returns (DataTypes.Note[] memory results) { uint256 count = IWeb3Entry(web3Entry).getCharacter(characterId).noteCount; limit = Math.min(limit, count - offset); results = new DataTypes.Note[](limit); if (offset >= count) return results; for (uint256 i = offset; i < offset + limit; i++) { results[i - offset] = IWeb3Entry(web3Entry).getNote(characterId, i); } } function getLinkingCharacterIds(uint256 fromCharacterId, bytes32 linkType) external view returns (uint256[] memory results) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); uint256[] memory linkingCharacterIds = ILinklist(linklist).getLinkingCharacterIds( linklistId ); uint256 len = linkingCharacterIds.length; uint256 count; for (uint256 i = 0; i < len; i++) { if (characterExists(linkingCharacterIds[i])) { count++; } } results = new uint256[](count); uint256 j; for (uint256 i = 0; i < len; i++) { if (characterExists(linkingCharacterIds[i])) { results[j] = linkingCharacterIds[i]; j++; } } } function getLinkingCharacterId(bytes32 linkKey) external pure returns (uint256 characterId) { characterId = uint256(linkKey); } function getLinkingNotes(uint256 fromCharacterId, bytes32 linkType) external view returns (DataTypes.Note[] memory results) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); DataTypes.NoteStruct[] memory notes = ILinklist(linklist).getLinkingNotes(linklistId); results = new DataTypes.Note[](notes.length); for (uint256 i = 0; i < notes.length; i++) { results[i] = IWeb3Entry(web3Entry).getNote(notes[i].characterId, notes[i].noteId); } } function getLinkingNote(bytes32 linkKey) external view returns (DataTypes.NoteStruct memory) { return ILinklist(linklist).getLinkingNote(linkKey); } function getLinkingERC721s(uint256 fromCharacterId, bytes32 linkType) external view returns (DataTypes.ERC721Struct[] memory results) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); return ILinklist(linklist).getLinkingERC721s(linklistId); } function getLinkingERC721(bytes32 linkKey) external view returns (DataTypes.ERC721Struct memory) { return ILinklist(linklist).getLinkingERC721(linkKey); } function getLinkingAnyUris(uint256 fromCharacterId, bytes32 linkType) external view returns (string[] memory results) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); return ILinklist(linklist).getLinkingAnyUris(linklistId); } function getLinkingAnyUri(bytes32 linkKey) external view returns (string memory) { return ILinklist(linklist).getLinkingAnyUri(linkKey); } function getLinkingAddresses(uint256 fromCharacterId, bytes32 linkType) external view returns (address[] memory) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); return ILinklist(linklist).getLinkingAddresses(linklistId); } function getLinkingAddress(bytes32 linkKey) external pure returns (address) { return address(uint160(uint256(linkKey))); } function getLinkingLinklistIds(uint256 fromCharacterId, bytes32 linkType) external view returns (uint256[] memory linklistIds) { uint256 linklistId = IWeb3Entry(web3Entry).getLinklistId(fromCharacterId, linkType); return ILinklist(linklist).getLinkingLinklistIds(linklistId); } function getLinkingLinklistId(bytes32 linkKey) external pure returns (uint256 linklistId) { linklistId = uint256(linkKey); } function characterExists(uint256 characterId) internal view returns (bool) { return IWeb3Entry(web3Entry).getCharacter(characterId).characterId != 0; } function linkCharactersInBatch(DataTypes.linkCharactersInBatchData calldata vars) external { require(vars.toCharacterIds.length == vars.data.length, "ArrayLengthMismatch"); for (uint256 i = 0; i < vars.toCharacterIds.length; i++) { IWeb3Entry(web3Entry).linkCharacter( DataTypes.linkCharacterData({ fromCharacterId: vars.fromCharacterId, toCharacterId: vars.toCharacterIds[i], linkType: vars.linkType, data: vars.data[i] }) ); } for (uint256 i = 0; i < vars.toAddresses.length; i++) { IWeb3Entry(web3Entry).createThenLinkCharacter( DataTypes.createThenLinkCharacterData({ fromCharacterId: vars.fromCharacterId, to: vars.toAddresses[i], linkType: vars.linkType }) ); } } function sync( address account, string calldata handle, string calldata uri, address[] calldata toAddresses, bytes32 linkType ) external { _migrate(account, handle, uri, toAddresses, linkType); } function migrate(DataTypes.MigrateData calldata vars) external { _migrate(vars.account, vars.handle, vars.uri, vars.toAddresses, vars.linkType); } function _migrate( address account, string memory handle, string memory uri, address[] memory toAddresses, bytes32 linkType ) internal { uint256 fromProfileId = IWeb3Entry(web3Entry).getPrimaryCharacterId(account); if (fromProfileId == 0) { // create character first IWeb3Entry(web3Entry).createCharacter( DataTypes.CreateCharacterData({ to: account, handle: handle, uri: uri, linkModule: address(0), linkModuleInitData: "" }) ); // get primary character id fromProfileId = IWeb3Entry(web3Entry).getPrimaryCharacterId(account); } else { // if (bytes(handle).length > 0) { // // set handle // IWeb3Entry(web3Entry).setHandle(fromProfileId, handle); // } if (bytes(uri).length > 0) { // set character uri IWeb3Entry(web3Entry).setCharacterUri(fromProfileId, uri); } } // link for (uint256 i = 0; i < toAddresses.length; i++) { uint256 toProfileId = IWeb3Entry(web3Entry).getPrimaryCharacterId(toAddresses[i]); if (toProfileId == 0) { IWeb3Entry(web3Entry).createThenLinkCharacter( DataTypes.createThenLinkCharacterData({ fromCharacterId: fromProfileId, to: toAddresses[i], linkType: linkType }) ); } else { IWeb3Entry(web3Entry).linkCharacter( DataTypes.linkCharacterData({ fromCharacterId: fromProfileId, toCharacterId: toProfileId, linkType: linkType, data: "" }) ); } } } }
Contract ABI
[{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"pure","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinkingAddress","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getLinkingAddresses","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getLinkingAnyUri","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string[]","name":"results","internalType":"string[]"}],"name":"getLinkingAnyUris","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}],"name":"getLinkingCharacterId","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"results","internalType":"uint256[]"}],"name":"getLinkingCharacterIds","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.ERC721Struct","components":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"erc721TokenId","internalType":"uint256"}]}],"name":"getLinkingERC721","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"results","internalType":"struct DataTypes.ERC721Struct[]","components":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"erc721TokenId","internalType":"uint256"}]}],"name":"getLinkingERC721s","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"linklistId","internalType":"uint256"}],"name":"getLinkingLinklistId","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"linklistIds","internalType":"uint256[]"}],"name":"getLinkingLinklistIds","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.NoteStruct","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]}],"name":"getLinkingNote","inputs":[{"type":"bytes32","name":"linkKey","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"results","internalType":"struct DataTypes.Note[]","components":[{"type":"bytes32","name":"linkItemType","internalType":"bytes32"},{"type":"bytes32","name":"linkKey","internalType":"bytes32"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"address","name":"mintNFT","internalType":"address"},{"type":"bool","name":"deleted","internalType":"bool"},{"type":"bool","name":"locked","internalType":"bool"}]}],"name":"getLinkingNotes","inputs":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"results","internalType":"struct DataTypes.Note[]","components":[{"type":"bytes32","name":"linkItemType","internalType":"bytes32"},{"type":"bytes32","name":"linkKey","internalType":"bytes32"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"address","name":"mintNFT","internalType":"address"},{"type":"bool","name":"deleted","internalType":"bool"},{"type":"bool","name":"locked","internalType":"bool"}]}],"name":"getNotesByCharacterId","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"offset","internalType":"uint256"},{"type":"uint256","name":"limit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"_web3Entry","internalType":"address"},{"type":"address","name":"_linklist","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkCharactersInBatch","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkCharactersInBatchData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256[]","name":"toCharacterIds","internalType":"uint256[]"},{"type":"bytes[]","name":"data","internalType":"bytes[]"},{"type":"address[]","name":"toAddresses","internalType":"address[]"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"linklist","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.MigrateData","components":[{"type":"address","name":"account","internalType":"address"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"address[]","name":"toAddresses","internalType":"address[]"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sync","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"address[]","name":"toAddresses","internalType":"address[]"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"web3Entry","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b5061272d806100206000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80635f799cc6116100ad578063d55a006011610071578063d55a0060146102cc578063d85d04f4146102b0578063dfc1e2bf146102df578063e1332272146102f2578063e3d244281461030b57600080fd5b80635f799cc61461023d5780635fb8652e1461025d57806362c3ed301461027057806376ae90ef146102905780638654af27146102b057600080fd5b80632c422599116100f45780632c422599146101b65780633e7cb539146101c9578063485cc955146101da5780634a7906b9146101ef5780635440522b1461021d57600080fd5b806306bee8d4146101265780630f9b729c146101565780631964a421146101765780632260c7d214610196575b600080fd5b600154610139906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610169610164366004611953565b61031e565b60405161014d91906119db565b610189610184366004611aa6565b6104e7565b60405161014d9190611ac8565b6101a96101a4366004611aa6565b6105e0565b60405161014d9190611b2a565b6101696101c4366004611aa6565b6106cf565b6101396101d7366004611b6e565b90565b6101ed6101e8366004611b9c565b61092a565b005b6102026101fd366004611b6e565b610a7b565b6040805182518152602092830151928101929092520161014d565b61023061022b366004611b6e565b610af9565b60405161014d9190611bd5565b61025061024b366004611b6e565b610b77565b60405161014d9190611bf5565b6101ed61026b366004611c50565b610be9565b61028361027e366004611aa6565b610c9a565b60405161014d9190611d35565b6102a361029e366004611aa6565b610d89565b60405161014d9190611d95565b6102be6101d7366004611b6e565b60405190815260200161014d565b6101ed6102da366004611dee565b610e78565b6101a96102ed366004611aa6565b611131565b600054610139906201000090046001600160a01b031681565b6101ed610319366004611dee565b61134b565b6000805460405163dabb053160e01b815260048101869052606092916201000090046001600160a01b03169063dabb053190602401600060405180830381865afa158015610370573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103989190810190611f50565b6060015190506103b1836103ac868461202c565b61142a565b9250826001600160401b038111156103cb576103cb611e22565b60405190808252806020026020018201604052801561040457816020015b6103f161190e565b8152602001906001900390816103e95790505b50915080841061041457506104e0565b835b6104208486612043565b8110156104dd576000546040516301b6923d60e71b81526004810188905260248101839052620100009091046001600160a01b03169063db491e8090604401600060405180830381865afa15801561047c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a4919081019061206b565b836104af878461202c565b815181106104bf576104bf612141565b602002602001018190525080806104d590612157565b915050610416565b50505b9392505050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610540573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105649190612172565b60015460405163732795d560e11b8152600481018390529192506001600160a01b03169063e64f2baa90602401600060405180830381865afa1580156105ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d691908101906121ae565b9150505b92915050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d9190612172565b60015460405163ed6223cf60e01b8152600481018390529192506001600160a01b03169063ed6223cf90602401600060405180830381865afa1580156106a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d69190810190612263565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074c9190612172565b600154604051635e9f678b60e01b8152600481018390529192506000916001600160a01b0390911690635e9f678b90602401600060405180830381865afa15801561079b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107c39190810190612323565b905080516001600160401b038111156107de576107de611e22565b60405190808252806020026020018201604052801561081757816020015b61080461190e565b8152602001906001900390816107fc5790505b50925060005b815181101561092157600060029054906101000a90046001600160a01b03166001600160a01b031663db491e8083838151811061085c5761085c612141565b60200260200101516000015184848151811061087a5761087a612141565b6020026020010151602001516040518363ffffffff1660e01b81526004016108ac929190918252602082015260400190565b600060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f1919081019061206b565b84828151811061090357610903612141565b6020026020010181905250808061091990612157565b91505061081d565b50505092915050565b600054610100900460ff161580801561094a5750600054600160ff909116105b806109645750303b158015610964575060005460ff166001145b6109cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ef576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038681169190910291909117909155600180546001600160a01b0319169184169190911790558015610a76576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b604080518082018252600080825260208201526001549151634a7906b960e01b81526004810184905290916001600160a01b031690634a7906b9906024016040805180830381865afa158015610ad5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da91906123b3565b604080518082018252600080825260208201526001549151635440522b60e01b81526004810184905290916001600160a01b031690635440522b906024016040805180830381865afa158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da919061240a565b600154604051632fbcce6360e11b8152600481018390526060916001600160a01b031690635f799cc690602401600060405180830381865afa158015610bc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105da9190810190612426565b610c908888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020808b0282810182019093528a82529093508a925089918291850190849080828437600092019190915250889250611440915050565b5050505050505050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d179190612172565b600154604051639037c0f960e01b8152600481018390529192506001600160a01b031690639037c0f990602401600060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d6919081019061245a565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e069190612172565b600154604051635c369ec360e01b8152600481018390529192506001600160a01b031690635c369ec390602401600060405180830381865afa158015610e50573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d691908101906124ea565b610e856040820182612578565b9050610e946020830183612578565b905014610ed95760405162461bcd60e51b8152602060048201526013602482015272082e4e4c2f298cadccee8d09ad2e6dac2e8c6d606b1b60448201526064016109c3565b60005b610ee96020830183612578565b905081101561102157600054604080516080810190915283358152620100009091046001600160a01b03169063188b04b390602080820190610f2d90870187612578565b86818110610f3d57610f3d612141565b90506020020135815260200185608001358152602001858060400190610f639190612578565b86818110610f7357610f73612141565b9050602002810190610f8591906125c1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e084901b168152610fdc9190600401612607565b600060405180830381600087803b158015610ff657600080fd5b505af115801561100a573d6000803e3d6000fd5b50505050808061101990612157565b915050610edc565b5060005b6110326060830183612578565b905081101561112d5760005460408051606080820190925284358152620100009092046001600160a01b03169163f6479d7791602082019061107690870187612578565b8681811061108657611086612141565b905060200201602081019061109b9190612640565b6001600160a01b0390811682526080870135602092830152604080516001600160e01b031960e087901b1681528451600482015292840151909116602483015291909101516044820152606401600060405180830381600087803b15801561110257600080fd5b505af1158015611116573d6000803e3d6000fd5b50505050808061112590612157565b915050611025565b5050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190612172565b60015460405163ba27f58d60e01b8152600481018390529192506000916001600160a01b039091169063ba27f58d90602401600060405180830381865afa1580156111fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112259190810190612263565b80519091506000805b8281101561127d5761125884828151811061124b5761124b612141565b602002602001015161188e565b1561126b578161126781612157565b9250505b8061127581612157565b91505061122e565b50806001600160401b0381111561129657611296611e22565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5094506000805b8381101561133f576112e385828151811061124b5761124b612141565b1561132d578481815181106112fa576112fa612141565b602002602001015187838151811061131457611314612141565b60209081029190910101528161132981612157565b9250505b8061133781612157565b9150506112c6565b50505050505092915050565b61142761135b6020830183612640565b61136860208401846125c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113aa9250505060408501856125c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113ec925050506060860186612578565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050506080860135611440565b50565b600081831061143957816104e0565b5090919050565b6000805460405163155e35fb60e11b81526001600160a01b0388811660048301526201000090920490911690632abc6bf690602401602060405180830381865afa158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190612172565b9050806115d757600080546040805160a0810182526001600160a01b038a8116825260208083018b90528284018a905260608301869052835190810184529485526080820194909452905163cd69fe6160e01b8152620100009092049092169163cd69fe6191611529919060040161265d565b600060405180830381600087803b15801561154357600080fd5b505af1158015611557573d6000803e3d6000fd5b505060005460405163155e35fb60e11b81526001600160a01b038a81166004830152620100009092049091169250632abc6bf69150602401602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190612172565b9050611648565b835115611648576000546040516347f94de760e01b8152620100009091046001600160a01b0316906347f94de79061161590849088906004016126de565b600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b505050505b60005b83518110156118855760008060029054906101000a90046001600160a01b03166001600160a01b0316632abc6bf686848151811061168b5761168b612141565b60200260200101516040518263ffffffff1660e01b81526004016116be91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156116db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ff9190612172565b9050806117df57600060029054906101000a90046001600160a01b03166001600160a01b031663f6479d77604051806060016040528086815260200188868151811061174d5761174d612141565b60200260200101516001600160a01b03168152602001878152506040518263ffffffff1660e01b81526004016117a89190815181526020808301516001600160a01b0316908201526040918201519181019190915260600190565b600060405180830381600087803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b50505050611872565b600080546040805160808101825286815260208082018690528183018990528251908101835293845260608101939093525163188b04b360e01b8152620100009091046001600160a01b03169163188b04b39161183f9190600401612607565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b505050505b508061187d81612157565b91505061164b565b50505050505050565b6000805460405163dabb053160e01b815260048101849052620100009091046001600160a01b03169063dabb053190602401600060405180830381865afa1580156118dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119059190810190611f50565b51151592915050565b604080516101008101825260008082526020820181905260609282018390529181018290526080810182905260a0810182905260c0810182905260e081019190915290565b60008060006060848603121561196857600080fd5b505081359360208301359350604090920135919050565b60005b8381101561199a578181015183820152602001611982565b838111156119a9576000848401525b50505050565b600081518084526119c781602086016020860161197f565b601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611a9857603f198984030185528151610100815185528882015189860152878201518189870152611a39828701826119af565b6060848101516001600160a01b039081169189019190915260808086015182169089015260a0808601519091169088015260c08085015115159088015260e0938401511515939096019290925250509386019390860190600101611a02565b509098975050505050505050565b60008060408385031215611ab957600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611b1d57603f19888603018452611b0b8583516119af565b94509285019290850190600101611aef565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611b6257835183529284019291840191600101611b46565b50909695505050505050565b600060208284031215611b8057600080fd5b5035919050565b6001600160a01b038116811461142757600080fd5b60008060408385031215611baf57600080fd5b8235611bba81611b87565b91506020830135611bca81611b87565b809150509250929050565b81516001600160a01b0316815260208083015190820152604081016105da565b6020815260006104e060208301846119af565b60008083601f840112611c1a57600080fd5b5081356001600160401b03811115611c3157600080fd5b602083019150836020828501011115611c4957600080fd5b9250929050565b60008060008060008060008060a0898b031215611c6c57600080fd5b8835611c7781611b87565b975060208901356001600160401b0380821115611c9357600080fd5b611c9f8c838d01611c08565b909950975060408b0135915080821115611cb857600080fd5b611cc48c838d01611c08565b909750955060608b0135915080821115611cdd57600080fd5b818b0191508b601f830112611cf157600080fd5b813581811115611d0057600080fd5b8c60208260051b8501011115611d1557600080fd5b602083019550809450505050608089013590509295985092959890939650565b602080825282518282018190526000919060409081850190868401855b82811015611d8857611d7884835180516001600160a01b03168252602090810151910152565b9284019290850190600101611d52565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611b625783516001600160a01b031683529284019291840191600101611db1565b600060a08284031215611de857600080fd5b50919050565b600060208284031215611e0057600080fd5b81356001600160401b03811115611e1657600080fd5b6105d684828501611dd6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715611e5a57611e5a611e22565b60405290565b60405161010081016001600160401b0381118282101715611e5a57611e5a611e22565b604080519081016001600160401b0381118282101715611e5a57611e5a611e22565b604051601f8201601f191681016001600160401b0381118282101715611ecd57611ecd611e22565b604052919050565b600082601f830112611ee657600080fd5b81516001600160401b03811115611eff57611eff611e22565b611f12601f8201601f1916602001611ea5565b818152846020838601011115611f2757600080fd5b611f3882602083016020870161197f565b949350505050565b8051611f4b81611b87565b919050565b600060208284031215611f6257600080fd5b81516001600160401b0380821115611f7957600080fd5b9083019060c08286031215611f8d57600080fd5b611f95611e38565b82518152602083015182811115611fab57600080fd5b611fb787828601611ed5565b602083015250604083015182811115611fcf57600080fd5b611fdb87828601611ed5565b60408301525060608301516060820152611ff760808401611f40565b608082015261200860a08401611f40565b60a082015295945050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561203e5761203e612016565b500390565b6000821982111561205657612056612016565b500190565b80518015158114611f4b57600080fd5b60006020828403121561207d57600080fd5b81516001600160401b038082111561209457600080fd5b9083019061010082860312156120a957600080fd5b6120b1611e60565b82518152602083015160208201526040830151828111156120d157600080fd5b6120dd87828601611ed5565b6040830152506120ef60608401611f40565b606082015261210060808401611f40565b608082015261211160a08401611f40565b60a082015261212260c0840161205b565b60c082015261213360e0840161205b565b60e082015295945050505050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561216b5761216b612016565b5060010190565b60006020828403121561218457600080fd5b5051919050565b60006001600160401b038211156121a4576121a4611e22565b5060051b60200190565b600060208083850312156121c157600080fd5b82516001600160401b03808211156121d857600080fd5b818501915085601f8301126121ec57600080fd5b81516121ff6121fa8261218b565b611ea5565b81815260059190911b8301840190848101908883111561221e57600080fd5b8585015b838110156122565780518581111561223a5760008081fd5b6122488b89838a0101611ed5565b845250918601918601612222565b5098975050505050505050565b6000602080838503121561227657600080fd5b82516001600160401b0381111561228c57600080fd5b8301601f8101851361229d57600080fd5b80516122ab6121fa8261218b565b81815260059190911b820183019083810190878311156122ca57600080fd5b928401925b828410156122e8578351825292840192908401906122cf565b979650505050505050565b60006040828403121561230557600080fd5b61230d611e83565b9050815181526020820151602082015292915050565b6000602080838503121561233657600080fd5b82516001600160401b0381111561234c57600080fd5b8301601f8101851361235d57600080fd5b805161236b6121fa8261218b565b81815260069190911b8201830190838101908783111561238a57600080fd5b928401925b828410156122e8576123a188856122f3565b8252848201915060408401935061238f565b6000604082840312156123c557600080fd5b6104e083836122f3565b6000604082840312156123e157600080fd5b6123e9611e83565b905081516123f681611b87565b808252506020820151602082015292915050565b60006040828403121561241c57600080fd5b6104e083836123cf565b60006020828403121561243857600080fd5b81516001600160401b0381111561244e57600080fd5b6105d684828501611ed5565b6000602080838503121561246d57600080fd5b82516001600160401b0381111561248357600080fd5b8301601f8101851361249457600080fd5b80516124a26121fa8261218b565b81815260069190911b820183019083810190878311156124c157600080fd5b928401925b828410156122e8576124d888856123cf565b825284820191506040840193506124c6565b600060208083850312156124fd57600080fd5b82516001600160401b0381111561251357600080fd5b8301601f8101851361252457600080fd5b80516125326121fa8261218b565b81815260059190911b8201830190838101908783111561255157600080fd5b928401925b828410156122e857835161256981611b87565b82529284019290840190612556565b6000808335601e1984360301811261258f57600080fd5b8301803591506001600160401b038211156125a957600080fd5b6020019150600581901b3603821315611c4957600080fd5b6000808335601e198436030181126125d857600080fd5b8301803591506001600160401b038211156125f257600080fd5b602001915036819003821315611c4957600080fd5b60208152815160208201526020820151604082015260408201516060820152600060608301516080808401526105d660a08401826119af565b60006020828403121561265257600080fd5b81356104e081611b87565b60208152600060018060a01b03808451166020840152602084015160a0604085015261268c60c08501826119af565b90506040850151601f19808684030160608701526126aa83836119af565b925083606088015116608087015260808701519350808684030160a087015250506126d581836119af565b95945050505050565b828152604060208201526000611f3860408301846119af56fea26469706673582212206ea52e5a17cf71ccc53257d2ff8822276c2a9ccd329a60f6ce095f3a02b2011464736f6c634300080a0033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80635f799cc6116100ad578063d55a006011610071578063d55a0060146102cc578063d85d04f4146102b0578063dfc1e2bf146102df578063e1332272146102f2578063e3d244281461030b57600080fd5b80635f799cc61461023d5780635fb8652e1461025d57806362c3ed301461027057806376ae90ef146102905780638654af27146102b057600080fd5b80632c422599116100f45780632c422599146101b65780633e7cb539146101c9578063485cc955146101da5780634a7906b9146101ef5780635440522b1461021d57600080fd5b806306bee8d4146101265780630f9b729c146101565780631964a421146101765780632260c7d214610196575b600080fd5b600154610139906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610169610164366004611953565b61031e565b60405161014d91906119db565b610189610184366004611aa6565b6104e7565b60405161014d9190611ac8565b6101a96101a4366004611aa6565b6105e0565b60405161014d9190611b2a565b6101696101c4366004611aa6565b6106cf565b6101396101d7366004611b6e565b90565b6101ed6101e8366004611b9c565b61092a565b005b6102026101fd366004611b6e565b610a7b565b6040805182518152602092830151928101929092520161014d565b61023061022b366004611b6e565b610af9565b60405161014d9190611bd5565b61025061024b366004611b6e565b610b77565b60405161014d9190611bf5565b6101ed61026b366004611c50565b610be9565b61028361027e366004611aa6565b610c9a565b60405161014d9190611d35565b6102a361029e366004611aa6565b610d89565b60405161014d9190611d95565b6102be6101d7366004611b6e565b60405190815260200161014d565b6101ed6102da366004611dee565b610e78565b6101a96102ed366004611aa6565b611131565b600054610139906201000090046001600160a01b031681565b6101ed610319366004611dee565b61134b565b6000805460405163dabb053160e01b815260048101869052606092916201000090046001600160a01b03169063dabb053190602401600060405180830381865afa158015610370573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103989190810190611f50565b6060015190506103b1836103ac868461202c565b61142a565b9250826001600160401b038111156103cb576103cb611e22565b60405190808252806020026020018201604052801561040457816020015b6103f161190e565b8152602001906001900390816103e95790505b50915080841061041457506104e0565b835b6104208486612043565b8110156104dd576000546040516301b6923d60e71b81526004810188905260248101839052620100009091046001600160a01b03169063db491e8090604401600060405180830381865afa15801561047c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104a4919081019061206b565b836104af878461202c565b815181106104bf576104bf612141565b602002602001018190525080806104d590612157565b915050610416565b50505b9392505050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610540573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105649190612172565b60015460405163732795d560e11b8152600481018390529192506001600160a01b03169063e64f2baa90602401600060405180830381865afa1580156105ae573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d691908101906121ae565b9150505b92915050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d9190612172565b60015460405163ed6223cf60e01b8152600481018390529192506001600160a01b03169063ed6223cf90602401600060405180830381865afa1580156106a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d69190810190612263565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074c9190612172565b600154604051635e9f678b60e01b8152600481018390529192506000916001600160a01b0390911690635e9f678b90602401600060405180830381865afa15801561079b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107c39190810190612323565b905080516001600160401b038111156107de576107de611e22565b60405190808252806020026020018201604052801561081757816020015b61080461190e565b8152602001906001900390816107fc5790505b50925060005b815181101561092157600060029054906101000a90046001600160a01b03166001600160a01b031663db491e8083838151811061085c5761085c612141565b60200260200101516000015184848151811061087a5761087a612141565b6020026020010151602001516040518363ffffffff1660e01b81526004016108ac929190918252602082015260400190565b600060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f1919081019061206b565b84828151811061090357610903612141565b6020026020010181905250808061091990612157565b91505061081d565b50505092915050565b600054610100900460ff161580801561094a5750600054600160ff909116105b806109645750303b158015610964575060005460ff166001145b6109cc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156109ef576000805461ff0019166101001790555b6000805462010000600160b01b031916620100006001600160a01b038681169190910291909117909155600180546001600160a01b0319169184169190911790558015610a76576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b604080518082018252600080825260208201526001549151634a7906b960e01b81526004810184905290916001600160a01b031690634a7906b9906024016040805180830381865afa158015610ad5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da91906123b3565b604080518082018252600080825260208201526001549151635440522b60e01b81526004810184905290916001600160a01b031690635440522b906024016040805180830381865afa158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da919061240a565b600154604051632fbcce6360e11b8152600481018390526060916001600160a01b031690635f799cc690602401600060405180830381865afa158015610bc1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105da9190810190612426565b610c908888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525050604080516020808b0282810182019093528a82529093508a925089918291850190849080828437600092019190915250889250611440915050565b5050505050505050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d179190612172565b600154604051639037c0f960e01b8152600481018390529192506001600160a01b031690639037c0f990602401600060405180830381865afa158015610d61573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d6919081019061245a565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa158015610de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e069190612172565b600154604051635c369ec360e01b8152600481018390529192506001600160a01b031690635c369ec390602401600060405180830381865afa158015610e50573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d691908101906124ea565b610e856040820182612578565b9050610e946020830183612578565b905014610ed95760405162461bcd60e51b8152602060048201526013602482015272082e4e4c2f298cadccee8d09ad2e6dac2e8c6d606b1b60448201526064016109c3565b60005b610ee96020830183612578565b905081101561102157600054604080516080810190915283358152620100009091046001600160a01b03169063188b04b390602080820190610f2d90870187612578565b86818110610f3d57610f3d612141565b90506020020135815260200185608001358152602001858060400190610f639190612578565b86818110610f7357610f73612141565b9050602002810190610f8591906125c1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509152506040516001600160e01b031960e084901b168152610fdc9190600401612607565b600060405180830381600087803b158015610ff657600080fd5b505af115801561100a573d6000803e3d6000fd5b50505050808061101990612157565b915050610edc565b5060005b6110326060830183612578565b905081101561112d5760005460408051606080820190925284358152620100009092046001600160a01b03169163f6479d7791602082019061107690870187612578565b8681811061108657611086612141565b905060200201602081019061109b9190612640565b6001600160a01b0390811682526080870135602092830152604080516001600160e01b031960e087901b1681528451600482015292840151909116602483015291909101516044820152606401600060405180830381600087803b15801561110257600080fd5b505af1158015611116573d6000803e3d6000fd5b50505050808061112590612157565b915050611025565b5050565b60008054604051636b87086360e11b81526004810185905260248101849052606092916201000090046001600160a01b03169063d70e10c690604401602060405180830381865afa15801561118a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ae9190612172565b60015460405163ba27f58d60e01b8152600481018390529192506000916001600160a01b039091169063ba27f58d90602401600060405180830381865afa1580156111fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112259190810190612263565b80519091506000805b8281101561127d5761125884828151811061124b5761124b612141565b602002602001015161188e565b1561126b578161126781612157565b9250505b8061127581612157565b91505061122e565b50806001600160401b0381111561129657611296611e22565b6040519080825280602002602001820160405280156112bf578160200160208202803683370190505b5094506000805b8381101561133f576112e385828151811061124b5761124b612141565b1561132d578481815181106112fa576112fa612141565b602002602001015187838151811061131457611314612141565b60209081029190910101528161132981612157565b9250505b8061133781612157565b9150506112c6565b50505050505092915050565b61142761135b6020830183612640565b61136860208401846125c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113aa9250505060408501856125c1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506113ec925050506060860186612578565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050506080860135611440565b50565b600081831061143957816104e0565b5090919050565b6000805460405163155e35fb60e11b81526001600160a01b0388811660048301526201000090920490911690632abc6bf690602401602060405180830381865afa158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190612172565b9050806115d757600080546040805160a0810182526001600160a01b038a8116825260208083018b90528284018a905260608301869052835190810184529485526080820194909452905163cd69fe6160e01b8152620100009092049092169163cd69fe6191611529919060040161265d565b600060405180830381600087803b15801561154357600080fd5b505af1158015611557573d6000803e3d6000fd5b505060005460405163155e35fb60e11b81526001600160a01b038a81166004830152620100009092049091169250632abc6bf69150602401602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190612172565b9050611648565b835115611648576000546040516347f94de760e01b8152620100009091046001600160a01b0316906347f94de79061161590849088906004016126de565b600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b505050505b60005b83518110156118855760008060029054906101000a90046001600160a01b03166001600160a01b0316632abc6bf686848151811061168b5761168b612141565b60200260200101516040518263ffffffff1660e01b81526004016116be91906001600160a01b0391909116815260200190565b602060405180830381865afa1580156116db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ff9190612172565b9050806117df57600060029054906101000a90046001600160a01b03166001600160a01b031663f6479d77604051806060016040528086815260200188868151811061174d5761174d612141565b60200260200101516001600160a01b03168152602001878152506040518263ffffffff1660e01b81526004016117a89190815181526020808301516001600160a01b0316908201526040918201519181019190915260600190565b600060405180830381600087803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b50505050611872565b600080546040805160808101825286815260208082018690528183018990528251908101835293845260608101939093525163188b04b360e01b8152620100009091046001600160a01b03169163188b04b39161183f9190600401612607565b600060405180830381600087803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b505050505b508061187d81612157565b91505061164b565b50505050505050565b6000805460405163dabb053160e01b815260048101849052620100009091046001600160a01b03169063dabb053190602401600060405180830381865afa1580156118dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119059190810190611f50565b51151592915050565b604080516101008101825260008082526020820181905260609282018390529181018290526080810182905260a0810182905260c0810182905260e081019190915290565b60008060006060848603121561196857600080fd5b505081359360208301359350604090920135919050565b60005b8381101561199a578181015183820152602001611982565b838111156119a9576000848401525b50505050565b600081518084526119c781602086016020860161197f565b601f01601f19169290920160200192915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b83811015611a9857603f198984030185528151610100815185528882015189860152878201518189870152611a39828701826119af565b6060848101516001600160a01b039081169189019190915260808086015182169089015260a0808601519091169088015260c08085015115159088015260e0938401511515939096019290925250509386019390860190600101611a02565b509098975050505050505050565b60008060408385031215611ab957600080fd5b50508035926020909101359150565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611b1d57603f19888603018452611b0b8583516119af565b94509285019290850190600101611aef565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611b6257835183529284019291840191600101611b46565b50909695505050505050565b600060208284031215611b8057600080fd5b5035919050565b6001600160a01b038116811461142757600080fd5b60008060408385031215611baf57600080fd5b8235611bba81611b87565b91506020830135611bca81611b87565b809150509250929050565b81516001600160a01b0316815260208083015190820152604081016105da565b6020815260006104e060208301846119af565b60008083601f840112611c1a57600080fd5b5081356001600160401b03811115611c3157600080fd5b602083019150836020828501011115611c4957600080fd5b9250929050565b60008060008060008060008060a0898b031215611c6c57600080fd5b8835611c7781611b87565b975060208901356001600160401b0380821115611c9357600080fd5b611c9f8c838d01611c08565b909950975060408b0135915080821115611cb857600080fd5b611cc48c838d01611c08565b909750955060608b0135915080821115611cdd57600080fd5b818b0191508b601f830112611cf157600080fd5b813581811115611d0057600080fd5b8c60208260051b8501011115611d1557600080fd5b602083019550809450505050608089013590509295985092959890939650565b602080825282518282018190526000919060409081850190868401855b82811015611d8857611d7884835180516001600160a01b03168252602090810151910152565b9284019290850190600101611d52565b5091979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611b625783516001600160a01b031683529284019291840191600101611db1565b600060a08284031215611de857600080fd5b50919050565b600060208284031215611e0057600080fd5b81356001600160401b03811115611e1657600080fd5b6105d684828501611dd6565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715611e5a57611e5a611e22565b60405290565b60405161010081016001600160401b0381118282101715611e5a57611e5a611e22565b604080519081016001600160401b0381118282101715611e5a57611e5a611e22565b604051601f8201601f191681016001600160401b0381118282101715611ecd57611ecd611e22565b604052919050565b600082601f830112611ee657600080fd5b81516001600160401b03811115611eff57611eff611e22565b611f12601f8201601f1916602001611ea5565b818152846020838601011115611f2757600080fd5b611f3882602083016020870161197f565b949350505050565b8051611f4b81611b87565b919050565b600060208284031215611f6257600080fd5b81516001600160401b0380821115611f7957600080fd5b9083019060c08286031215611f8d57600080fd5b611f95611e38565b82518152602083015182811115611fab57600080fd5b611fb787828601611ed5565b602083015250604083015182811115611fcf57600080fd5b611fdb87828601611ed5565b60408301525060608301516060820152611ff760808401611f40565b608082015261200860a08401611f40565b60a082015295945050505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561203e5761203e612016565b500390565b6000821982111561205657612056612016565b500190565b80518015158114611f4b57600080fd5b60006020828403121561207d57600080fd5b81516001600160401b038082111561209457600080fd5b9083019061010082860312156120a957600080fd5b6120b1611e60565b82518152602083015160208201526040830151828111156120d157600080fd5b6120dd87828601611ed5565b6040830152506120ef60608401611f40565b606082015261210060808401611f40565b608082015261211160a08401611f40565b60a082015261212260c0840161205b565b60c082015261213360e0840161205b565b60e082015295945050505050565b634e487b7160e01b600052603260045260246000fd5b600060001982141561216b5761216b612016565b5060010190565b60006020828403121561218457600080fd5b5051919050565b60006001600160401b038211156121a4576121a4611e22565b5060051b60200190565b600060208083850312156121c157600080fd5b82516001600160401b03808211156121d857600080fd5b818501915085601f8301126121ec57600080fd5b81516121ff6121fa8261218b565b611ea5565b81815260059190911b8301840190848101908883111561221e57600080fd5b8585015b838110156122565780518581111561223a5760008081fd5b6122488b89838a0101611ed5565b845250918601918601612222565b5098975050505050505050565b6000602080838503121561227657600080fd5b82516001600160401b0381111561228c57600080fd5b8301601f8101851361229d57600080fd5b80516122ab6121fa8261218b565b81815260059190911b820183019083810190878311156122ca57600080fd5b928401925b828410156122e8578351825292840192908401906122cf565b979650505050505050565b60006040828403121561230557600080fd5b61230d611e83565b9050815181526020820151602082015292915050565b6000602080838503121561233657600080fd5b82516001600160401b0381111561234c57600080fd5b8301601f8101851361235d57600080fd5b805161236b6121fa8261218b565b81815260069190911b8201830190838101908783111561238a57600080fd5b928401925b828410156122e8576123a188856122f3565b8252848201915060408401935061238f565b6000604082840312156123c557600080fd5b6104e083836122f3565b6000604082840312156123e157600080fd5b6123e9611e83565b905081516123f681611b87565b808252506020820151602082015292915050565b60006040828403121561241c57600080fd5b6104e083836123cf565b60006020828403121561243857600080fd5b81516001600160401b0381111561244e57600080fd5b6105d684828501611ed5565b6000602080838503121561246d57600080fd5b82516001600160401b0381111561248357600080fd5b8301601f8101851361249457600080fd5b80516124a26121fa8261218b565b81815260069190911b820183019083810190878311156124c157600080fd5b928401925b828410156122e8576124d888856123cf565b825284820191506040840193506124c6565b600060208083850312156124fd57600080fd5b82516001600160401b0381111561251357600080fd5b8301601f8101851361252457600080fd5b80516125326121fa8261218b565b81815260059190911b8201830190838101908783111561255157600080fd5b928401925b828410156122e857835161256981611b87565b82529284019290840190612556565b6000808335601e1984360301811261258f57600080fd5b8301803591506001600160401b038211156125a957600080fd5b6020019150600581901b3603821315611c4957600080fd5b6000808335601e198436030181126125d857600080fd5b8301803591506001600160401b038211156125f257600080fd5b602001915036819003821315611c4957600080fd5b60208152815160208201526020820151604082015260408201516060820152600060608301516080808401526105d660a08401826119af565b60006020828403121561265257600080fd5b81356104e081611b87565b60208152600060018060a01b03808451166020840152602084015160a0604085015261268c60c08501826119af565b90506040850151601f19808684030160608701526126aa83836119af565b925083606088015116608087015260808701519350808684030160a087015250506126d581836119af565b95945050505050565b828152604060208201526000611f3860408301846119af56fea26469706673582212206ea52e5a17cf71ccc53257d2ff8822276c2a9ccd329a60f6ce095f3a02b2011464736f6c634300080a0033