- Contract name:
- Web3Entry
- Optimization enabled
- true
- Compiler version
- v0.8.18+commit.87f61d96
- Optimization runs
- 200
- Verified at
- 2023-08-21T23:44:48.095861Z
contracts/Web3Entry.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {Web3EntryBase} from "./Web3EntryBase.sol";// solhint-disable-next-line no-empty-blockscontract Web3Entry is Web3EntryBase {}
contracts/interfaces/ILinkModule4Character.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;interface ILinkModule4Character {function initializeLinkModule(uint256 characterId,bytes calldata data) external returns (bytes memory);function processLink(address caller, uint256 characterId, bytes calldata data) external;}
contracts/base/NFTBase.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {ERC721} from "./ERC721.sol";import {ERC721Enumerable} from "./ERC721Enumerable.sol";import {Events} from "../libraries/Events.sol";abstract contract NFTBase is ERC721Enumerable {function _initialize(string calldata name, string calldata symbol) internal {ERC721.__ERC721_Init(name, symbol);emit Events.BaseInitialized(name, symbol, block.timestamp);}// solhint-disable orderingfunction burn(uint256 tokenId) public virtual {require(_isApprovedOrOwner(msg.sender, tokenId), "NFTBase: NotOwnerOrApproved");_burn(tokenId);}}
@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @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);}
contracts/interfaces/ILinklist.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {DataTypes} from "../libraries/DataTypes.sol";interface ILinklist {/*** @notice Initializes the contract.* @param name_ The name of the token.* @param symbol_ The symbol of the token.* @param web3Entry_ The address of the Web3Entry contract.*/function initialize(string calldata name_,string calldata symbol_,address web3Entry_) external;/*** @notice Mints a Linklist NFT to the specified character with linkType.* This can only be called by web3Entry.* @param characterId The character ID to mint to.* @param linkType The type of link.* @return tokenId The minted token ID.*/function mint(uint256 characterId, bytes32 linkType) external returns (uint256 tokenId);/*** @notice Burns a Linklist NFT.* @dev Only web3Entry can burn the Linklist NFT.* @param tokenId The token ID to burn.*/function burn(uint256 tokenId) external;/*** @notice Sets URI for a linklist.* @dev You can set any URI for your linklist, and the functionality of this URI* is undetermined and expandable. One scenario that comes to mind is setting a cover for your liked notes* or following list in your bookmarks.* @param tokenId The token ID to set URI.* @param newUri The new URI to set.
contracts/libraries/LinkLogic.sol
// SPDX-License-Identifier: MIT// solhint-disable private-vars-leading-underscorepragma solidity 0.8.18;import {Events} from "./Events.sol";import {ILinklist} from "../interfaces/ILinklist.sol";import {ILinkModule4Character} from "../interfaces/ILinkModule4Character.sol";import {ILinkModule4Note} from "../interfaces/ILinkModule4Note.sol";import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";library LinkLogic {using EnumerableSet for EnumerableSet.Bytes32Set;/*** @notice Links any characterId.* @param fromCharacterId The character ID to sponsor a link action.* @param toCharacterId The character ID to be linked.* @param linkType linkType, like “follow”.* @param data The data to pass to the link module, if any.* @param linklist The linklist contract address.* @param linkModule The linkModule address of the character to link.*/function linkCharacter(uint256 fromCharacterId,uint256 toCharacterId,bytes32 linkType,bytes memory data,address linklist,address linkModule,mapping(uint256 => mapping(bytes32 => uint256)) storage _attachedLinklists) external {address linker = IERC721(address(this)).ownerOf(fromCharacterId);uint256 linklistId = _mintLinklist(fromCharacterId, linkType, linklist, _attachedLinklists);// add to link listILinklist(linklist).addLinkingCharacterId(linklistId, toCharacterId);// process link moduleif (linkModule != address(0)) {try
@openzeppelin/contracts/utils/Multicall.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Multicall.sol)pragma solidity ^0.8.0;import "./Address.sol";/*** @dev Provides a function to batch together multiple calls in a single external call.** _Available since v4.1._*/abstract contract Multicall {/*** @dev Receives and executes a batch of function calls on this contract.* @custom:oz-upgrades-unsafe-allow-reachable delegatecall*/function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {results = new bytes[](data.length);for (uint256 i = 0; i < data.length; i++) {results[i] = Address.functionDelegateCall(address(this), data[i]);}return results;}}
contracts/interfaces/IWeb3Entry.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {DataTypes} from "../libraries/DataTypes.sol";interface IWeb3Entry {/*** @notice Initializes the Web3Entry.* @param name_ The name to set for the web3Entry character NFT.* @param symbol_ The symbol to set for the web3Entry character NFT.* @param linklist_ The address of linklist contract to set.* @param mintNFTImpl_ The address of mintNFTImpl contract to set.* @param periphery_ The address of periphery contract to set.* @param newbieVilla_ The address of newbieVilla contract to set.*/function initialize(string calldata name_,string calldata symbol_,address linklist_,address mintNFTImpl_,address periphery_,address newbieVilla_) external;/*** This method creates a character with the given parameters to the given address.** @param vars The CreateCharacterData struct containing the following parameters:* `to`: The address receiving the character.<br>* `handle`: The handle to set for the character.<br>* `uri`: The URI to set for the character metadata.<br>* `linkModule`: The link module to use, can be the zero address.<br>* `linkModuleInitData`: The link module initialization data, if any.<br>*/function createCharacter(DataTypes.CreateCharacterData calldata vars) external returns (uint256 characterId);/*** @notice Sets new handle for a given character.
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragma solidity ^0.8.0;import "./math/Math.sol";import "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant _SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;string memory buffer = new string(length);uint256 ptr;/// @solidity memory-safe-assemblyassembly {ptr := add(buffer, add(32, length))}while (true) {ptr--;/// @solidity memory-safe-assemblyassembly {mstore8(ptr, byte(mod(value, 10), _SYMBOLS))}value /= 10;if (value == 0) break;}return buffer;}}/**
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)pragma solidity ^0.8.0;/*** @dev Provides information about the current execution context, including the* sender of the transaction and its data. While these are generally available* via msg.sender and msg.data, they should not be accessed in such a direct* manner, since when dealing with meta-transactions the account sending and* paying for execution may not be the actual sender (as far as an application* is concerned).** This contract is only required for intermediate, library-like contracts.*/abstract contract Context {function _msgSender() internal view virtual returns (address) {return msg.sender;}function _msgData() internal view virtual returns (bytes calldata) {return msg.data;}}
contracts/libraries/OperatorLogic.sol
// SPDX-License-Identifier: MIT// solhint-disable private-vars-leading-underscorepragma solidity 0.8.18;import {Events} from "./Events.sol";import {DataTypes} from "./DataTypes.sol";import {OP} from "./OP.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";library OperatorLogic {using EnumerableSet for EnumerableSet.AddressSet;/*** @notice Grants permission to a given operator for a character.* @param characterId The ID of the character to set operator for.* @param operator The operator address to set.* @param permissionBitMap The permission bitmap for the operator.*/function grantOperatorPermissions(uint256 characterId,address operator,uint256 permissionBitMap,mapping(uint256 => EnumerableSet.AddressSet) storage _operatorsByCharacter,mapping(uint256 => mapping(address => uint256)) storage _operatorsPermissionBitMap) external {if (permissionBitMap == 0) {_operatorsByCharacter[characterId].remove(operator);} else {_operatorsByCharacter[characterId].add(operator);}uint256 bitmap = _bitmapFilter(permissionBitMap);_operatorsPermissionBitMap[characterId][operator] = bitmap;emit Events.GrantOperatorPermissions(characterId, operator, bitmap);}/**@notice Sets blocklist and allowlist for a specific note. Blocklist and allowlist are overwritten every time.@param characterId The character ID of the note owner.@param noteId The note ID to grant.@param blocklist The addresses list of blocked operators.
contracts/interfaces/IMintNFT.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;interface IMintNFT {/*** @notice Initialize the mint nft.* @param characterId_ The character ID of the note to initialize.* @param noteId_ The note ID to initialize.* @param web3Entry_ The address of web3Entry contract.* @param name_ The name to set for this NFT.* @param symbol_ The symbol to set for this NFT.*/function initialize(uint256 characterId_,uint256 noteId_,address web3Entry_,string calldata name_,string calldata symbol_) external;/*** @notice Mints a note NFT to the specified address.* This can only be called by web3Entry, and is called upon note.* @param to The address to mint the NFT to.* @return uint256 The minted token ID.*/function mint(address to) external returns (uint256);/*** @notice Changes the royalty percentage of specific token ID for secondary sales.* Can only be called by character owner of note.* @param tokenId The token ID to set.* @param recipient The receive address.* @param fraction The royalty percentage measured in basis points. Each basis point represents 0.01%.*/function setTokenRoyalty(uint256 tokenId, address recipient, uint96 fraction) external;/*** @notice Changes the default royalty percentage for secondary sales.* Can only be called by character owner of note.
contracts/libraries/PostLogic.sol
// SPDX-License-Identifier: MIT// solhint-disable private-vars-leading-underscorepragma solidity 0.8.18;import {DataTypes} from "./DataTypes.sol";import {Events} from "./Events.sol";import {ILinkModule4Note} from "../interfaces/ILinkModule4Note.sol";import {IMintModule4Note} from "../interfaces/IMintModule4Note.sol";import {IMintNFT} from "../interfaces/IMintNFT.sol";import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";library PostLogic {using Strings for uint256;function postNoteWithLink(DataTypes.PostNoteData calldata vars,uint256 noteId,bytes32 linkItemType,bytes32 linkKey,bytes calldata data,mapping(uint256 => mapping(uint256 => DataTypes.Note)) storage _noteByIdByCharacter) external {uint256 characterId = vars.characterId;DataTypes.Note storage note = _noteByIdByCharacter[characterId][noteId];// save notenote.contentUri = vars.contentUri;if (linkItemType != bytes32(0)) {note.linkItemType = linkItemType;note.linkKey = linkKey;}// init link module_setLinkModule4Note(characterId,noteId,vars.linkModule,vars.linkModuleInitData,_noteByIdByCharacter);
@openzeppelin/contracts/utils/cryptography/ECDSA.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)pragma solidity ^0.8.0;import "../Strings.sol";/*** @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.** These functions can be used to verify that a message was signed by the holder* of the private keys of a given address.*/library ECDSA {enum RecoverError {NoError,InvalidSignature,InvalidSignatureLength,InvalidSignatureS,InvalidSignatureV // Deprecated in v4.8}function _throwError(RecoverError error) private pure {if (error == RecoverError.NoError) {return; // no error: do nothing} else if (error == RecoverError.InvalidSignature) {revert("ECDSA: invalid signature");} else if (error == RecoverError.InvalidSignatureLength) {revert("ECDSA: invalid signature length");} else if (error == RecoverError.InvalidSignatureS) {revert("ECDSA: invalid signature 's' value");}}/*** @dev Returns the address that signed a hashed message (`hash`) with* `signature` or error string. This address can then be used for verification purposes.** The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:* this function rejects them by requiring the `s` value to be in the lower* half order, and the `v` value to be either 27 or 28.
@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)pragma solidity ^0.8.0;import "../IERC721.sol";/*** @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);/*** @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);}
@openzeppelin/contracts/proxy/utils/Initializable.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.2;import "../../utils/Address.sol";/*** @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]* ```solidity* 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]
@openzeppelin/contracts/token/ERC721/IERC721.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)pragma solidity ^0.8.0;import "../../utils/introspection/IERC165.sol";/*** @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);/**
@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)pragma solidity ^0.8.0;/*** @title ERC721 token receiver interface* @dev Interface for any contract that wants to support safeTransfers* from ERC721 asset contracts.*/interface IERC721Receiver {/*** @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}* by `operator` from `from`, this function is called.** It must return its Solidity selector to confirm the token transfer.* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.** The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.*/function onERC721Received(address operator,address from,uint256 tokenId,bytes calldata data) external returns (bytes4);}
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[EIP].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
contracts/libraries/Error.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;/// @dev Character ID not existserror ErrCharacterNotExists(uint256 characterId);/// @dev Not owner of addresserror ErrNotAddressOwner();/// @dev Caller is not the owner of charactererror ErrNotCharacterOwner();/// @dev Note has been lockederror ErrNoteLocked();/// @dev Handle does not existerror ErrHandleExists();/// @dev Social token address does not existerror ErrSocialTokenExists();/// @dev Handle length too long or too shorterror ErrHandleLengthInvalid();/// @dev Handle contains invalid characterserror ErrHandleContainsInvalidCharacters();/// @dev Operator has not enough permission for this charactererror ErrNotEnoughPermission();/// @dev Operator has not enough permissions for this noteerror ErrNotEnoughPermissionForThisNote();/// @dev Target address already has primary charactererror ErrTargetAlreadyHasPrimaryCharacter();/// @dev Note has been deletederror ErrNoteIsDeleted();/// @dev Note does not exist
contracts/base/ERC721Enumerable.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {IERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";import {ERC721} from "./ERC721.sol";import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {// Mapping from owner to list of owned token IDsmapping(address => mapping(uint256 => uint256)) private _ownedTokens;// Mapping from token ID to index of the owner tokens listmapping(uint256 => uint256) private _ownedTokensIndex;// Array with all token ids, used for enumerationuint256[] private _allTokens;// Mapping from token id to position in the allTokens arraymapping(uint256 => uint256) private _allTokensIndex;/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {returninterfaceId == type(IERC721Enumerable).interfaceId ||super.supportsInterface(interfaceId);}/*** @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.*/function tokenOfOwnerByIndex(address owner,uint256 index) public view virtual override returns (uint256) {
contracts/libraries/Events.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;library Events {event BaseInitialized(string name, string symbol, uint256 timestamp);event Web3EntryInitialized(uint256 timestamp);event LinklistNFTInitialized(uint256 timestamp);event MintNFTInitialized(uint256 characterId, uint256 noteId, uint256 timestamp);event CharacterCreated(uint256 indexed characterId,address indexed creator,address indexed to,string handle,uint256 timestamp);event SetPrimaryCharacterId(address indexed account,uint256 indexed characterId,uint256 indexed oldCharacterId);event SetHandle(address indexed account, uint256 indexed characterId, string newHandle);event SetSocialToken(address indexed account,uint256 indexed characterId,address indexed tokenAddress);event GrantOperatorPermissions(uint256 indexed characterId,address indexed operator,uint256 permissionBitMap);
contracts/interfaces/IMintModule4Note.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;interface IMintModule4Note {/*** @notice Initialize the MintModule for a specific note.* @param characterId The character ID of the note to initialize.* @param noteId The note ID to initialize.* @param data The data passed from the user to be decoded.* @return bytes The returned data of calling initializeMintModule.*/function initializeMintModule(uint256 characterId,uint256 noteId,bytes calldata data) external returns (bytes memory);/*** @notice Processes the mint logic. <br>* Triggered when the `mintNote` of web3Entry is called, if mint module of note is set.* @param to The receive address of the NFT.* @param characterId The character ID of the note owner.* @param noteId The note ID.* @param data The data passed from the user to be decoded.*/function processMint(address to,uint256 characterId,uint256 noteId,bytes calldata data) external;}
@openzeppelin/contracts/interfaces/IERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)pragma solidity ^0.8.0;import "../utils/introspection/IERC165.sol";
@openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // 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.*
contracts/interfaces/ILinkModule4Note.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;interface ILinkModule4Note {function initializeLinkModule(uint256 characterId,uint256 noteId,bytes calldata data) external returns (bytes memory);function processLink(address caller,uint256 characterId,uint256 noteId,bytes calldata data) external;}
contracts/libraries/CharacterLogic.sol
// SPDX-License-Identifier: MIT// solhint-disable private-vars-leading-underscorepragma solidity 0.8.18;import {DataTypes} from "./DataTypes.sol";import {Events} from "./Events.sol";import {ILinkModule4Character} from "../interfaces/ILinkModule4Character.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";library CharacterLogic {using EnumerableSet for EnumerableSet.Bytes32Set;/*** @notice Creates a character.* @param to The address to mint the character to.* @param handle The handle to set for the new character.* @param uri The URI to set for the new character’s metadata.* @param linkModule The link module to set for the new character or the zero address.* @param linkModuleInitData Arbitrary data to be decoded in the link module for initialization.* @param characterId The ID of the new character.*/function createCharacter(address to,string memory handle,string memory uri,address linkModule,bytes memory linkModuleInitData,uint256 characterId,mapping(bytes32 => uint256) storage _characterIdByHandleHash,mapping(uint256 => DataTypes.Character) storage _characterById) external {bytes32 handleHash = keccak256(bytes(handle));_characterIdByHandleHash[handleHash] = characterId;_characterById[characterId].characterId = characterId;_characterById[characterId].handle = handle;_characterById[characterId].uri = uri;// init link moduleif (linkModule != address(0)) {_characterById[characterId].linkModule = linkModule;
@openzeppelin/contracts/utils/math/SignedMath.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.0;/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Returns the largest of two signed numbers.*/function max(int256 a, int256 b) internal pure returns (int256) {return a > b ? a : b;}/*** @dev Returns the smallest of two signed numbers.*/function min(int256 a, int256 b) internal pure returns (int256) {return a < b ? a : b;}/*** @dev Returns the average of two signed numbers without overflow.* The result is rounded towards zero.*/function average(int256 a, int256 b) internal pure returns (int256) {// Formula from the book "Hacker's Delight"int256 x = (a & b) + ((a ^ b) >> 1);return x + (int256(uint256(x) >> 255) & (a ^ b));}/*** @dev Returns the absolute unsigned value of a signed value.*/function abs(int256 n) internal pure returns (uint256) {unchecked {// must be unchecked in order to support `n = type(int256).min`return uint256(n >= 0 ? n : -n);}
contracts/libraries/DataTypes.sol
// SPDX-License-Identifier: MIT// solhint-disable contract-name-camelcasepragma solidity 0.8.18;import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";/*** @title DataTypes* @notice A standard library of data types.*/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;}
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)pragma solidity ^0.8.1;/*** @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** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [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
contracts/libraries/OP.sol
// SPDX-License-Identifier: MIT// solhint-disable private-vars-leading-underscorepragma solidity 0.8.18;/*** In Crossbell's operator system, every uint8 stands for a single method in Web3Entry.sol. <br>* For most cases, we recommend simply granting operators the `OPERATOR_SIGN_PERMISSION_BITMAP`,* which gives operator full permissions aside from owner permissions and future permissions, but for* those who're more aware of access control, the custom permission bitmap is all yours,* and you can find every customizable methods below. <br>* `OPERATOR_SIGN_PERMISSION_BITMAP` have access to all methods in `OPERATOR_SYNC_PERMISSION_BITMAP`* plus more permissions for signing. <br>* Permissions are laid out in a increasing order of power.* so the bitmap looks like this:<table><colgroup><col style="width: 25%"><col style="width: 25%"><col style="width: 25%"><col style="width: 25%"></colgroup><tr><td>operator sync</td><td>operator sign</td><td>future reserved</td><td>owner</td><tr><tr><td>[255 - 236]</td><td>[235 - 176]</td><td>[175 - 21]</td><td>[20 - 0]</td><tr></table>*/
contracts/Web3EntryBase.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;import {IWeb3Entry} from "./interfaces/IWeb3Entry.sol";import {ILinklist} from "./interfaces/ILinklist.sol";import {NFTBase} from "./base/NFTBase.sol";import {Web3EntryStorage} from "./storage/Web3EntryStorage.sol";import {Web3EntryExtendStorage} from "./storage/Web3EntryExtendStorage.sol";import {DataTypes} from "./libraries/DataTypes.sol";import {Constants} from "./libraries/Constants.sol";import {Events} from "./libraries/Events.sol";import {CharacterLogic} from "./libraries/CharacterLogic.sol";import {PostLogic} from "./libraries/PostLogic.sol";import {OperatorLogic} from "./libraries/OperatorLogic.sol";import {LinkLogic} from "./libraries/LinkLogic.sol";import {OP} from "./libraries/OP.sol";import {ErrSocialTokenExists,ErrHandleExists,ErrNotCharacterOwner,ErrNotEnoughPermission,ErrNotEnoughPermissionForThisNote,ErrCharacterNotExists,ErrNoteIsDeleted,ErrNoteNotExists,ErrNoteLocked,ErrHandleLengthInvalid,ErrHandleContainsInvalidCharacters,ErrSignatureExpired,ErrSignatureInvalid,ErrTokenNotExists} from "./libraries/Error.sol";import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import {Multicall} from "@openzeppelin/contracts/utils/Multicall.sol";import {ECDSA} from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";contract Web3EntryBase isIWeb3Entry,Multicall,
@openzeppelin/contracts/utils/structs/EnumerableSet.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.pragma solidity ^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.** ```solidity* 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.** [WARNING]* ====* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure* unusable.* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.** In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an* array of EnumerableSet.* ====*/library EnumerableSet {
contracts/base/ERC721.sol
// SPDX-License-Identifier: MIT// solhint-disable orderingpragma solidity 0.8.18;import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";import {Address} from "@openzeppelin/contracts/utils/Address.sol";import {Context} from "@openzeppelin/contracts/utils/Context.sol";import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";import {IERC165} from "@openzeppelin/contracts/interfaces/IERC165.sol";/*** @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including* the Metadata extension, but not including the Enumerable extension, which is available separately as* {ERC721Enumerable}.*/contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {using Address for address;using Strings for uint256;// Token namestring private _name;// Token symbolstring private _symbol;// Mapping from token ID to owner addressmapping(uint256 => address) private _owners;// Mapping owner address to token countmapping(address => uint256) private _balances;// Mapping from token ID to approved addressmapping(uint256 => address) private _tokenApprovals;// Mapping from owner to operator approvalsmapping(address => mapping(address => bool)) private _operatorApprovals;// slither-disable-start naming-convention
contracts/storage/Web3EntryExtendStorage.sol
// SPDX-License-Identifier: MIT// slither-disable-start naming-conventionpragma solidity 0.8.18;import {DataTypes} from "../libraries/DataTypes.sol";import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";contract Web3EntryExtendStorage {address internal _periphery; // slot 21// slither-disable-next-line unused-statemapping(uint256 => address) internal _operatorByCharacter; // unused slot 22// slither-disable-next-line constable-statesaddress public resolver; // unused slot 23mapping(uint256 => EnumerableSet.AddressSet) internal _operatorsByCharacter; //slot 24// characterId => operator => permissionsBitMapmapping(uint256 => mapping(address => uint256)) internal _operatorsPermissionBitMap; // slot 25// characterId => noteId => Operators4Note// only for set note urimapping(uint256 => mapping(uint256 => DataTypes.Operators4Note)) internal _operators4Note; // slot 26address internal _newbieVilla; // address of newbieVilla contractmapping(address => uint256) internal _sigNonces; // for replay protection // slot 28}// slither-disable-end naming-convention
contracts/storage/Web3EntryStorage.sol
// SPDX-License-Identifier: MIT// slither-disable-start naming-conventionpragma solidity 0.8.18;import {DataTypes} from "../libraries/DataTypes.sol";contract Web3EntryStorage {// solhint-disable-next-line private-vars-leading-underscore, var-name-mixedcasebytes32 internal constant EIP712_DOMAIN_TYPEHASH =keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");// solhint-disable-next-line private-vars-leading-underscore, var-name-mixedcasebytes32 internal constant GRANT_OPERATOR_PERMISSIONS_WITH_SIG_TYPEHASH =keccak256( // solhint-disable-next-line max-line-length"grantOperatorPermissions(uint256 characterId,address operator,uint256 permissionBitMap,uint256 nonce,uint256 deadline)");// characterId => Charactermapping(uint256 => DataTypes.Character) internal _characterById;// handleHash => characterIdmapping(bytes32 => uint256) internal _characterIdByHandleHash;// address => characterIdmapping(address => uint256) internal _primaryCharacterByAddress;// characterId => (linkType => linklistId)mapping(uint256 => mapping(bytes32 => uint256)) internal _attachedLinklists;// characterId => noteId => Notemapping(uint256 => mapping(uint256 => DataTypes.Note)) internal _noteByIdByCharacter; // slot 14/////////////////////////////////// link modules/////////////////////////////////// tokenId => linkModule4Linklistmapping(uint256 => address) internal _linkModules4Linklist;// tokenAddress => tokenId => linkModule4ERC721/// @dev disable `uninitialized-state` check, as linkmodule for erc721 is not enabled currently// slither-disable-next-line uninitialized-state
@openzeppelin/contracts/proxy/Clones.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (proxy/Clones.sol)pragma solidity ^0.8.0;/*** @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for* deploying minimal proxy contracts, also known as "clones".** > To simply and cheaply clone contract functionality in an immutable way, this standard specifies* > a minimal bytecode implementation that delegates all calls to a known, fixed address.** The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the* deterministic method.** _Available since v3.4._*/library Clones {/*** @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.** This function uses the create opcode, which should never revert.*/function clone(address implementation) internal returns (address instance) {/// @solidity memory-safe-assemblyassembly {// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes// of the `implementation` address with the bytecode before the address.mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))instance := create(0, 0x09, 0x37)}require(instance != address(0), "ERC1167: create failed");}/*** @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.** This function uses the create2 opcode and a `salt` to deterministically deploy
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @dev Implementation of the {IERC165} interface.** Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check* for the additional interface id that will be supported. For example:** ```solidity* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);* }* ```** Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.*/abstract contract ERC165 is IERC165 {/*** @dev See {IERC165-supportsInterface}.*/function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {return interfaceId == type(IERC165).interfaceId;}}
contracts/libraries/Constants.sol
// SPDX-License-Identifier: MITpragma solidity 0.8.18;library Constants {uint8 public constant MAX_HANDLE_LENGTH = 31;uint8 public constant MIN_HANDLE_LENGTH = 3;// constants for linkItemType of note structbytes32 public constant LINK_ITEM_TYPE_CHARACTER = "Character";bytes32 public constant LINK_ITEM_TYPE_ADDRESS = "Address";bytes32 public constant LINK_ITEM_TYPE_LINKLIST = "Linklist";bytes32 public constant LINK_ITEM_TYPE_NOTE = "Note";bytes32 public constant LINK_ITEM_TYPE_ERC721 = "ERC721";bytes32 public constant LINK_ITEM_TYPE_ANYURI = "AnyUri";}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{"contracts/libraries/PostLogic.sol":{"PostLogic":"0x32df0486b2484f6c91dc8046608c3d567e1a385b"},"contracts/libraries/OperatorLogic.sol":{"OperatorLogic":"0x747be57d70527c6ce06455c55b659902898216a5"},"contracts/libraries/LinkLogic.sol":{"LinkLogic":"0xf7f727471ba5e19f3214596e34f66c26b090a12f"},"contracts/libraries/CharacterLogic.sol":{"CharacterLogic":"0x7d23ee87fc5db8a2724ef3c67fd6ee5a11649349"}}}
Contract ABI
[{"type":"error","name":"ErrCharacterNotExists","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"error","name":"ErrHandleContainsInvalidCharacters","inputs":[]},{"type":"error","name":"ErrHandleExists","inputs":[]},{"type":"error","name":"ErrHandleLengthInvalid","inputs":[]},{"type":"error","name":"ErrNotCharacterOwner","inputs":[]},{"type":"error","name":"ErrNotEnoughPermission","inputs":[]},{"type":"error","name":"ErrNotEnoughPermissionForThisNote","inputs":[]},{"type":"error","name":"ErrNoteIsDeleted","inputs":[]},{"type":"error","name":"ErrNoteLocked","inputs":[]},{"type":"error","name":"ErrNoteNotExists","inputs":[]},{"type":"error","name":"ErrSignatureExpired","inputs":[]},{"type":"error","name":"ErrSignatureInvalid","inputs":[]},{"type":"error","name":"ErrSocialTokenExists","inputs":[]},{"type":"error","name":"ErrTokenNotExists","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"approved","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"ApprovalForAll","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"operator","internalType":"address","indexed":true},{"type":"bool","name":"approved","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"type":"uint8","name":"version","internalType":"uint8","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokenId","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnLinklist","inputs":[{"type":"uint256","name":"linklistId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}],"name":"createCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.CreateCharacterData","components":[{"type":"address","name":"to","internalType":"address"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}],"name":"createThenLinkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.createThenLinkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deleteNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getApproved","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.Character","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"uint256","name":"noteCount","internalType":"uint256"},{"type":"address","name":"socialToken","internalType":"address"},{"type":"address","name":"linkModule","internalType":"address"}]}],"name":"getCharacter","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct DataTypes.Character","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"handle","internalType":"string"},{"type":"string","name":"uri","internalType":"string"},{"type":"uint256","name":"noteCount","internalType":"uint256"},{"type":"address","name":"socialToken","internalType":"address"},{"type":"address","name":"linkModule","internalType":"address"}]}],"name":"getCharacterByHandle","inputs":[{"type":"string","name":"handle","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getCharacterUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getDomainSeparator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getHandle","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLinklistContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLinklistId","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"getLinklistType","inputs":[{"type":"uint256","name":"linkListId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"getLinklistUri","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","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":"getNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getOperatorPermissions","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getOperators","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"blocklist","internalType":"address[]"},{"type":"address[]","name":"allowlist","internalType":"address[]"}],"name":"getOperators4Note","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPrimaryCharacterId","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRevision","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantOperatorPermissions","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"},{"type":"uint256","name":"permissionBitMap","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantOperatorPermissionsWithSig","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"},{"type":"uint256","name":"permissionBitMap","internalType":"uint256"},{"type":"tuple","name":"sig","internalType":"struct DataTypes.EIP712Signature","components":[{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"},{"type":"uint256","name":"deadline","internalType":"uint256"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"grantOperators4Note","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address[]","name":"blocklist","internalType":"address[]"},{"type":"address[]","name":"allowlist","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"linklist_","internalType":"address"},{"type":"address","name":"mintNFTImpl_","internalType":"address"},{"type":"address","name":"periphery_","internalType":"address"},{"type":"address","name":"newbieVilla_","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedForAll","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOperatorAllowedForNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"operator","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isPrimaryCharacter","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkAddress","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkAddressData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"ethAddress","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkAnyUri","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkAnyUriData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"string","name":"toUri","internalType":"string"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkERC721","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkERC721Data","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkLinklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkLinklistData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toLinkListId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"linkNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.linkNoteData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"uint256","name":"toNoteId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"},{"type":"bytes","name":"data","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockNote","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}],"name":"mintNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.MintNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"to","internalType":"address"},{"type":"bytes","name":"mintModuleData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes[]","name":"results","internalType":"bytes[]"}],"name":"multicall","inputs":[{"type":"bytes[]","name":"data","internalType":"bytes[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nonces","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ownerOf","inputs":[{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"noteId","internalType":"uint256"}],"name":"postNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Address","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"address","name":"ethAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4AnyUri","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Character","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"uint256","name":"toCharacterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4ERC721","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"tuple","name":"erc721","internalType":"struct DataTypes.ERC721Struct","components":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"erc721TokenId","internalType":"uint256"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Linklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"uint256","name":"toLinklistId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"postNote4Note","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.PostNoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"contentUri","internalType":"string"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"},{"type":"bool","name":"locked","internalType":"bool"}]},{"type":"tuple","name":"note","internalType":"struct DataTypes.NoteStruct","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"}]}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"resolver","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"safeTransferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes","name":"_data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setApprovalForAll","inputs":[{"type":"address","name":"operator","internalType":"address"},{"type":"bool","name":"approved","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCharacterUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"newUri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setHandle","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"string","name":"newHandle","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkModule4Character","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setLinkModule4CharacterData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinkModule4Note","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setLinkModule4NoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"linkModule","internalType":"address"},{"type":"bytes","name":"linkModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLinklistUri","inputs":[{"type":"uint256","name":"linklistId","internalType":"uint256"},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMintModule4Note","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.setMintModule4NoteData","components":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"address","name":"mintModule","internalType":"address"},{"type":"bytes","name":"mintModuleInitData","internalType":"bytes"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNoteUri","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"uint256","name":"noteId","internalType":"uint256"},{"type":"string","name":"newUri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPrimaryCharacterId","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSocialToken","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenByIndex","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenOfOwnerByIndex","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"tokenURI","inputs":[{"type":"uint256","name":"characterId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkAddress","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkAddressData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"ethAddress","internalType":"address"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkAnyUri","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkAnyUriData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"string","name":"toUri","internalType":"string"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkCharacter","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkCharacterData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkERC721","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkERC721Data","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokenId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkLinklist","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkLinklistData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toLinkListId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unlinkNote","inputs":[{"type":"tuple","name":"vars","internalType":"struct DataTypes.unlinkNoteData","components":[{"type":"uint256","name":"fromCharacterId","internalType":"uint256"},{"type":"uint256","name":"toCharacterId","internalType":"uint256"},{"type":"uint256","name":"toNoteId","internalType":"uint256"},{"type":"bytes32","name":"linkType","internalType":"bytes32"}]}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50615f0b80620000216000396000f3fe608060405234801561001057600080fd5b50600436106104495760003560e01c80638b4ca06a11610241578063cb8e757e1161013b578063e56f2fe4116100c3578063f2ad807511610087578063f2ad807514610a5e578063f316bacd14610a71578063f6479d7714610a84578063f7ea450814610a97578063fd2d866f14610aaa57600080fd5b8063e56f2fe4146109e1578063e985e9c5146109f4578063ec81d19414610a30578063ed24911d14610a43578063ef0828ab14610a4b57600080fd5b8063dabb05311161010a578063dabb053114610975578063db491e8014610988578063db8c198d146109a8578063dc17b6de146109bb578063dca27135146109ce57600080fd5b8063cb8e757e14610911578063cd69fe6114610924578063d23b320b14610937578063d70e10c61461094a57600080fd5b8063a22cb465116101c9578063b88d4fde1161018d578063b88d4fde146108b4578063b9d32845146108c7578063c053f6b8146108da578063c2a6fe3b146108eb578063c87b56dd146108fe57600080fd5b8063a22cb46514610848578063a6e6178d1461085b578063a7ccb4bf1461086e578063ac9650d814610881578063af90b112146108a157600080fd5b806395d89b411161021057806395d89b41146107e757806395d9fa7d146107ef5780639864c307146108025780639a4dec18146108155780639a50248d1461082857600080fd5b80638b4ca06a1461077857806392f7070b1461078b57806393f057e51461079e578063952be0ef146107b157600080fd5b8063388f5083116103525780635fb88183116102da57806374f345cf1161029e57806374f345cf14610703578063753d662d146107165780637ecebe0014610729578063867884e6146107525780638734bbfc1461076557600080fd5b80635fb8818314610697578063628b644a146106aa5780636352211e146106bd5780636bf55d5f146106d057806370a08231146106f057600080fd5b806344b82a241161032157806344b82a241461062a57806347f94de71461063d57806349186953146106505780634f6ccce7146106715780635a936d101461068457600080fd5b8063388f5083146105de57806340ad34d8146105f157806342842e0e1461060457806342966c681461061757600080fd5b8063188b04b3116103d557806329c301c2116103a457806329c301c2146105695780632abc6bf61461057c5780632f745c59146105a5578063327b2a03146105b857806333f06ee6146105cb57600080fd5b8063188b04b31461051d578063206657f21461053057806323b872dd1461054357806328fbb8051461055657600080fd5b8063095ea7b31161041c578063095ea7b3146104c95780630ff98244146104de5780631316529d146104f1578063144a3e831461050257806318160ddd1461051557600080fd5b806301ffc9a71461044e57806304f3bcec1461047657806306fdde03146104a1578063081812fc146104b6575b600080fd5b61046161045c36600461495c565b610abd565b60405190151581526020015b60405180910390f35b601754610489906001600160a01b031681565b6040516001600160a01b03909116815260200161046d565b6104a9610ae8565b60405161046d91906149c9565b6104896104c43660046149dc565b610b7a565b6104dc6104d7366004614a11565b610c07565b005b6104dc6104ec366004614a4d565b610d1c565b60045b60405190815260200161046d565b6104a96105103660046149dc565b610dc8565b6008546104f4565b6104dc61052b366004614a7b565b610dd3565b6104dc61053e366004614aaf565b610e71565b6104dc610551366004614ae4565b610e87565b610461610564366004614b10565b610eb8565b6104f4610577366004614b57565b610ecf565b6104f461058a366004614b8b565b6001600160a01b03166000908152600c602052604090205490565b6104f46105b3366004614a11565b610f60565b6104f46105c6366004614bb8565b610ff6565b6104dc6105d9366004614c45565b611185565b6104dc6105ec366004614a7b565b61126c565b6104dc6105ff366004614c90565b6112f1565b6104dc610612366004614ae4565b61136d565b6104dc6106253660046149dc565b611388565b6104f4610638366004614cac565b611425565b6104dc61064b366004614c45565b611486565b61066361065e366004614cf0565b6114ed565b60405161046d929190614d56565b6104f461067f3660046149dc565b611545565b6104dc610692366004614a4d565b6115d8565b6104dc6106a5366004614a7b565b611651565b6104dc6106b8366004614d7b565b6116bf565b6104896106cb3660046149dc565b61174c565b6106e36106de3660046149dc565b6117c3565b60405161046d9190614dcd565b6104f46106fe366004614b8b565b6117dd565b6104dc610711366004614cf0565b611864565b6104dc610724366004614de0565b6118de565b6104f4610737366004614b8b565b6001600160a01b03166000908152601c602052604090205490565b6104dc610760366004614c90565b6119c1565b6104616107733660046149dc565b611a6b565b6104f46107863660046149dc565b611a99565b6104f4610799366004614e27565b611b05565b6104dc6107ac366004614a4d565b611b80565b6104f46107bf366004614e6b565b60009182526019602090815260408084206001600160a01b0393909316845291905290205490565b6104a9611c20565b6104dc6107fd366004614e6b565b611c2f565b6104dc610810366004614a7b565b611cf0565b6104f4610823366004614bb8565b611d51565b61083b610836366004614e8e565b611e3c565b60405161046d9190614ecf565b6104dc610856366004614f5b565b611feb565b6104dc610869366004614c45565b611ff6565b6104f461087c366004614a7b565b6120d6565b61089461088f366004614fc9565b612177565b60405161046d9190614ffe565b6104f46108af366004614cac565b61226b565b6104dc6108c236600461514b565b612292565b6104dc6108d53660046151c4565b6122ca565b6013546001600160a01b0316610489565b6104dc6108f9366004614cf0565b61237d565b6104a961090c3660046149dc565b6123ef565b6104dc61091f3660046151c4565b6124bb565b6104f46109323660046151c4565b61254a565b6104dc610945366004614a7b565b61255f565b6104f4610958366004614cf0565b6000918252600d6020908152604080842092845291905290205490565b61083b6109833660046149dc565b6125ea565b61099b610996366004614cf0565b612799565b60405161046d91906151f8565b6104dc6109b6366004614a7b565b6128fa565b6104dc6109c936600461528e565b612964565b6104a96109dc3660046149dc565b6129f5565b6104dc6109ef366004615310565b612a67565b610461610a023660046153c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104a9610a3e3660046149dc565b612bf4565b6104f4612c39565b6104dc610a593660046153eb565b612c48565b6104dc610a6c3660046149dc565b612cd2565b6104f4610a7f36600461541f565b612d23565b6104f4610a92366004614a4d565b612e64565b6104dc610aa53660046149dc565b612f7f565b6104dc610ab83660046153eb565b61310d565b60006001600160e01b0319821663780e9d6360e01b1480610ae25750610ae282613188565b92915050565b606060008054610af79061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061547a565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b6000610b85826131d8565b610beb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c128261174c565b9050806001600160a01b0316836001600160a01b031603610c7f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610be2565b336001600160a01b0382161480610c9b5750610c9b8133610a02565b610d0d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610be2565b610d1783836131f5565b505050565b610d28813560b2613263565b60135481356000818152600d6020908152604080832081870135808552908352928190205490516337fb824760e11b815273f7f727471ba5e19f3214596e34f66c26b090a12f95636ff7048e95610d959590948901359390926001600160a01b03909216916004016154ae565b60006040518083038186803b158015610dad57600080fd5b505af4158015610dc1573d6000803e3d6000fd5b5050505050565b6060610ae2826123ef565b610ddf813560b2613263565b610dec81602001356132f4565b73f7f727471ba5e19f3214596e34f66c26b090a12f639ec52a23823560208401356040850135610e1f60608701876154da565b6013546020808a01356000908152600a9091526040908190206005015490516001600160e01b031960e08a901b168152610d959796959493926001600160a01b03908116921690600d90600401615549565b610e7c836002613263565b610d17838383613320565b610e91338261337c565b610ead5760405162461bcd60e51b8152600401610be290615596565b610d17838383613466565b6000610ec5848484613613565b90505b9392505050565b6000610edd823560ec613263565b610ee7823561369d565b6040516342a34a5360e01b81529091507332df0486b2484f6c91dc8046608c3d567e1a385b906342a34a5390610f2b90859085906000908190600e906004016156ee565b60006040518083038186803b158015610f4357600080fd5b505af4158015610f57573d6000803e3d6000fd5b50505050919050565b6000610f6b836117dd565b8210610fcd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610be2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000611004833560ca613263565b6545524337323160d01b600061101a853561369d565b6013549091506000906001600160a01b0316632ea24efc8261103f6020890189614b8b565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152602088013560448201526064016020604051808303816000875af1158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486856110e660208c018c614b8b565b8b6020013560405160200161111992919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b604051602081830303815290604052600e6040518763ffffffff1660e01b815260040161114b9695949392919061574c565b60006040518083038186803b15801561116357600080fd5b505af4158015611177573d6000803e3d6000fd5b509398975050505050505050565b6013546040516367880d6160e11b8152600481018590526000916001600160a01b03169063cf101ac290602401602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f39190615733565b90506112008160b1613263565b601354604051633c17845760e11b81526001600160a01b039091169063782f08ae9061123490879087908790600401615797565b600060405180830381600087803b15801561124e57600080fd5b505af1158015611262573d6000803e3d6000fd5b5050505050505050565b611278813560b9613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f63a4159c6b82356112a46040850160208601614b8b565b6013546040805160e086901b6001600160e01b031916815260048101949094526001600160a01b0392831660248501528601356044840152166064820152600d608482015260a401610d95565b6112fd813560b6613263565b60135460408051631d4deabf60e01b81528335600482015260208401356024820152908301356044820152606083013560648201526001600160a01b039091166084820152600d60a482015273f7f727471ba5e19f3214596e34f66c26b090a12f90631d4deabf9060c401610d95565b610d1783838360405180602001604052806000815250612292565b6000818152600a602052604080822090516113a691600101906157b1565b60408051918290039091206000818152600b6020908152838220829055858252600a9052918220828155909250906113e160018301826148ab565b6113ef6002830160006148ab565b50600060038201556004810180546001600160a01b0319908116909155600590910180549091169055611421826136c6565b5050565b6000611433833560c8613263565b67131a5b9adb1a5cdd60c21b600061144b853561369d565b905060008460001b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486858a60405160200161111991815260200190565b6114918360b0613263565b6000838152600a602052604090206002016114ad82848361586d565b50827f17d7c9f69270ba135480ef16837f38b9d37d3ab291cbd3ba03982290c663199783836040516114e092919061592c565b60405180910390a2505050565b6000828152601a602090815260408083208484529091529020606090819061151490613725565b6000858152601a60209081526040808320878452909152902090925061153c90600201613725565b90509250929050565b600061155060085490565b82106115b35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610be2565b600882815481106115c6576115c6615940565b90600052602060002001549050919050565b6115e4813560be613263565b60135481356000818152600d602090815260408083208187013580855290835292819020549051633fe4fe3960e11b815273f7f727471ba5e19f3214596e34f66c26b090a12f95637fc9fc7295610d959590948901359390926001600160a01b03909216916004016154ae565b61165d813560bb613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f6348391dcb823561168660208501856154da565b601354604080516001600160e01b031960e088901b168152610d959594939291890135916001600160a01b031690600d90600401615956565b6116c98484613732565b6116d38484613797565b6116dd848461380e565b6040516001626802bf60e01b031981527332df0486b2484f6c91dc8046608c3d567e1a385b9063ff97fd4190611720908790879087908790600e90600401615997565b60006040518083038186803b15801561173857600080fd5b505af4158015611262573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b031680610ae25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610be2565b6000818152601860205260409020606090610ae290613725565b60006001600160a01b0382166118485760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610be2565b506001600160a01b031660009081526003602052604090205490565b61186f8260c4613263565b6118798282613797565b6000828152600e60209081526040808320848452825291829020600501805460ff60a81b1916600160a81b179055905182815283917f036469f3e73c83520cdefa197d7a9c854c2f8bc0164b82e9f2bd4aa7e150fd3091015b60405180910390a25050565b60006118e98561174c565b6001600160a01b038181166000908152601c6020908152604080832080546001810190915581517f53f5e122d65c239c5936ed0eb8ce8ea2c1e77831749ec178c59c5cd4a792fe04938101939093529082018a90529288166060808301919091526080820188905260a08201939093529185013560c083015291925060e0016040516020818303038152906040528051906020012090506119b56119ae61198e613853565b8360405161190160f01b8152600281019290925260228201526042902090565b83856138c9565b50610dc1858585613320565b6119cd813560b8613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f631542463682356119f96040850160208601614b8b565b60135485356000908152600d6020908152604080832060608a013580855292529182902054825160e088901b6001600160e01b031916815260048101969096526001600160a01b03948516602487015291880135604486015260648501529116608483015260a482015260c401610d95565b600080611a778361174c565b6001600160a01b03166000908152600c60205260409020549290921492915050565b60135460405162fba02760e01b8152600481018390526000916001600160a01b03169062fba02790602401602060405180830381865afa158015611ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190615733565b6000611b13833560c7613263565b664164647265737360c81b6000611b2a853561369d565b6040516bffffffffffffffffffffffff19606087901b1660208201529091506001600160a01b038516907332df0486b2484f6c91dc8046608c3d567e1a385b906342a34a53908890859087908690603401611119565b611b8c813560ba613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f6393c96a528235611bb86040850160208601614b8b565b60135485356000908152600d60209081526040808320818a013580855292529182902054915160e087901b6001600160e01b031916815260048101959095526001600160a01b039384166024860152604485015291166064830152608482015260a401610d95565b606060018054610af79061547a565b611c3a826001613263565b6000828152600a60205260409020600401546001600160a01b031615611c735760405163fe6f50e560e01b815260040160405180910390fd5b6040516384b44a2f60e01b8152600481018390526001600160a01b0382166024820152600a6044820152737d23ee87fc5db8a2724ef3c67fd6ee5a11649349906384b44a2f9060640160006040518083038186803b158015611cd457600080fd5b505af4158015611ce8573d6000803e3d6000fd5b505050505050565b611cfc813560bd613263565b60135460408051632ca904df60e01b815273f7f727471ba5e19f3214596e34f66c26b090a12f92632ca904df92610d9592863592602088013592880135916001600160a01b0390911690600d906004016154ae565b6000611d5f833560c9613263565b634e6f746560e01b6000611d73853561369d565b601354604051635cb46be760e01b815260006004820181905287356024830152602088013560448301529293506001600160a01b0390911690635cb46be7906064016020604051808303816000875af1158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df89190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486858a600001358b60200135604051602001611119929190918252602082015260400190565b611e446148e5565b60008383604051611e569291906159c9565b604080519182900382206000818152600b602090815283822054808352600a82529184902060c0860190945283548552600184018054939650919493929084019190611ea19061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecd9061547a565b8015611f1a5780601f10611eef57610100808354040283529160200191611f1a565b820191906000526020600020905b815481529060010190602001808311611efd57829003601f168201915b50505050508152602001600282018054611f339061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5f9061547a565b8015611fac5780601f10611f8157610100808354040283529160200191611fac565b820191906000526020600020905b815481529060010190602001808311611f8f57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015295945050505050565b6114213383836139a6565b612001836000613263565b61202182826040516120149291906159c9565b6040518091039020613a74565b61206082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613aa192505050565b60405163130f361d60e01b8152737d23ee87fc5db8a2724ef3c67fd6ee5a116493499063130f361d906120a190869086908690600b90600a906004016159d9565b60006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b50505050505050565b60006120e782356020840135613797565b7332df0486b2484f6c91dc8046608c3d567e1a385b639d2e06f0833560208501356121186060870160408801614b8b565b61212560608801886154da565b6014546040516001600160e01b031960e089901b16815261215a9695949392916001600160a01b031690600e90600401615a07565b602060405180830381865af4158015611ae1573d6000803e3d6000fd5b6060816001600160401b0381111561219157612191615060565b6040519080825280602002602001820160405280156121c457816020015b60608152602001906001900390816121af5790505b50905060005b8281101561226457612234308585848181106121e8576121e8615940565b90506020028101906121fa91906154da565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b0e92505050565b82828151811061224657612246615940565b6020026020010181905250808061225c90615a61565b9150506121ca565b5092915050565b6000612279833560c6613263565b6821b430b930b1ba32b960b91b600061144b853561369d565b61229c338361337c565b6122b85760405162461bcd60e51b8152600401610be290615596565b6122c484848484613b33565b50505050565b6122d6813560b5613263565b6122e881602001358260400135613797565b73f7f727471ba5e19f3214596e34f66c26b090a12f6371bd9b06823560208401356040850135606086013561232060808801886154da565b6013546020808b01356000908152600e82526040808220818e013583529092528190206003015490516001600160e01b031960e08b901b168152610d95989796959493926001600160a01b03908116921690600d90600401615a7a565b6123888260c5613263565b6123928282613797565b6000828152600e60209081526040808320848452825291829020600501805460ff60a01b1916600160a01b179055905182815283917f4f1db9708b537c1d26a7af4b235fd079bf2342d92a276e27eb6c8717e8bbcf9391016118d2565b6060816123fb816131d8565b612418576040516366012df560e11b815260040160405180910390fd5b6000838152600a6020526040902060020180546124349061547a565b80601f01602080910402602001604051908101604052809291908181526020018280546124609061547a565b80156124ad5780601f10612482576101008083540402835291602001916124ad565b820191906000526020600020905b81548152906001019060200180831161249057829003601f168201915b505050505091505b50919050565b6124c7813560b7613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f63f35deae182356124f36040850160208601614b8b565b6013546040805160e086901b6001600160e01b031916815260048101949094526001600160a01b039283166024850152860135604484015260608601356064840152166084820152600d60a482015260c401610d95565b6000610ae261255883615ad0565b6001613b66565b61256b813560c2613263565b61257a81356020830135613797565b6125898135602083013561380e565b7332df0486b2484f6c91dc8046608c3d567e1a385b6320828a02823560208401356125ba6060860160408701614b8b565b6125c760608701876154da565b600e6040518763ffffffff1660e01b8152600401610d9596959493929190615b83565b6125f26148e5565b816125fc816131d8565b612619576040516366012df560e11b815260040160405180910390fd5b600a60008481526020019081526020016000206040518060c0016040529081600082015481526020016001820180546126519061547a565b80601f016020809104026020016040519081016040528092919081815260200182805461267d9061547a565b80156126ca5780601f1061269f576101008083540402835291602001916126ca565b820191906000526020600020905b8154815290600101906020018083116126ad57829003601f168201915b505050505081526020016002820180546126e39061547a565b80601f016020809104026020016040519081016040528092919081815260200182805461270f9061547a565b801561275c5780601f106127315761010080835404028352916020019161275c565b820191906000526020600020905b81548152906001019060200180831161273f57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b0390811660408301526005909201549091166060909101529392505050565b60408051610100808201835260008083526020808401829052606084860181905284018290526080840182905260a0840182905260c0840182905260e08401829052868252600e8152848220868352815290849020845192830185528054835260018101549183019190915260028101805493949293919284019161281d9061547a565b80601f01602080910402602001604051908101604052809291908181526020018280546128499061547a565b80156128965780601f1061286b57610100808354040283529160200191612896565b820191906000526020600020905b81548152906001019060200180831161287957829003601f168201915b505050918352505060038201546001600160a01b039081166020830152600483015481166040830152600590920154918216606082015260ff600160a01b8304811615156080830152600160a81b909204909116151560a090910152905092915050565b612906813560c0613263565b61291581356020830135613732565b61292481356020830135613797565b6129338135602083013561380e565b7332df0486b2484f6c91dc8046608c3d567e1a385b631f2ffb69823560208401356125ba6060860160408701614b8b565b61296f866003613263565b6129798686613797565b604051630afb883f60e41b815273747be57d70527c6ce06455c55b659902898216a59063afb883f0906129bd90899089908990899089908990601a90600401615c00565b60006040518083038186803b1580156129d557600080fd5b505af41580156129e9573d6000803e3d6000fd5b50505050505050505050565b601354604051632b05429560e21b8152600481018390526060916001600160a01b03169063ac150a5490602401600060405180830381865afa158015612a3f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae29190810190615c48565b601454600390600160a81b900460ff16158015612a92575060145460ff808316600160a01b90920416105b612af55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610be2565b6014805460ff60a81b1960ff8416600160a01b021661ffff60a01b1990911617600160a81b179055612b2989898989613c43565b601380546001600160a01b03199081166001600160a01b0388811691909117909255601480548216878416179055601580548216868416179055601b80549091169184169190911790556040514281527f400175a56dd3710794078f7b9dbe8296ac94c5a248dfd51bb22ed4ab9eaa9fbf9060200160405180910390a16014805460ff60a81b1916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050505050565b606081612c00816131d8565b612c1d576040516366012df560e11b815260040160405180910390fd5b6000838152600a6020526040902060010180546124349061547a565b6000612c43613853565b905090565b612c54813560bc613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f631873e2188235612c7d60208501856154da565b60135486356000908152600d60209081526040808320818b01358085529252918290205491516001600160e01b031960e089901b168152610d959695949391926001600160a01b039092169190600401615956565b612cdb81613c94565b326000908152600c6020526040808220805490849055905190918291849133917fce95332e6082aebeb8058a7b56d1a109f67d6550552ed04d36aca4a6acd4d7de9190a45050565b6000612d31843560cb613263565b65416e7955726960d01b6000612d47863561369d565b601354604051633610bf0960e11b81529192506000916001600160a01b0390911690636c217e1290612d819084908a908a90600401615797565b6020604051808303816000875af1158015612da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc49190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53888486858b8b604051602001612df79291906159c9565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401612e299695949392919061574c565b60006040518083038186803b158015612e4157600080fd5b505af4158015612e55573d6000803e3d6000fd5b50939998505050505050505050565b6000612e72823560b4613263565b612f006040518060a00160405280846020016020810190612e939190614b8b565b6001600160a01b03168152602001612ebc856020016020810190612eb79190614b8b565b613cfa565b815260200160405180602001604052806000815250815260200160006001600160a01b03168152602001604051806020016040528060008152508152506000613b66565b60135460408051639ec52a2360e01b8152853560048201526024810184905290850135604482015260e06064820152600060e482018190526001600160a01b03909216608482015260a4810191909152600d60c482015290915073f7f727471ba5e19f3214596e34f66c26b090a12f90639ec52a239061010401610f2b565b6013546040516367880d6160e11b8152600481018390526000916001600160a01b03169063cf101ac290602401602060405180830381865afa158015612fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fed9190615733565b9050612ff88161174c565b6001600160a01b0316336001600160a01b03161461302957604051631b0c476f60e11b815260040160405180910390fd5b60135460405162fba02760e01b8152600481018490526000916001600160a01b03169062fba02790602401602060405180830381865afa158015613071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130959190615733565b6000838152600d60209081526040808320848452909152808220919091556013549051630852cd8d60e31b8152600481018690529192506001600160a01b0316906342966c6890602401600060405180830381600087803b1580156130f957600080fd5b505af11580156120cd573d6000803e3d6000fd5b613119813560bf613263565b737d23ee87fc5db8a2724ef3c67fd6ee5a11649349631dc8313382356131456040850160208601614b8b565b61315260408601866154da565b86356000908152600a60205260409081902090516001600160e01b031960e088901b168152610d95959493929190600401615cb5565b60006001600160e01b031982166380ac58cd60e01b14806131b957506001600160e01b03198216635b5e139f60e01b145b80610ae257506301ffc9a760e01b6001600160e01b0319831614610ae2565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061322a8261174c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61326c82613e03565b15613275575050565b6015546001600160a01b031633036132b1576000828152601960209081526040808320328452909152902054600190821c8116036132b1575050565b6000828152601960209081526040808320338452909152902054600190821c8116036132db575050565b604051632c4bc2b960e21b815260040160405180910390fd5b6132fd816131d8565b61331d576040516375af0fc960e11b815260048101829052602401610be2565b50565b604051631f8c0b6760e11b8152600481018490526001600160a01b038316602482015260448101829052601860648201526019608482015273747be57d70527c6ce06455c55b659902898216a590633f1816ce9060a4016120a1565b6000613387826131d8565b6133e85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610be2565b60006133f38361174c565b9050806001600160a01b0316846001600160a01b0316148061342e5750836001600160a01b031661342384610b7a565b6001600160a01b0316145b8061345e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166134798261174c565b6001600160a01b0316146134dd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610be2565b6001600160a01b03821661353f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610be2565b61354a838383613e63565b6135556000826131f5565b6001600160a01b038316600090815260036020526040812080546001929061357e908490615ce0565b90915550506001600160a01b03821660009081526003602052604081208054600192906135ac908490615cf3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610d17838383613f35565b6000838152601a6020908152604080832085845290915281206136368184613f72565b15613645576000915050610ec8565b6136526002820184613f72565b15613661576001915050610ec8565b60008581526019602090815260408083206001600160a01b03871684529091529020546136949060c31c60019081161490565b95945050505050565b6000818152600a60205260408120600301805482906136bb90615a61565b918290555092915050565b6136d0338261337c565b61371c5760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f76656400000000006044820152606401610be2565b61331d81613f94565b60606000610ec883614043565b61373b82613e03565b15613744575050565b6015546001600160a01b0316330361376a57613761828232613613565b1561376a575050565b613775828233613613565b1561377e575050565b604051631a1d1d4760e11b815260040160405180910390fd5b6000828152600e60209081526040808320848452909152902060050154600160a01b900460ff16156137dc57604051631f0fc8f560e11b815260040160405180910390fd5b6000828152600a6020526040902060030154811115611421576040516364783acb60e01b815260040160405180910390fd5b6000828152600e60209081526040808320848452909152902060050154600160a81b900460ff161561142157604051630bc06a0f60e21b815260040160405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61387e610ae8565b8051602091820120604080519283019390935291810191909152600160608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b42816060013510156138ed576040516275e96160e01b815260040160405180910390fd5b60006001846138ff6020850185615d06565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613953573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806139885750826001600160a01b0316816001600160a01b031614155b156122c457604051636a9ca51760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603613a075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610be2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000818152600b60205260409020541561331d57604051631b659b9f60e21b815260040160405180910390fd5b80518190601f811180613ab45750600381105b15613ad257604051636f819c2160e11b815260040160405180910390fd5b60005b818110156122c457613b06838281518110613af257613af2615940565b01602001516001600160f81b03191661409f565b600101613ad5565b6060610ec88383604051806060016040528060278152602001615eaf6027913961414d565b613b3e848484613466565b613b4a848484846141c5565b6122c45760405162461bcd60e51b8152600401610be290615d29565b6000613b7c836020015180519060200120613a74565b8115613b8f57613b8f8360200151613aa1565b601260008154613b9e90615a61565b91829055508351909150613bb290826142c6565b737d23ee87fc5db8a2724ef3c67fd6ee5a11649349634daae5688460000151856020015186604001518760600151886080015187600b600a6040518963ffffffff1660e01b8152600401613c0d989796959493929190615d7b565b60006040518083038186803b158015613c2557600080fd5b505af4158015613c39573d6000803e3d6000fd5b5050505092915050565b613c4f848484846142e0565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c308484848442604051613c86959493929190615df2565b60405180910390a150505050565b6000613c9f8261174c565b6015549091506001600160a01b031633148015613cc45750326001600160a01b038216145b15613ccd575050565b6001600160a01b0381163303613ce1575050565b604051631b0c476f60e11b815260040160405180910390fd5b60408051602a80825260608281019093526f181899199a1a9b1b9c1cb0b131b232b360811b916001600160a01b0385169160009190602082018180368337019050509050600360fc1b81600081518110613d5657613d56615940565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613d8557613d85615940565b60200101906001600160f81b031916908160001a90535060295b6001811115613dfa578383600f1660108110613dbd57613dbd615940565b1a60f81b828281518110613dd357613dd3615940565b60200101906001600160f81b031916908160001a90535060049290921c9160001901613d9f565b50949350505050565b600080613e0f8361174c565b90506001600160a01b0381163303613e2a5750600192915050565b6015546001600160a01b031633148015613e4c5750326001600160a01b038216145b15613e5a5750600192915050565b50600092915050565b601b546001600160a01b03848116911614613f2a576000818152601860205260408120613e8f906142fb565b600083815260186020526040812091925090613eaa90613725565b905060005b82811015613eec57613eda84838381518110613ecd57613ecd615940565b6020026020010151614305565b80613ee481615a61565b915050613eaf565b506001600160a01b0385166000908152600c6020526040902054839003613f27576001600160a01b0385166000908152600c60205260408120555b50505b610d1783838361433e565b6001600160a01b0382166000908152600c60205260408120549003610d17576001600160a01b03919091166000908152600c602052604090205550565b6001600160a01b03811660009081526001830160205260408120541515610ec8565b6000613f9f8261174c565b9050613fad81600084613e63565b613fb86000836131f5565b6001600160a01b0381166000908152600360205260408120805460019290613fe1908490615ce0565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461142181600084613f35565b60608160000180548060200260200160405190810160405280929190818152602001828054801561409357602002820191906000526020600020905b81548152602001906001019080831161407f575b50505050509050919050565b600360fc1b6001600160f81b0319821610806140c85750603d60f91b6001600160f81b03198216115b806140f85750603960f81b6001600160f81b031982161180156140f85750606160f81b6001600160f81b03198216105b80156141125750602d60f81b6001600160f81b0319821614155b801561412c5750605f60f81b6001600160f81b0319821614155b1561331d576040516001621693dd60e01b0319815260040160405180910390fd5b6060600080856001600160a01b03168560405161416a9190615e2c565b600060405180830381855af49150503d80600081146141a5576040519150601f19603f3d011682016040523d82523d6000602084013e6141aa565b606091505b50915091506141bb868383876143f6565b9695505050505050565b60006001600160a01b0384163b156142bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614209903390899088908890600401615e48565b6020604051808303816000875af1925050508015614244575060408051601f3d908101601f1916820190925261424191810190615e7b565b60015b6142a1573d808015614272576040519150601f19603f3d011682016040523d82523d6000602084013e614277565b606091505b5080516000036142995760405162461bcd60e51b8152600401610be290615d29565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061345e565b506001949350505050565b61142182826040518060200160405280600081525061446f565b60006142ed84868361586d565b506001610dc182848361586d565b6000610ae2825490565b60008281526019602090815260408083206001600160a01b0385168452825280832083905584835260189091529020610d1790826144a2565b6001600160a01b0383166143995761439481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6143bc565b816001600160a01b0316836001600160a01b0316146143bc576143bc83826144b7565b6001600160a01b0382166143d357610d1781614554565b826001600160a01b0316826001600160a01b031614610d1757610d178282614603565b6060831561446557825160000361445e576001600160a01b0385163b61445e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610be2565b508161345e565b61345e8383614647565b6144798383614671565b61448660008484846141c5565b610d175760405162461bcd60e51b8152600401610be290615d29565b6000610ec8836001600160a01b0384166147b8565b600060016144c4846117dd565b6144ce9190615ce0565b600083815260076020526040902054909150808214614521576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061456690600190615ce0565b6000838152600960205260408120546008805493945090928490811061458e5761458e615940565b9060005260206000200154905080600883815481106145af576145af615940565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806145e7576145e7615e98565b6001900381819060005260206000200160009055905550505050565b600061460e836117dd565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8151156146575781518083602001fd5b8060405162461bcd60e51b8152600401610be291906149c9565b6001600160a01b0382166146c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610be2565b6146d0816131d8565b1561471d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be2565b61472960008383613e63565b6001600160a01b0382166000908152600360205260408120805460019290614752908490615cf3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461142160008383613f35565b600081815260018301602052604081205480156148a15760006147dc600183615ce0565b85549091506000906147f090600190615ce0565b905081811461485557600086600001828154811061481057614810615940565b906000526020600020015490508087600001848154811061483357614833615940565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061486657614866615e98565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ae2565b6000915050610ae2565b5080546148b79061547a565b6000825580601f106148c7575050565b601f01602090049060005260206000209081019061331d919061492d565b6040518060c001604052806000815260200160608152602001606081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b5b80821115614942576000815560010161492e565b5090565b6001600160e01b03198116811461331d57600080fd5b60006020828403121561496e57600080fd5b8135610ec881614946565b60005b8381101561499457818101518382015260200161497c565b50506000910152565b600081518084526149b5816020860160208601614979565b601f01601f19169290920160200192915050565b602081526000610ec8602083018461499d565b6000602082840312156149ee57600080fd5b5035919050565b80356001600160a01b0381168114614a0c57600080fd5b919050565b60008060408385031215614a2457600080fd5b614a2d836149f5565b946020939093013593505050565b6000606082840312156124b557600080fd5b600060608284031215614a5f57600080fd5b610ec88383614a3b565b6000608082840312156124b557600080fd5b600060208284031215614a8d57600080fd5b81356001600160401b03811115614aa357600080fd5b61345e84828501614a69565b600080600060608486031215614ac457600080fd5b83359250614ad4602085016149f5565b9150604084013590509250925092565b600080600060608486031215614af957600080fd5b614b02846149f5565b9250614ad4602085016149f5565b600080600060608486031215614b2557600080fd5b8335925060208401359150614b3c604085016149f5565b90509250925092565b600060e082840312156124b557600080fd5b600060208284031215614b6957600080fd5b81356001600160401b03811115614b7f57600080fd5b61345e84828501614b45565b600060208284031215614b9d57600080fd5b610ec8826149f5565b6000604082840312156124b557600080fd5b60008060608385031215614bcb57600080fd5b82356001600160401b03811115614be157600080fd5b614bed85828601614b45565b92505061153c8460208501614ba6565b60008083601f840112614c0f57600080fd5b5081356001600160401b03811115614c2657600080fd5b602083019150836020828501011115614c3e57600080fd5b9250929050565b600080600060408486031215614c5a57600080fd5b8335925060208401356001600160401b03811115614c7757600080fd5b614c8386828701614bfd565b9497909650939450505050565b600060808284031215614ca257600080fd5b610ec88383614a69565b60008060408385031215614cbf57600080fd5b82356001600160401b03811115614cd557600080fd5b614ce185828601614b45565b95602094909401359450505050565b60008060408385031215614d0357600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015614d4b5781516001600160a01b031687529582019590820190600101614d26565b509495945050505050565b604081526000614d696040830185614d12565b82810360208401526136948185614d12565b60008060008060608587031215614d9157600080fd5b843593506020850135925060408501356001600160401b03811115614db557600080fd5b614dc187828801614bfd565b95989497509550505050565b602081526000610ec86020830184614d12565b60008060008060e08587031215614df657600080fd5b84359350614e06602086016149f5565b925060408501359150614e1c8660608701614a69565b905092959194509250565b60008060408385031215614e3a57600080fd5b82356001600160401b03811115614e5057600080fd5b614e5c85828601614b45565b92505061153c602084016149f5565b60008060408385031215614e7e57600080fd5b8235915061153c602084016149f5565b60008060208385031215614ea157600080fd5b82356001600160401b03811115614eb757600080fd5b614ec385828601614bfd565b90969095509350505050565b60208152815160208201526000602083015160c06040840152614ef560e084018261499d565b90506040840151601f19848303016060850152614f12828261499d565b91505060608401516080840152608084015160018060a01b0380821660a08601528060a08701511660c086015250508091505092915050565b80358015158114614a0c57600080fd5b60008060408385031215614f6e57600080fd5b614f77836149f5565b915061153c60208401614f4b565b60008083601f840112614f9757600080fd5b5081356001600160401b03811115614fae57600080fd5b6020830191508360208260051b8501011115614c3e57600080fd5b60008060208385031215614fdc57600080fd5b82356001600160401b03811115614ff257600080fd5b614ec385828601614f85565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561505357603f1988860301845261504185835161499d565b94509285019290850190600101615025565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b038111828210171561509857615098615060565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150c6576150c6615060565b604052919050565b60006001600160401b038211156150e7576150e7615060565b50601f01601f191660200190565b600082601f83011261510657600080fd5b8135615119615114826150ce565b61509e565b81815284602083860101111561512e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561516157600080fd5b61516a856149f5565b9350615178602086016149f5565b92506040850135915060608501356001600160401b0381111561519a57600080fd5b6151a6878288016150f5565b91505092959194509250565b600060a082840312156124b557600080fd5b6000602082840312156151d657600080fd5b81356001600160401b038111156151ec57600080fd5b61345e848285016151b2565b6020815281516020820152602082015160408201526000604083015161010080606085015261522b61012085018361499d565b9150606085015160018060a01b0380821660808701528060808801511660a0870152505060a085015161526960c08601826001600160a01b03169052565b5060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600080608087890312156152a757600080fd5b863595506020870135945060408701356001600160401b03808211156152cc57600080fd5b6152d88a838b01614f85565b909650945060608901359150808211156152f157600080fd5b506152fe89828a01614f85565b979a9699509497509295939492505050565b60008060008060008060008060c0898b03121561532c57600080fd5b88356001600160401b038082111561534357600080fd5b61534f8c838d01614bfd565b909a50985060208b013591508082111561536857600080fd5b506153758b828c01614bfd565b9097509550615388905060408a016149f5565b935061539660608a016149f5565b92506153a460808a016149f5565b91506153b260a08a016149f5565b90509295985092959890939650565b600080604083850312156153d457600080fd5b6153dd836149f5565b915061153c602084016149f5565b6000602082840312156153fd57600080fd5b81356001600160401b0381111561541357600080fd5b61345e84828501614a3b565b60008060006040848603121561543457600080fd5b83356001600160401b038082111561544b57600080fd5b61545787838801614b45565b9450602086013591508082111561546d57600080fd5b50614c8386828701614bfd565b600181811c9082168061548e57607f821691505b6020821081036124b557634e487b7160e01b600052602260045260246000fd5b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b6000808335601e198436030181126154f157600080fd5b8301803591506001600160401b0382111561550b57600080fd5b602001915036819003821315614c3e57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b88815287602082015286604082015260e06060820152600061556f60e083018789615520565b6001600160a01b0395861660808401529390941660a082015260c001529695505050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000808335601e198436030181126155fe57600080fd5b83016020810192503590506001600160401b0381111561561d57600080fd5b803603821315614c3e57600080fd5b80358252600061563f60208301836155e7565b60e0602086015261565460e086018284615520565b915050615663604084016149f5565b6001600160a01b03818116604087015261568060608601866155e7565b92508684036060880152615695848483615520565b935050806156a5608087016149f5565b16608087015250506156ba60a08401846155e7565b85830360a08701526156cd838284615520565b925050506156dd60c08401614f4b565b151560c08501528091505092915050565b60c08152600061570160c083018861562c565b602083810197909752604083019590955250606081019290925281830360808301526000835260a09091015201919050565b60006020828403121561574557600080fd5b5051919050565b60c08152600061575f60c083018961562c565b8760208401528660408401528560608401528281036080840152615783818661499d565b9150508260a0830152979650505050505050565b838152604060208201526000613694604083018486615520565b60008083546157bf8161547a565b600182811680156157d757600181146157ec5761581b565b60ff198416875282151583028701945061581b565b8760005260208060002060005b858110156158125781548a8201529084019082016157f9565b50505082870194505b50929695505050505050565b601f821115610d1757600081815260208120601f850160051c8101602086101561584e5750805b601f850160051c820191505b81811015611ce85782815560010161585a565b6001600160401b0383111561588457615884615060565b61589883615892835461547a565b83615827565b6000601f8411600181146158cc57600085156158b45750838201355b600019600387901b1c1916600186901b178355610dc1565b600083815260209020601f19861690835b828110156158fd57868501358255602094850194600190920191016158dd565b508682101561591a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081526000610ec5602083018486615520565b634e487b7160e01b600052603260045260246000fd5b86815260a06020820152600061597060a083018789615520565b6040830195909552506001600160a01b039290921660608301526080909101529392505050565b8581528460208201526080604082015260006159b7608083018587615520565b90508260608301529695505050505050565b8183823760009101908152919050565b8581526080602082015260006159f3608083018688615520565b604083019490945250606001529392505050565b878152866020820152600060018060a01b03808816604084015260c06060840152615a3660c084018789615520565b941660808301525060a0015295945050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201615a7357615a73615a4b565b5060010190565b60006101008b83528a6020840152896040840152886060840152806080840152615aa7818401888a615520565b6001600160a01b0396871660a08501529490951660c08301525060e00152979650505050505050565b600060a08236031215615ae257600080fd5b615aea615076565b615af3836149f5565b815260208301356001600160401b0380821115615b0f57600080fd5b615b1b368387016150f5565b60208401526040850135915080821115615b3457600080fd5b615b40368387016150f5565b6040840152615b51606086016149f5565b60608401526080850135915080821115615b6a57600080fd5b50615b77368286016150f5565b60808301525092915050565b86815285602082015260018060a01b038516604082015260a060608201526000615bb160a083018587615520565b9050826080830152979650505050505050565b8183526000602080850194508260005b85811015614d4b576001600160a01b03615bed836149f5565b1687529582019590820190600101615bd4565b87815286602082015260a060408201526000615c2060a083018789615bc4565b8281036060840152615c33818688615bc4565b91505082608083015298975050505050505050565b600060208284031215615c5a57600080fd5b81516001600160401b03811115615c7057600080fd5b8201601f81018413615c8157600080fd5b8051615c8f615114826150ce565b818152856020838501011115615ca457600080fd5b613694826020830160208601614979565b8581526001600160a01b03851660208201526080604082018190526000906159b79083018587615520565b81810381811115610ae257610ae2615a4b565b80820180821115610ae257610ae2615a4b565b600060208284031215615d1857600080fd5b813560ff81168114610ec857600080fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03898116825261010060208301819052600091615da18483018c61499d565b91508382036040850152615db5828b61499d565b908916606085015283810360808501529050615dd1818861499d565b60a0840196909652505060c081019290925260e09091015295945050505050565b606081526000615e06606083018789615520565b8281036020840152615e19818688615520565b9150508260408301529695505050505050565b60008251615e3e818460208701614979565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141bb9083018461499d565b600060208284031215615e8d57600080fd5b8151610ec881614946565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220af8df0be171724531282ac9d1c8e142612624b95ce276cba153bada829d371dc64736f6c63430008120033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106104495760003560e01c80638b4ca06a11610241578063cb8e757e1161013b578063e56f2fe4116100c3578063f2ad807511610087578063f2ad807514610a5e578063f316bacd14610a71578063f6479d7714610a84578063f7ea450814610a97578063fd2d866f14610aaa57600080fd5b8063e56f2fe4146109e1578063e985e9c5146109f4578063ec81d19414610a30578063ed24911d14610a43578063ef0828ab14610a4b57600080fd5b8063dabb05311161010a578063dabb053114610975578063db491e8014610988578063db8c198d146109a8578063dc17b6de146109bb578063dca27135146109ce57600080fd5b8063cb8e757e14610911578063cd69fe6114610924578063d23b320b14610937578063d70e10c61461094a57600080fd5b8063a22cb465116101c9578063b88d4fde1161018d578063b88d4fde146108b4578063b9d32845146108c7578063c053f6b8146108da578063c2a6fe3b146108eb578063c87b56dd146108fe57600080fd5b8063a22cb46514610848578063a6e6178d1461085b578063a7ccb4bf1461086e578063ac9650d814610881578063af90b112146108a157600080fd5b806395d89b411161021057806395d89b41146107e757806395d9fa7d146107ef5780639864c307146108025780639a4dec18146108155780639a50248d1461082857600080fd5b80638b4ca06a1461077857806392f7070b1461078b57806393f057e51461079e578063952be0ef146107b157600080fd5b8063388f5083116103525780635fb88183116102da57806374f345cf1161029e57806374f345cf14610703578063753d662d146107165780637ecebe0014610729578063867884e6146107525780638734bbfc1461076557600080fd5b80635fb8818314610697578063628b644a146106aa5780636352211e146106bd5780636bf55d5f146106d057806370a08231146106f057600080fd5b806344b82a241161032157806344b82a241461062a57806347f94de71461063d57806349186953146106505780634f6ccce7146106715780635a936d101461068457600080fd5b8063388f5083146105de57806340ad34d8146105f157806342842e0e1461060457806342966c681461061757600080fd5b8063188b04b3116103d557806329c301c2116103a457806329c301c2146105695780632abc6bf61461057c5780632f745c59146105a5578063327b2a03146105b857806333f06ee6146105cb57600080fd5b8063188b04b31461051d578063206657f21461053057806323b872dd1461054357806328fbb8051461055657600080fd5b8063095ea7b31161041c578063095ea7b3146104c95780630ff98244146104de5780631316529d146104f1578063144a3e831461050257806318160ddd1461051557600080fd5b806301ffc9a71461044e57806304f3bcec1461047657806306fdde03146104a1578063081812fc146104b6575b600080fd5b61046161045c36600461495c565b610abd565b60405190151581526020015b60405180910390f35b601754610489906001600160a01b031681565b6040516001600160a01b03909116815260200161046d565b6104a9610ae8565b60405161046d91906149c9565b6104896104c43660046149dc565b610b7a565b6104dc6104d7366004614a11565b610c07565b005b6104dc6104ec366004614a4d565b610d1c565b60045b60405190815260200161046d565b6104a96105103660046149dc565b610dc8565b6008546104f4565b6104dc61052b366004614a7b565b610dd3565b6104dc61053e366004614aaf565b610e71565b6104dc610551366004614ae4565b610e87565b610461610564366004614b10565b610eb8565b6104f4610577366004614b57565b610ecf565b6104f461058a366004614b8b565b6001600160a01b03166000908152600c602052604090205490565b6104f46105b3366004614a11565b610f60565b6104f46105c6366004614bb8565b610ff6565b6104dc6105d9366004614c45565b611185565b6104dc6105ec366004614a7b565b61126c565b6104dc6105ff366004614c90565b6112f1565b6104dc610612366004614ae4565b61136d565b6104dc6106253660046149dc565b611388565b6104f4610638366004614cac565b611425565b6104dc61064b366004614c45565b611486565b61066361065e366004614cf0565b6114ed565b60405161046d929190614d56565b6104f461067f3660046149dc565b611545565b6104dc610692366004614a4d565b6115d8565b6104dc6106a5366004614a7b565b611651565b6104dc6106b8366004614d7b565b6116bf565b6104896106cb3660046149dc565b61174c565b6106e36106de3660046149dc565b6117c3565b60405161046d9190614dcd565b6104f46106fe366004614b8b565b6117dd565b6104dc610711366004614cf0565b611864565b6104dc610724366004614de0565b6118de565b6104f4610737366004614b8b565b6001600160a01b03166000908152601c602052604090205490565b6104dc610760366004614c90565b6119c1565b6104616107733660046149dc565b611a6b565b6104f46107863660046149dc565b611a99565b6104f4610799366004614e27565b611b05565b6104dc6107ac366004614a4d565b611b80565b6104f46107bf366004614e6b565b60009182526019602090815260408084206001600160a01b0393909316845291905290205490565b6104a9611c20565b6104dc6107fd366004614e6b565b611c2f565b6104dc610810366004614a7b565b611cf0565b6104f4610823366004614bb8565b611d51565b61083b610836366004614e8e565b611e3c565b60405161046d9190614ecf565b6104dc610856366004614f5b565b611feb565b6104dc610869366004614c45565b611ff6565b6104f461087c366004614a7b565b6120d6565b61089461088f366004614fc9565b612177565b60405161046d9190614ffe565b6104f46108af366004614cac565b61226b565b6104dc6108c236600461514b565b612292565b6104dc6108d53660046151c4565b6122ca565b6013546001600160a01b0316610489565b6104dc6108f9366004614cf0565b61237d565b6104a961090c3660046149dc565b6123ef565b6104dc61091f3660046151c4565b6124bb565b6104f46109323660046151c4565b61254a565b6104dc610945366004614a7b565b61255f565b6104f4610958366004614cf0565b6000918252600d6020908152604080842092845291905290205490565b61083b6109833660046149dc565b6125ea565b61099b610996366004614cf0565b612799565b60405161046d91906151f8565b6104dc6109b6366004614a7b565b6128fa565b6104dc6109c936600461528e565b612964565b6104a96109dc3660046149dc565b6129f5565b6104dc6109ef366004615310565b612a67565b610461610a023660046153c1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104a9610a3e3660046149dc565b612bf4565b6104f4612c39565b6104dc610a593660046153eb565b612c48565b6104dc610a6c3660046149dc565b612cd2565b6104f4610a7f36600461541f565b612d23565b6104f4610a92366004614a4d565b612e64565b6104dc610aa53660046149dc565b612f7f565b6104dc610ab83660046153eb565b61310d565b60006001600160e01b0319821663780e9d6360e01b1480610ae25750610ae282613188565b92915050565b606060008054610af79061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b239061547a565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b6000610b85826131d8565b610beb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c128261174c565b9050806001600160a01b0316836001600160a01b031603610c7f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610be2565b336001600160a01b0382161480610c9b5750610c9b8133610a02565b610d0d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610be2565b610d1783836131f5565b505050565b610d28813560b2613263565b60135481356000818152600d6020908152604080832081870135808552908352928190205490516337fb824760e11b815273f7f727471ba5e19f3214596e34f66c26b090a12f95636ff7048e95610d959590948901359390926001600160a01b03909216916004016154ae565b60006040518083038186803b158015610dad57600080fd5b505af4158015610dc1573d6000803e3d6000fd5b5050505050565b6060610ae2826123ef565b610ddf813560b2613263565b610dec81602001356132f4565b73f7f727471ba5e19f3214596e34f66c26b090a12f639ec52a23823560208401356040850135610e1f60608701876154da565b6013546020808a01356000908152600a9091526040908190206005015490516001600160e01b031960e08a901b168152610d959796959493926001600160a01b03908116921690600d90600401615549565b610e7c836002613263565b610d17838383613320565b610e91338261337c565b610ead5760405162461bcd60e51b8152600401610be290615596565b610d17838383613466565b6000610ec5848484613613565b90505b9392505050565b6000610edd823560ec613263565b610ee7823561369d565b6040516342a34a5360e01b81529091507332df0486b2484f6c91dc8046608c3d567e1a385b906342a34a5390610f2b90859085906000908190600e906004016156ee565b60006040518083038186803b158015610f4357600080fd5b505af4158015610f57573d6000803e3d6000fd5b50505050919050565b6000610f6b836117dd565b8210610fcd5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610be2565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000611004833560ca613263565b6545524337323160d01b600061101a853561369d565b6013549091506000906001600160a01b0316632ea24efc8261103f6020890189614b8b565b6040516001600160e01b031960e085901b16815260048101929092526001600160a01b03166024820152602088013560448201526064016020604051808303816000875af1158015611095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b99190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486856110e660208c018c614b8b565b8b6020013560405160200161111992919060609290921b6bffffffffffffffffffffffff19168252601482015260340190565b604051602081830303815290604052600e6040518763ffffffff1660e01b815260040161114b9695949392919061574c565b60006040518083038186803b15801561116357600080fd5b505af4158015611177573d6000803e3d6000fd5b509398975050505050505050565b6013546040516367880d6160e11b8152600481018590526000916001600160a01b03169063cf101ac290602401602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f39190615733565b90506112008160b1613263565b601354604051633c17845760e11b81526001600160a01b039091169063782f08ae9061123490879087908790600401615797565b600060405180830381600087803b15801561124e57600080fd5b505af1158015611262573d6000803e3d6000fd5b5050505050505050565b611278813560b9613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f63a4159c6b82356112a46040850160208601614b8b565b6013546040805160e086901b6001600160e01b031916815260048101949094526001600160a01b0392831660248501528601356044840152166064820152600d608482015260a401610d95565b6112fd813560b6613263565b60135460408051631d4deabf60e01b81528335600482015260208401356024820152908301356044820152606083013560648201526001600160a01b039091166084820152600d60a482015273f7f727471ba5e19f3214596e34f66c26b090a12f90631d4deabf9060c401610d95565b610d1783838360405180602001604052806000815250612292565b6000818152600a602052604080822090516113a691600101906157b1565b60408051918290039091206000818152600b6020908152838220829055858252600a9052918220828155909250906113e160018301826148ab565b6113ef6002830160006148ab565b50600060038201556004810180546001600160a01b0319908116909155600590910180549091169055611421826136c6565b5050565b6000611433833560c8613263565b67131a5b9adb1a5cdd60c21b600061144b853561369d565b905060008460001b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486858a60405160200161111991815260200190565b6114918360b0613263565b6000838152600a602052604090206002016114ad82848361586d565b50827f17d7c9f69270ba135480ef16837f38b9d37d3ab291cbd3ba03982290c663199783836040516114e092919061592c565b60405180910390a2505050565b6000828152601a602090815260408083208484529091529020606090819061151490613725565b6000858152601a60209081526040808320878452909152902090925061153c90600201613725565b90509250929050565b600061155060085490565b82106115b35760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610be2565b600882815481106115c6576115c6615940565b90600052602060002001549050919050565b6115e4813560be613263565b60135481356000818152600d602090815260408083208187013580855290835292819020549051633fe4fe3960e11b815273f7f727471ba5e19f3214596e34f66c26b090a12f95637fc9fc7295610d959590948901359390926001600160a01b03909216916004016154ae565b61165d813560bb613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f6348391dcb823561168660208501856154da565b601354604080516001600160e01b031960e088901b168152610d959594939291890135916001600160a01b031690600d90600401615956565b6116c98484613732565b6116d38484613797565b6116dd848461380e565b6040516001626802bf60e01b031981527332df0486b2484f6c91dc8046608c3d567e1a385b9063ff97fd4190611720908790879087908790600e90600401615997565b60006040518083038186803b15801561173857600080fd5b505af4158015611262573d6000803e3d6000fd5b6000818152600260205260408120546001600160a01b031680610ae25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610be2565b6000818152601860205260409020606090610ae290613725565b60006001600160a01b0382166118485760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610be2565b506001600160a01b031660009081526003602052604090205490565b61186f8260c4613263565b6118798282613797565b6000828152600e60209081526040808320848452825291829020600501805460ff60a81b1916600160a81b179055905182815283917f036469f3e73c83520cdefa197d7a9c854c2f8bc0164b82e9f2bd4aa7e150fd3091015b60405180910390a25050565b60006118e98561174c565b6001600160a01b038181166000908152601c6020908152604080832080546001810190915581517f53f5e122d65c239c5936ed0eb8ce8ea2c1e77831749ec178c59c5cd4a792fe04938101939093529082018a90529288166060808301919091526080820188905260a08201939093529185013560c083015291925060e0016040516020818303038152906040528051906020012090506119b56119ae61198e613853565b8360405161190160f01b8152600281019290925260228201526042902090565b83856138c9565b50610dc1858585613320565b6119cd813560b8613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f631542463682356119f96040850160208601614b8b565b60135485356000908152600d6020908152604080832060608a013580855292529182902054825160e088901b6001600160e01b031916815260048101969096526001600160a01b03948516602487015291880135604486015260648501529116608483015260a482015260c401610d95565b600080611a778361174c565b6001600160a01b03166000908152600c60205260409020549290921492915050565b60135460405162fba02760e01b8152600481018390526000916001600160a01b03169062fba02790602401602060405180830381865afa158015611ae1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190615733565b6000611b13833560c7613263565b664164647265737360c81b6000611b2a853561369d565b6040516bffffffffffffffffffffffff19606087901b1660208201529091506001600160a01b038516907332df0486b2484f6c91dc8046608c3d567e1a385b906342a34a53908890859087908690603401611119565b611b8c813560ba613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f6393c96a528235611bb86040850160208601614b8b565b60135485356000908152600d60209081526040808320818a013580855292529182902054915160e087901b6001600160e01b031916815260048101959095526001600160a01b039384166024860152604485015291166064830152608482015260a401610d95565b606060018054610af79061547a565b611c3a826001613263565b6000828152600a60205260409020600401546001600160a01b031615611c735760405163fe6f50e560e01b815260040160405180910390fd5b6040516384b44a2f60e01b8152600481018390526001600160a01b0382166024820152600a6044820152737d23ee87fc5db8a2724ef3c67fd6ee5a11649349906384b44a2f9060640160006040518083038186803b158015611cd457600080fd5b505af4158015611ce8573d6000803e3d6000fd5b505050505050565b611cfc813560bd613263565b60135460408051632ca904df60e01b815273f7f727471ba5e19f3214596e34f66c26b090a12f92632ca904df92610d9592863592602088013592880135916001600160a01b0390911690600d906004016154ae565b6000611d5f833560c9613263565b634e6f746560e01b6000611d73853561369d565b601354604051635cb46be760e01b815260006004820181905287356024830152602088013560448301529293506001600160a01b0390911690635cb46be7906064016020604051808303816000875af1158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df89190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53878486858a600001358b60200135604051602001611119929190918252602082015260400190565b611e446148e5565b60008383604051611e569291906159c9565b604080519182900382206000818152600b602090815283822054808352600a82529184902060c0860190945283548552600184018054939650919493929084019190611ea19061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054611ecd9061547a565b8015611f1a5780601f10611eef57610100808354040283529160200191611f1a565b820191906000526020600020905b815481529060010190602001808311611efd57829003601f168201915b50505050508152602001600282018054611f339061547a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5f9061547a565b8015611fac5780601f10611f8157610100808354040283529160200191611fac565b820191906000526020600020905b815481529060010190602001808311611f8f57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b03908116604083015260059092015490911660609091015295945050505050565b6114213383836139a6565b612001836000613263565b61202182826040516120149291906159c9565b6040518091039020613a74565b61206082828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613aa192505050565b60405163130f361d60e01b8152737d23ee87fc5db8a2724ef3c67fd6ee5a116493499063130f361d906120a190869086908690600b90600a906004016159d9565b60006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b50505050505050565b60006120e782356020840135613797565b7332df0486b2484f6c91dc8046608c3d567e1a385b639d2e06f0833560208501356121186060870160408801614b8b565b61212560608801886154da565b6014546040516001600160e01b031960e089901b16815261215a9695949392916001600160a01b031690600e90600401615a07565b602060405180830381865af4158015611ae1573d6000803e3d6000fd5b6060816001600160401b0381111561219157612191615060565b6040519080825280602002602001820160405280156121c457816020015b60608152602001906001900390816121af5790505b50905060005b8281101561226457612234308585848181106121e8576121e8615940565b90506020028101906121fa91906154da565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b0e92505050565b82828151811061224657612246615940565b6020026020010181905250808061225c90615a61565b9150506121ca565b5092915050565b6000612279833560c6613263565b6821b430b930b1ba32b960b91b600061144b853561369d565b61229c338361337c565b6122b85760405162461bcd60e51b8152600401610be290615596565b6122c484848484613b33565b50505050565b6122d6813560b5613263565b6122e881602001358260400135613797565b73f7f727471ba5e19f3214596e34f66c26b090a12f6371bd9b06823560208401356040850135606086013561232060808801886154da565b6013546020808b01356000908152600e82526040808220818e013583529092528190206003015490516001600160e01b031960e08b901b168152610d95989796959493926001600160a01b03908116921690600d90600401615a7a565b6123888260c5613263565b6123928282613797565b6000828152600e60209081526040808320848452825291829020600501805460ff60a01b1916600160a01b179055905182815283917f4f1db9708b537c1d26a7af4b235fd079bf2342d92a276e27eb6c8717e8bbcf9391016118d2565b6060816123fb816131d8565b612418576040516366012df560e11b815260040160405180910390fd5b6000838152600a6020526040902060020180546124349061547a565b80601f01602080910402602001604051908101604052809291908181526020018280546124609061547a565b80156124ad5780601f10612482576101008083540402835291602001916124ad565b820191906000526020600020905b81548152906001019060200180831161249057829003601f168201915b505050505091505b50919050565b6124c7813560b7613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f63f35deae182356124f36040850160208601614b8b565b6013546040805160e086901b6001600160e01b031916815260048101949094526001600160a01b039283166024850152860135604484015260608601356064840152166084820152600d60a482015260c401610d95565b6000610ae261255883615ad0565b6001613b66565b61256b813560c2613263565b61257a81356020830135613797565b6125898135602083013561380e565b7332df0486b2484f6c91dc8046608c3d567e1a385b6320828a02823560208401356125ba6060860160408701614b8b565b6125c760608701876154da565b600e6040518763ffffffff1660e01b8152600401610d9596959493929190615b83565b6125f26148e5565b816125fc816131d8565b612619576040516366012df560e11b815260040160405180910390fd5b600a60008481526020019081526020016000206040518060c0016040529081600082015481526020016001820180546126519061547a565b80601f016020809104026020016040519081016040528092919081815260200182805461267d9061547a565b80156126ca5780601f1061269f576101008083540402835291602001916126ca565b820191906000526020600020905b8154815290600101906020018083116126ad57829003601f168201915b505050505081526020016002820180546126e39061547a565b80601f016020809104026020016040519081016040528092919081815260200182805461270f9061547a565b801561275c5780601f106127315761010080835404028352916020019161275c565b820191906000526020600020905b81548152906001019060200180831161273f57829003601f168201915b50505091835250506003820154602082015260048201546001600160a01b0390811660408301526005909201549091166060909101529392505050565b60408051610100808201835260008083526020808401829052606084860181905284018290526080840182905260a0840182905260c0840182905260e08401829052868252600e8152848220868352815290849020845192830185528054835260018101549183019190915260028101805493949293919284019161281d9061547a565b80601f01602080910402602001604051908101604052809291908181526020018280546128499061547a565b80156128965780601f1061286b57610100808354040283529160200191612896565b820191906000526020600020905b81548152906001019060200180831161287957829003601f168201915b505050918352505060038201546001600160a01b039081166020830152600483015481166040830152600590920154918216606082015260ff600160a01b8304811615156080830152600160a81b909204909116151560a090910152905092915050565b612906813560c0613263565b61291581356020830135613732565b61292481356020830135613797565b6129338135602083013561380e565b7332df0486b2484f6c91dc8046608c3d567e1a385b631f2ffb69823560208401356125ba6060860160408701614b8b565b61296f866003613263565b6129798686613797565b604051630afb883f60e41b815273747be57d70527c6ce06455c55b659902898216a59063afb883f0906129bd90899089908990899089908990601a90600401615c00565b60006040518083038186803b1580156129d557600080fd5b505af41580156129e9573d6000803e3d6000fd5b50505050505050505050565b601354604051632b05429560e21b8152600481018390526060916001600160a01b03169063ac150a5490602401600060405180830381865afa158015612a3f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae29190810190615c48565b601454600390600160a81b900460ff16158015612a92575060145460ff808316600160a01b90920416105b612af55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610be2565b6014805460ff60a81b1960ff8416600160a01b021661ffff60a01b1990911617600160a81b179055612b2989898989613c43565b601380546001600160a01b03199081166001600160a01b0388811691909117909255601480548216878416179055601580548216868416179055601b80549091169184169190911790556040514281527f400175a56dd3710794078f7b9dbe8296ac94c5a248dfd51bb22ed4ab9eaa9fbf9060200160405180910390a16014805460ff60a81b1916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050505050505050565b606081612c00816131d8565b612c1d576040516366012df560e11b815260040160405180910390fd5b6000838152600a6020526040902060010180546124349061547a565b6000612c43613853565b905090565b612c54813560bc613263565b73f7f727471ba5e19f3214596e34f66c26b090a12f631873e2188235612c7d60208501856154da565b60135486356000908152600d60209081526040808320818b01358085529252918290205491516001600160e01b031960e089901b168152610d959695949391926001600160a01b039092169190600401615956565b612cdb81613c94565b326000908152600c6020526040808220805490849055905190918291849133917fce95332e6082aebeb8058a7b56d1a109f67d6550552ed04d36aca4a6acd4d7de9190a45050565b6000612d31843560cb613263565b65416e7955726960d01b6000612d47863561369d565b601354604051633610bf0960e11b81529192506000916001600160a01b0390911690636c217e1290612d819084908a908a90600401615797565b6020604051808303816000875af1158015612da0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc49190615733565b90507332df0486b2484f6c91dc8046608c3d567e1a385b6342a34a53888486858b8b604051602001612df79291906159c9565b604051602081830303815290604052600e6040518763ffffffff1660e01b8152600401612e299695949392919061574c565b60006040518083038186803b158015612e4157600080fd5b505af4158015612e55573d6000803e3d6000fd5b50939998505050505050505050565b6000612e72823560b4613263565b612f006040518060a00160405280846020016020810190612e939190614b8b565b6001600160a01b03168152602001612ebc856020016020810190612eb79190614b8b565b613cfa565b815260200160405180602001604052806000815250815260200160006001600160a01b03168152602001604051806020016040528060008152508152506000613b66565b60135460408051639ec52a2360e01b8152853560048201526024810184905290850135604482015260e06064820152600060e482018190526001600160a01b03909216608482015260a4810191909152600d60c482015290915073f7f727471ba5e19f3214596e34f66c26b090a12f90639ec52a239061010401610f2b565b6013546040516367880d6160e11b8152600481018390526000916001600160a01b03169063cf101ac290602401602060405180830381865afa158015612fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fed9190615733565b9050612ff88161174c565b6001600160a01b0316336001600160a01b03161461302957604051631b0c476f60e11b815260040160405180910390fd5b60135460405162fba02760e01b8152600481018490526000916001600160a01b03169062fba02790602401602060405180830381865afa158015613071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130959190615733565b6000838152600d60209081526040808320848452909152808220919091556013549051630852cd8d60e31b8152600481018690529192506001600160a01b0316906342966c6890602401600060405180830381600087803b1580156130f957600080fd5b505af11580156120cd573d6000803e3d6000fd5b613119813560bf613263565b737d23ee87fc5db8a2724ef3c67fd6ee5a11649349631dc8313382356131456040850160208601614b8b565b61315260408601866154da565b86356000908152600a60205260409081902090516001600160e01b031960e088901b168152610d95959493929190600401615cb5565b60006001600160e01b031982166380ac58cd60e01b14806131b957506001600160e01b03198216635b5e139f60e01b145b80610ae257506301ffc9a760e01b6001600160e01b0319831614610ae2565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061322a8261174c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61326c82613e03565b15613275575050565b6015546001600160a01b031633036132b1576000828152601960209081526040808320328452909152902054600190821c8116036132b1575050565b6000828152601960209081526040808320338452909152902054600190821c8116036132db575050565b604051632c4bc2b960e21b815260040160405180910390fd5b6132fd816131d8565b61331d576040516375af0fc960e11b815260048101829052602401610be2565b50565b604051631f8c0b6760e11b8152600481018490526001600160a01b038316602482015260448101829052601860648201526019608482015273747be57d70527c6ce06455c55b659902898216a590633f1816ce9060a4016120a1565b6000613387826131d8565b6133e85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610be2565b60006133f38361174c565b9050806001600160a01b0316846001600160a01b0316148061342e5750836001600160a01b031661342384610b7a565b6001600160a01b0316145b8061345e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166134798261174c565b6001600160a01b0316146134dd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610be2565b6001600160a01b03821661353f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610be2565b61354a838383613e63565b6135556000826131f5565b6001600160a01b038316600090815260036020526040812080546001929061357e908490615ce0565b90915550506001600160a01b03821660009081526003602052604081208054600192906135ac908490615cf3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4610d17838383613f35565b6000838152601a6020908152604080832085845290915281206136368184613f72565b15613645576000915050610ec8565b6136526002820184613f72565b15613661576001915050610ec8565b60008581526019602090815260408083206001600160a01b03871684529091529020546136949060c31c60019081161490565b95945050505050565b6000818152600a60205260408120600301805482906136bb90615a61565b918290555092915050565b6136d0338261337c565b61371c5760405162461bcd60e51b815260206004820152601b60248201527f4e4654426173653a204e6f744f776e65724f72417070726f76656400000000006044820152606401610be2565b61331d81613f94565b60606000610ec883614043565b61373b82613e03565b15613744575050565b6015546001600160a01b0316330361376a57613761828232613613565b1561376a575050565b613775828233613613565b1561377e575050565b604051631a1d1d4760e11b815260040160405180910390fd5b6000828152600e60209081526040808320848452909152902060050154600160a01b900460ff16156137dc57604051631f0fc8f560e11b815260040160405180910390fd5b6000828152600a6020526040902060030154811115611421576040516364783acb60e01b815260040160405180910390fd5b6000828152600e60209081526040808320848452909152902060050154600160a81b900460ff161561142157604051630bc06a0f60e21b815260040160405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61387e610ae8565b8051602091820120604080519283019390935291810191909152600160608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b42816060013510156138ed576040516275e96160e01b815260040160405180910390fd5b60006001846138ff6020850185615d06565b604080516000815260208181018084529490945260ff9092168282015291850135606082015290840135608082015260a0016020604051602081039080840390855afa158015613953573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615806139885750826001600160a01b0316816001600160a01b031614155b156122c457604051636a9ca51760e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b031603613a075760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610be2565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6000818152600b60205260409020541561331d57604051631b659b9f60e21b815260040160405180910390fd5b80518190601f811180613ab45750600381105b15613ad257604051636f819c2160e11b815260040160405180910390fd5b60005b818110156122c457613b06838281518110613af257613af2615940565b01602001516001600160f81b03191661409f565b600101613ad5565b6060610ec88383604051806060016040528060278152602001615eaf6027913961414d565b613b3e848484613466565b613b4a848484846141c5565b6122c45760405162461bcd60e51b8152600401610be290615d29565b6000613b7c836020015180519060200120613a74565b8115613b8f57613b8f8360200151613aa1565b601260008154613b9e90615a61565b91829055508351909150613bb290826142c6565b737d23ee87fc5db8a2724ef3c67fd6ee5a11649349634daae5688460000151856020015186604001518760600151886080015187600b600a6040518963ffffffff1660e01b8152600401613c0d989796959493929190615d7b565b60006040518083038186803b158015613c2557600080fd5b505af4158015613c39573d6000803e3d6000fd5b5050505092915050565b613c4f848484846142e0565b7f414cd0b34676984f09a5f76ce9718d4062e50283abe0e7e274a9a5b4e0c99c308484848442604051613c86959493929190615df2565b60405180910390a150505050565b6000613c9f8261174c565b6015549091506001600160a01b031633148015613cc45750326001600160a01b038216145b15613ccd575050565b6001600160a01b0381163303613ce1575050565b604051631b0c476f60e11b815260040160405180910390fd5b60408051602a80825260608281019093526f181899199a1a9b1b9c1cb0b131b232b360811b916001600160a01b0385169160009190602082018180368337019050509050600360fc1b81600081518110613d5657613d56615940565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613d8557613d85615940565b60200101906001600160f81b031916908160001a90535060295b6001811115613dfa578383600f1660108110613dbd57613dbd615940565b1a60f81b828281518110613dd357613dd3615940565b60200101906001600160f81b031916908160001a90535060049290921c9160001901613d9f565b50949350505050565b600080613e0f8361174c565b90506001600160a01b0381163303613e2a5750600192915050565b6015546001600160a01b031633148015613e4c5750326001600160a01b038216145b15613e5a5750600192915050565b50600092915050565b601b546001600160a01b03848116911614613f2a576000818152601860205260408120613e8f906142fb565b600083815260186020526040812091925090613eaa90613725565b905060005b82811015613eec57613eda84838381518110613ecd57613ecd615940565b6020026020010151614305565b80613ee481615a61565b915050613eaf565b506001600160a01b0385166000908152600c6020526040902054839003613f27576001600160a01b0385166000908152600c60205260408120555b50505b610d1783838361433e565b6001600160a01b0382166000908152600c60205260408120549003610d17576001600160a01b03919091166000908152600c602052604090205550565b6001600160a01b03811660009081526001830160205260408120541515610ec8565b6000613f9f8261174c565b9050613fad81600084613e63565b613fb86000836131f5565b6001600160a01b0381166000908152600360205260408120805460019290613fe1908490615ce0565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461142181600084613f35565b60608160000180548060200260200160405190810160405280929190818152602001828054801561409357602002820191906000526020600020905b81548152602001906001019080831161407f575b50505050509050919050565b600360fc1b6001600160f81b0319821610806140c85750603d60f91b6001600160f81b03198216115b806140f85750603960f81b6001600160f81b031982161180156140f85750606160f81b6001600160f81b03198216105b80156141125750602d60f81b6001600160f81b0319821614155b801561412c5750605f60f81b6001600160f81b0319821614155b1561331d576040516001621693dd60e01b0319815260040160405180910390fd5b6060600080856001600160a01b03168560405161416a9190615e2c565b600060405180830381855af49150503d80600081146141a5576040519150601f19603f3d011682016040523d82523d6000602084013e6141aa565b606091505b50915091506141bb868383876143f6565b9695505050505050565b60006001600160a01b0384163b156142bb57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614209903390899088908890600401615e48565b6020604051808303816000875af1925050508015614244575060408051601f3d908101601f1916820190925261424191810190615e7b565b60015b6142a1573d808015614272576040519150601f19603f3d011682016040523d82523d6000602084013e614277565b606091505b5080516000036142995760405162461bcd60e51b8152600401610be290615d29565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061345e565b506001949350505050565b61142182826040518060200160405280600081525061446f565b60006142ed84868361586d565b506001610dc182848361586d565b6000610ae2825490565b60008281526019602090815260408083206001600160a01b0385168452825280832083905584835260189091529020610d1790826144a2565b6001600160a01b0383166143995761439481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6143bc565b816001600160a01b0316836001600160a01b0316146143bc576143bc83826144b7565b6001600160a01b0382166143d357610d1781614554565b826001600160a01b0316826001600160a01b031614610d1757610d178282614603565b6060831561446557825160000361445e576001600160a01b0385163b61445e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610be2565b508161345e565b61345e8383614647565b6144798383614671565b61448660008484846141c5565b610d175760405162461bcd60e51b8152600401610be290615d29565b6000610ec8836001600160a01b0384166147b8565b600060016144c4846117dd565b6144ce9190615ce0565b600083815260076020526040902054909150808214614521576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061456690600190615ce0565b6000838152600960205260408120546008805493945090928490811061458e5761458e615940565b9060005260206000200154905080600883815481106145af576145af615940565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806145e7576145e7615e98565b6001900381819060005260206000200160009055905550505050565b600061460e836117dd565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b8151156146575781518083602001fd5b8060405162461bcd60e51b8152600401610be291906149c9565b6001600160a01b0382166146c75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610be2565b6146d0816131d8565b1561471d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610be2565b61472960008383613e63565b6001600160a01b0382166000908152600360205260408120805460019290614752908490615cf3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461142160008383613f35565b600081815260018301602052604081205480156148a15760006147dc600183615ce0565b85549091506000906147f090600190615ce0565b905081811461485557600086600001828154811061481057614810615940565b906000526020600020015490508087600001848154811061483357614833615940565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061486657614866615e98565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610ae2565b6000915050610ae2565b5080546148b79061547a565b6000825580601f106148c7575050565b601f01602090049060005260206000209081019061331d919061492d565b6040518060c001604052806000815260200160608152602001606081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b5b80821115614942576000815560010161492e565b5090565b6001600160e01b03198116811461331d57600080fd5b60006020828403121561496e57600080fd5b8135610ec881614946565b60005b8381101561499457818101518382015260200161497c565b50506000910152565b600081518084526149b5816020860160208601614979565b601f01601f19169290920160200192915050565b602081526000610ec8602083018461499d565b6000602082840312156149ee57600080fd5b5035919050565b80356001600160a01b0381168114614a0c57600080fd5b919050565b60008060408385031215614a2457600080fd5b614a2d836149f5565b946020939093013593505050565b6000606082840312156124b557600080fd5b600060608284031215614a5f57600080fd5b610ec88383614a3b565b6000608082840312156124b557600080fd5b600060208284031215614a8d57600080fd5b81356001600160401b03811115614aa357600080fd5b61345e84828501614a69565b600080600060608486031215614ac457600080fd5b83359250614ad4602085016149f5565b9150604084013590509250925092565b600080600060608486031215614af957600080fd5b614b02846149f5565b9250614ad4602085016149f5565b600080600060608486031215614b2557600080fd5b8335925060208401359150614b3c604085016149f5565b90509250925092565b600060e082840312156124b557600080fd5b600060208284031215614b6957600080fd5b81356001600160401b03811115614b7f57600080fd5b61345e84828501614b45565b600060208284031215614b9d57600080fd5b610ec8826149f5565b6000604082840312156124b557600080fd5b60008060608385031215614bcb57600080fd5b82356001600160401b03811115614be157600080fd5b614bed85828601614b45565b92505061153c8460208501614ba6565b60008083601f840112614c0f57600080fd5b5081356001600160401b03811115614c2657600080fd5b602083019150836020828501011115614c3e57600080fd5b9250929050565b600080600060408486031215614c5a57600080fd5b8335925060208401356001600160401b03811115614c7757600080fd5b614c8386828701614bfd565b9497909650939450505050565b600060808284031215614ca257600080fd5b610ec88383614a69565b60008060408385031215614cbf57600080fd5b82356001600160401b03811115614cd557600080fd5b614ce185828601614b45565b95602094909401359450505050565b60008060408385031215614d0357600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b83811015614d4b5781516001600160a01b031687529582019590820190600101614d26565b509495945050505050565b604081526000614d696040830185614d12565b82810360208401526136948185614d12565b60008060008060608587031215614d9157600080fd5b843593506020850135925060408501356001600160401b03811115614db557600080fd5b614dc187828801614bfd565b95989497509550505050565b602081526000610ec86020830184614d12565b60008060008060e08587031215614df657600080fd5b84359350614e06602086016149f5565b925060408501359150614e1c8660608701614a69565b905092959194509250565b60008060408385031215614e3a57600080fd5b82356001600160401b03811115614e5057600080fd5b614e5c85828601614b45565b92505061153c602084016149f5565b60008060408385031215614e7e57600080fd5b8235915061153c602084016149f5565b60008060208385031215614ea157600080fd5b82356001600160401b03811115614eb757600080fd5b614ec385828601614bfd565b90969095509350505050565b60208152815160208201526000602083015160c06040840152614ef560e084018261499d565b90506040840151601f19848303016060850152614f12828261499d565b91505060608401516080840152608084015160018060a01b0380821660a08601528060a08701511660c086015250508091505092915050565b80358015158114614a0c57600080fd5b60008060408385031215614f6e57600080fd5b614f77836149f5565b915061153c60208401614f4b565b60008083601f840112614f9757600080fd5b5081356001600160401b03811115614fae57600080fd5b6020830191508360208260051b8501011115614c3e57600080fd5b60008060208385031215614fdc57600080fd5b82356001600160401b03811115614ff257600080fd5b614ec385828601614f85565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561505357603f1988860301845261504185835161499d565b94509285019290850190600101615025565b5092979650505050505050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b038111828210171561509857615098615060565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150c6576150c6615060565b604052919050565b60006001600160401b038211156150e7576150e7615060565b50601f01601f191660200190565b600082601f83011261510657600080fd5b8135615119615114826150ce565b61509e565b81815284602083860101111561512e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561516157600080fd5b61516a856149f5565b9350615178602086016149f5565b92506040850135915060608501356001600160401b0381111561519a57600080fd5b6151a6878288016150f5565b91505092959194509250565b600060a082840312156124b557600080fd5b6000602082840312156151d657600080fd5b81356001600160401b038111156151ec57600080fd5b61345e848285016151b2565b6020815281516020820152602082015160408201526000604083015161010080606085015261522b61012085018361499d565b9150606085015160018060a01b0380821660808701528060808801511660a0870152505060a085015161526960c08601826001600160a01b03169052565b5060c085015180151560e08601525060e0850151801515858301525090949350505050565b600080600080600080608087890312156152a757600080fd5b863595506020870135945060408701356001600160401b03808211156152cc57600080fd5b6152d88a838b01614f85565b909650945060608901359150808211156152f157600080fd5b506152fe89828a01614f85565b979a9699509497509295939492505050565b60008060008060008060008060c0898b03121561532c57600080fd5b88356001600160401b038082111561534357600080fd5b61534f8c838d01614bfd565b909a50985060208b013591508082111561536857600080fd5b506153758b828c01614bfd565b9097509550615388905060408a016149f5565b935061539660608a016149f5565b92506153a460808a016149f5565b91506153b260a08a016149f5565b90509295985092959890939650565b600080604083850312156153d457600080fd5b6153dd836149f5565b915061153c602084016149f5565b6000602082840312156153fd57600080fd5b81356001600160401b0381111561541357600080fd5b61345e84828501614a3b565b60008060006040848603121561543457600080fd5b83356001600160401b038082111561544b57600080fd5b61545787838801614b45565b9450602086013591508082111561546d57600080fd5b50614c8386828701614bfd565b600181811c9082168061548e57607f821691505b6020821081036124b557634e487b7160e01b600052602260045260246000fd5b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b6000808335601e198436030181126154f157600080fd5b8301803591506001600160401b0382111561550b57600080fd5b602001915036819003821315614c3e57600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b88815287602082015286604082015260e06060820152600061556f60e083018789615520565b6001600160a01b0395861660808401529390941660a082015260c001529695505050505050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000808335601e198436030181126155fe57600080fd5b83016020810192503590506001600160401b0381111561561d57600080fd5b803603821315614c3e57600080fd5b80358252600061563f60208301836155e7565b60e0602086015261565460e086018284615520565b915050615663604084016149f5565b6001600160a01b03818116604087015261568060608601866155e7565b92508684036060880152615695848483615520565b935050806156a5608087016149f5565b16608087015250506156ba60a08401846155e7565b85830360a08701526156cd838284615520565b925050506156dd60c08401614f4b565b151560c08501528091505092915050565b60c08152600061570160c083018861562c565b602083810197909752604083019590955250606081019290925281830360808301526000835260a09091015201919050565b60006020828403121561574557600080fd5b5051919050565b60c08152600061575f60c083018961562c565b8760208401528660408401528560608401528281036080840152615783818661499d565b9150508260a0830152979650505050505050565b838152604060208201526000613694604083018486615520565b60008083546157bf8161547a565b600182811680156157d757600181146157ec5761581b565b60ff198416875282151583028701945061581b565b8760005260208060002060005b858110156158125781548a8201529084019082016157f9565b50505082870194505b50929695505050505050565b601f821115610d1757600081815260208120601f850160051c8101602086101561584e5750805b601f850160051c820191505b81811015611ce85782815560010161585a565b6001600160401b0383111561588457615884615060565b61589883615892835461547a565b83615827565b6000601f8411600181146158cc57600085156158b45750838201355b600019600387901b1c1916600186901b178355610dc1565b600083815260209020601f19861690835b828110156158fd57868501358255602094850194600190920191016158dd565b508682101561591a5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b602081526000610ec5602083018486615520565b634e487b7160e01b600052603260045260246000fd5b86815260a06020820152600061597060a083018789615520565b6040830195909552506001600160a01b039290921660608301526080909101529392505050565b8581528460208201526080604082015260006159b7608083018587615520565b90508260608301529695505050505050565b8183823760009101908152919050565b8581526080602082015260006159f3608083018688615520565b604083019490945250606001529392505050565b878152866020820152600060018060a01b03808816604084015260c06060840152615a3660c084018789615520565b941660808301525060a0015295945050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201615a7357615a73615a4b565b5060010190565b60006101008b83528a6020840152896040840152886060840152806080840152615aa7818401888a615520565b6001600160a01b0396871660a08501529490951660c08301525060e00152979650505050505050565b600060a08236031215615ae257600080fd5b615aea615076565b615af3836149f5565b815260208301356001600160401b0380821115615b0f57600080fd5b615b1b368387016150f5565b60208401526040850135915080821115615b3457600080fd5b615b40368387016150f5565b6040840152615b51606086016149f5565b60608401526080850135915080821115615b6a57600080fd5b50615b77368286016150f5565b60808301525092915050565b86815285602082015260018060a01b038516604082015260a060608201526000615bb160a083018587615520565b9050826080830152979650505050505050565b8183526000602080850194508260005b85811015614d4b576001600160a01b03615bed836149f5565b1687529582019590820190600101615bd4565b87815286602082015260a060408201526000615c2060a083018789615bc4565b8281036060840152615c33818688615bc4565b91505082608083015298975050505050505050565b600060208284031215615c5a57600080fd5b81516001600160401b03811115615c7057600080fd5b8201601f81018413615c8157600080fd5b8051615c8f615114826150ce565b818152856020838501011115615ca457600080fd5b613694826020830160208601614979565b8581526001600160a01b03851660208201526080604082018190526000906159b79083018587615520565b81810381811115610ae257610ae2615a4b565b80820180821115610ae257610ae2615a4b565b600060208284031215615d1857600080fd5b813560ff81168114610ec857600080fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03898116825261010060208301819052600091615da18483018c61499d565b91508382036040850152615db5828b61499d565b908916606085015283810360808501529050615dd1818861499d565b60a0840196909652505060c081019290925260e09091015295945050505050565b606081526000615e06606083018789615520565b8281036020840152615e19818688615520565b9150508260408301529695505050505050565b60008251615e3e818460208701614979565b9190910192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141bb9083018461499d565b600060208284031215615e8d57600080fd5b8151610ec881614946565b634e487b7160e01b600052603160045260246000fdfe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220af8df0be171724531282ac9d1c8e142612624b95ce276cba153bada829d371dc64736f6c63430008120033