Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ChadInuVIPClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: MIT import "./ERC721Upgradeable.sol"; import "./Counters.sol"; import "./IERC20.sol"; import "./StringsUpgradeable.sol"; import "./Initializable.sol"; import "./OwnableUpgradable.sol"; import "./ContextUpgradeable.sol"; pragma solidity ^0.8.0; contract ChadInuVIPClub is Initializable, OwnableUpgradeable, ERC721Upgradeable { using Counters for Counters.Counter; struct VIPCardEntity { uint256 creationTime; address account; string referrerCode; uint256 rewardAmount; bool isReferred; bool isOutDeadline; } mapping(address => string[]) private _subRefOfUser; mapping(string => VIPCardEntity) private _vipCardOfUser; mapping(address => string) private _userOfAccount; mapping(address => uint256) private _ownerOfId; mapping(address => bool) public _isWhitelisted; Counters.Counter private _tokenIds; mapping(uint256 => string) private _tokenURIs; IERC20 public token; uint256 public refFee; uint256 public escowFee; uint256 public primaryFee; address public secondaryDevAddress; uint256 public referralDeadline; uint256 public mintingPrice; uint256 public mintingPriceWithRef; string public baseTokenURI; mapping(address => bool) public _isBlacklisted; event NFTMinted( uint256 tokenId, address account, string usercode, string referrerCode, string metadataUri ); function initialize() public initializer { __ERC721_init_unchained("Chadinu VIP Card", "VIP Card"); __Ownable_init_unchained(); refFee = 33; escowFee = 33; primaryFee = 75; secondaryDevAddress = 0xC040e348fC48Ecd2ab355499211BF208B3891837; referralDeadline = 86400 * 14; mintingPrice = 2 * 10**17; mintingPriceWithRef = 15 * 10**16; } function _transfer( address from, address to, uint256 tokenId ) internal override { require(from == address(0), "You can't transfer this NFT."); super._transfer(from, to, tokenId); } function mintNFT(address owner, string memory metadataURI) internal returns (uint256) { _tokenIds.increment(); uint256 id = _tokenIds.current(); _safeMint(owner, id); _setTokenURI(id, metadataURI); return id; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(baseTokenURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(baseTokenURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string( abi.encodePacked( baseTokenURI, StringsUpgradeable.toString(tokenId) ) ); } function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require( _exists(tokenId), "ERC721Metadata: URI set of nonexistent token" ); _tokenURIs[tokenId] = _tokenURI; } function MintVIPCard(string memory usercode, string memory metadataURI) external payable returns (uint256) { require( msg.value >= mintingPrice || _isWhitelisted[msg.sender], "Insufficient Fund" ); payToMintWithoutReferrer(_msgSender(), usercode); uint256 id = mintNFT(_msgSender(), metadataURI); _ownerOfId[_msgSender()] = id; if (msg.value > mintingPrice) payable(_msgSender()).transfer(msg.value - mintingPrice); emit NFTMinted(id, _msgSender(), usercode, "", metadataURI); return id; } function MintVIPCardWithReferreral( string memory usercode, string memory referrerCode, string memory metadataURI ) external payable returns (uint256) { require(msg.value >= mintingPriceWithRef, "Insufficient Fund"); payToMintWithReferrer(_msgSender(), usercode, referrerCode); uint256 id = mintNFT(_msgSender(), metadataURI); _ownerOfId[_msgSender()] = id; if (msg.value > mintingPriceWithRef) payable(_msgSender()).transfer(msg.value - mintingPriceWithRef); emit NFTMinted(id, _msgSender(), usercode, referrerCode, metadataURI); return id; } function payToMintWithoutReferrer(address creator, string memory usercode) internal { require( bytes(_userOfAccount[creator]).length < 2, "Account has already minted an NFT." ); require( bytes(usercode).length > 1 && bytes(usercode).length < 16, "ERROR: user code length is invalid" ); require(creator != address(0), "CSHT: zero address can't create"); require( _vipCardOfUser[usercode].account == address(0), "user code is already used" ); _vipCardOfUser[usercode] = VIPCardEntity({ creationTime: block.timestamp, account: creator, referrerCode: "", rewardAmount: 0, isReferred: false, isOutDeadline: false }); _userOfAccount[creator] = usercode; if (_isWhitelisted[creator]) return; payable(secondaryDevAddress).transfer(mintingPrice); } function payToMintWithReferrer( address creator, string memory usercode, string memory referrerCode ) internal returns (bool) { require( bytes(_userOfAccount[creator]).length < 2, "Account has already minted an NFT." ); require( bytes(usercode).length > 1 && bytes(usercode).length < 16, "ERROR: user code length is invalid" ); require( bytes(referrerCode).length > 1 && bytes(referrerCode).length < 16, "ERROR: referrer code length is invalid" ); require( _vipCardOfUser[usercode].account == address(0), "usercode is already used" ); require(creator != address(0), "CSHT: creation from the zero address"); require( _vipCardOfUser[referrerCode].account != address(0), "referrer code is not exisiting" ); require( _vipCardOfUser[referrerCode].account != creator, "creator couldn't be same as referrer" ); uint256 escrowAmount = (mintingPriceWithRef * escowFee) / 100; uint256 refAmount = (mintingPriceWithRef * refFee) / 100; uint256 devAmount = mintingPriceWithRef - escrowAmount - refAmount; VIPCardEntity memory _ref = _vipCardOfUser[referrerCode]; _subRefOfUser[_ref.account].push(usercode); if (_ref.isOutDeadline != true && bytes(_ref.referrerCode).length > 1) { VIPCardEntity storage _refT = _vipCardOfUser[referrerCode]; if (block.timestamp - _ref.creationTime < referralDeadline) { if (_ref.rewardAmount > 0) { if ( isBlacklisted(_vipCardOfUser[_ref.referrerCode].account) ) { payable(secondaryDevAddress).transfer( _ref.rewardAmount ); } else { payable(_vipCardOfUser[_ref.referrerCode].account) .transfer(_ref.rewardAmount); } } _refT.isReferred = true; } else { _refT.isReferred = false; } _refT.isOutDeadline = true; } if (mintingPriceWithRef > 100) { if (isBlacklisted(_ref.account)) { payable(secondaryDevAddress).transfer(devAmount + refAmount); } else { payable(_ref.account).transfer(refAmount); payable(secondaryDevAddress).transfer(devAmount); } } _vipCardOfUser[usercode] = VIPCardEntity({ creationTime: block.timestamp, account: creator, referrerCode: referrerCode, rewardAmount: escrowAmount, isReferred: false, isOutDeadline: false }); _userOfAccount[creator] = usercode; return true; } function isCodeAvailable(string memory code) external view returns (bool) { return (_vipCardOfUser[code].creationTime == 0 && bytes(code).length > 1 && bytes(code).length < 16); } function addWhitelist(address account, bool value) external { require( msg.sender == address(token) || msg.sender == owner(), "Access Denied" ); _isWhitelisted[account] = value; } function checkWhitelisted(address account) external view returns (bool) { return _isWhitelisted[account]; } function addBlacklist(address account, bool value) public onlyOwner { _isBlacklisted[account] = value; } function isBlacklisted(address account) public view returns (bool) { return _isBlacklisted[account]; } function getSubReferralLength(address account) external view returns (uint256) { return _subRefOfUser[account].length; } function getSubReferral( address account, uint16 startIndex, uint16 endIndex ) external view returns (string memory) { require( _subRefOfUser[account].length > endIndex, "GET SUB REFERRERS: Out of Range" ); string[] memory subRefs = _subRefOfUser[account]; VIPCardEntity memory _ref; string memory refsStr = ""; string memory separator = "#"; for (uint256 i = startIndex; i < endIndex + 1; i++) { _ref = _vipCardOfUser[subRefs[i]]; refsStr = string( abi.encodePacked( refsStr, separator, _userOfAccount[_ref.account], separator, toAsciiString(_ref.account), separator, StringsUpgradeable.toString(_ref.creationTime), separator, StringsUpgradeable.toString(_ref.rewardAmount) ) ); if (_ref.isReferred == true) { string[] memory childRefStrs = _subRefOfUser[_ref.account]; VIPCardEntity memory _childRef = _vipCardOfUser[ childRefStrs[0] ]; refsStr = string( abi.encodePacked( refsStr, separator, "1", separator, StringsUpgradeable.toString(_childRef.creationTime) ) ); } else { refsStr = string( abi.encodePacked(refsStr, separator, "0", separator, "0") ); } if (_ref.isOutDeadline == true) { refsStr = string(abi.encodePacked(refsStr, separator, "1")); } else { refsStr = string(abi.encodePacked(refsStr, separator, "0")); } } return refsStr; } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint256 i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint256(uint160(x)) / (2**(8 * (19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2 * i] = char(hi); s[2 * i + 1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } receive() external payable {} function boostProject(uint256 amount) public onlyOwner { if (amount > address(this).balance) amount = address(this).balance; payable(owner()).transfer(amount); } function setBaseToken(address newAddress) external onlyOwner { require( newAddress != address(token), "New token address is same as old one" ); token = IERC20(newAddress); } function getbalanceOf(address account) external view returns (uint256) { return token.balanceOf(account); } function getIdOfUser(address account) external view returns (uint256) { require(account != address(0), "address CAN'T BE ZERO"); return _ownerOfId[account]; } function getUsercode(address account) external view returns (string memory) { return _userOfAccount[account]; } function getMintPrice() external view returns (uint256) { return mintingPrice; } function setMintingPrice(uint256 newMintingPrice) external onlyOwner { mintingPrice = newMintingPrice; } function getMintPriceWithRef() external view returns (uint256) { return mintingPriceWithRef; } function setMintingPriceWithRef(uint256 newMintingPriceWithRef) external onlyOwner { mintingPriceWithRef = newMintingPriceWithRef; } function getSecondaryDevAddress() external view returns (address) { return secondaryDevAddress; } function setSecondaryDevAddress(address newAddress) external onlyOwner { require( newAddress != secondaryDevAddress, "New secondary dev address is same as old one" ); secondaryDevAddress = newAddress; } function getReferreralDeadline() external view returns (uint256) { return referralDeadline; } function changeReferreralDeadline(uint256 newDeadline) external onlyOwner { referralDeadline = newDeadline; } function changeRefFee(uint256 value) external onlyOwner { refFee = value; } function changeEscowFee(uint256 value) external onlyOwner { escowFee = value; } function changePrimaryFee(uint256 value) external onlyOwner { primaryFee = value; } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) external onlyOwner { baseTokenURI = baseURI; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "./Initializable.sol"; /** * @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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "./Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; import "./IERC721ReceiverUpgradeable.sol"; import "./IERC721MetadataUpgradeable.sol"; import "./AddressUpgradeable.sol"; import "./ContextUpgradeable.sol"; import "./StringsUpgradeable.sol"; import "./ERC165Upgradeable.sol"; import "./Initializable.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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721Upgradeable.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721Upgradeable.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[44] private __gap; }
// 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 IERC165Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 IERC721ReceiverUpgradeable { /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.0; import "./AddressUpgradeable.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] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./ContextUpgradeable.sol"; import "./Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"string","name":"usercode","type":"string"},{"indexed":false,"internalType":"string","name":"referrerCode","type":"string"},{"indexed":false,"internalType":"string","name":"metadataUri","type":"string"}],"name":"NFTMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"usercode","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"MintVIPCard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"usercode","type":"string"},{"internalType":"string","name":"referrerCode","type":"string"},{"internalType":"string","name":"metadataURI","type":"string"}],"name":"MintVIPCardWithReferreral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"addBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"boostProject","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeEscowFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changePrimaryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"changeRefFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDeadline","type":"uint256"}],"name":"changeReferreralDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escowFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getIdOfUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPriceWithRef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferreralDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"}],"name":"getSubReferral","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getSubReferralLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUsercode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getbalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"code","type":"string"}],"name":"isCodeAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingPriceWithRef","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"secondaryDevAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingPrice","type":"uint256"}],"name":"setMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintingPriceWithRef","type":"uint256"}],"name":"setMintingPriceWithRef","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setSecondaryDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506144df806100206000396000f3fe6080604052600436106103395760003560e01c80638129fc1c116101ab578063c87b56dd116100f7578063e985e9c511610095578063f9cb9e891161006f578063f9cb9e891461099f578063fc0c546a146109b5578063fcc9d262146109d5578063fe575a87146109f557600080fd5b8063e985e9c514610920578063ec2e0ab314610969578063f2fde38b1461097f57600080fd5b8063d848f3ea116100d1578063d848f3ea146108ab578063dc88fdb7146108cb578063dcf141ea146108e0578063decc1a861461090057600080fd5b8063c87b56dd14610861578063d547cfb714610881578063d68cda3b1461089657600080fd5b8063a22cb46511610164578063b211e9381161013e578063b211e938146107ee578063b24f4b8d14610801578063b65076a214610821578063b88d4fde1461084157600080fd5b8063a22cb46514610799578063a7f93ebd146107b9578063a879b632146107ce57600080fd5b80638129fc1c146106e35780638417b47f146106f85780638ae21b66146107185780638da5cb5b1461073657806395d89b41146107545780639cee21421461076957600080fd5b806340015e60116102855780636352211e11610223578063715018a6116101fd578063715018a6146106785780637561a71d1461068d57806378e8cde1146106a35780637c43548c146106c357600080fd5b80636352211e1461061857806370a082311461063857806370e224ba1461065857600080fd5b806347e851fa1161025f57806347e851fa146105a257806348ed51ca146105c25780635580d89c146105e257806355f804b3146105f857600080fd5b806340015e601461053957806342842e0e1461056f57806343fa5e6a1461058f57600080fd5b806317061e65116102f257806320d8dad0116102cc57806320d8dad0146104aa57806323b872dd146104e357806335db70b5146105035780633714020e1461051957600080fd5b806317061e651461043a57806317ca2e411461045a5780631cdd3be31461047a57600080fd5b806301ffc9a71461034557806306fdde031461037a578063081812fc1461039c578063095ea7b3146103d45780630e68460e146103f657806316bb6c131461041a57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b50610365610360366004613a36565b610a2e565b60405190151581526020015b60405180910390f35b34801561038657600080fd5b5061038f610a80565b6040516103719190613ef2565b3480156103a857600080fd5b506103bc6103b7366004613b91565b610b12565b6040516001600160a01b039091168152602001610371565b3480156103e057600080fd5b506103f46103ef366004613a0c565b610bac565b005b34801561040257600080fd5b5061040c60d75481565b604051908152602001610371565b34801561042657600080fd5b506103f4610435366004613887565b610cc2565b34801561044657600080fd5b506103f4610455366004613b91565b610d78565b34801561046657600080fd5b506103f461047536600461398d565b610deb565b34801561048657600080fd5b50610365610495366004613887565b60d96020526000908152604090205460ff1681565b3480156104b657600080fd5b506103656104c5366004613887565b6001600160a01b0316600090815260cd602052604090205460ff1690565b3480156104ef57600080fd5b506103f46104fe3660046138d5565b610e40565b34801561050f57600080fd5b5061040c60d65481565b34801561052557600080fd5b506103f461053436600461398d565b610e71565b34801561054557600080fd5b5061040c610554366004613887565b6001600160a01b0316600090815260c9602052604090205490565b34801561057b57600080fd5b506103f461058a3660046138d5565b610efb565b61040c61059d366004613b09565b610f16565b3480156105ae57600080fd5b5061040c6105bd366004613887565b61101a565b3480156105ce57600080fd5b5061038f6105dd3660046139c9565b611098565b3480156105ee57600080fd5b5061040c60d55481565b34801561060457600080fd5b506103f4610613366004613a70565b611709565b34801561062457600080fd5b506103bc610633366004613b91565b611746565b34801561064457600080fd5b5061040c610653366004613887565b6117bd565b34801561066457600080fd5b5061040c610673366004613887565b611844565b34801561068457600080fd5b506103f46118b0565b34801561069957600080fd5b5061040c60d35481565b3480156106af57600080fd5b506103f46106be366004613b91565b6118e6565b3480156106cf57600080fd5b506103f46106de366004613b91565b611915565b3480156106ef57600080fd5b506103f4611944565b34801561070457600080fd5b506103f4610713366004613b91565b611a2b565b34801561072457600080fd5b5060d4546001600160a01b03166103bc565b34801561074257600080fd5b506033546001600160a01b03166103bc565b34801561076057600080fd5b5061038f611a5a565b34801561077557600080fd5b50610365610784366004613887565b60cd6020526000908152604090205460ff1681565b3480156107a557600080fd5b506103f46107b436600461398d565b611a69565b3480156107c557600080fd5b5060d65461040c565b3480156107da57600080fd5b5060d4546103bc906001600160a01b031681565b61040c6107fc366004613aa5565b611a74565b34801561080d57600080fd5b5061036561081c366004613a70565b611b8b565b34801561082d57600080fd5b506103f461083c366004613b91565b611bca565b34801561084d57600080fd5b506103f461085c366004613911565b611bf9565b34801561086d57600080fd5b5061038f61087c366004613b91565b611c31565b34801561088d57600080fd5b5061038f611db2565b3480156108a257600080fd5b5060d75461040c565b3480156108b757600080fd5b506103f46108c6366004613b91565b611e40565b3480156108d757600080fd5b5060d55461040c565b3480156108ec57600080fd5b506103f46108fb366004613887565b611e6f565b34801561090c57600080fd5b506103f461091b366004613b91565b611f2e565b34801561092c57600080fd5b5061036561093b3660046138a2565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b34801561097557600080fd5b5061040c60d15481565b34801561098b57600080fd5b506103f461099a366004613887565b611f5d565b3480156109ab57600080fd5b5061040c60d25481565b3480156109c157600080fd5b5060d0546103bc906001600160a01b031681565b3480156109e157600080fd5b5061038f6109f0366004613887565b611ff5565b348015610a0157600080fd5b50610365610a10366004613887565b6001600160a01b0316600090815260d9602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480610a5f57506001600160e01b03198216635b5e139f60e01b145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060978054610a8f906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610abb906143d1565b8015610b085780601f10610add57610100808354040283529160200191610b08565b820191906000526020600020905b815481529060010190602001808311610aeb57829003601f168201915b5050505050905090565b6000818152609960205260408120546001600160a01b0316610b905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609b60205260409020546001600160a01b031690565b6000610bb782611746565b9050806001600160a01b0316836001600160a01b03161415610c255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b87565b336001600160a01b0382161480610c415750610c41813361093b565b610cb35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b87565b610cbd83836120a1565b505050565b6033546001600160a01b03163314610cec5760405162461bcd60e51b8152600401610b8790613fe8565b60d0546001600160a01b0382811691161415610d565760405162461bcd60e51b8152602060048201526024808201527f4e657720746f6b656e20616464726573732069732073616d65206173206f6c64604482015263206f6e6560e01b6064820152608401610b87565b60d080546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610da25760405162461bcd60e51b8152600401610b8790613fe8565b47811115610dad5750475b6033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610de7573d6000803e3d6000fd5b5050565b6033546001600160a01b03163314610e155760405162461bcd60e51b8152600401610b8790613fe8565b6001600160a01b0391909116600090815260d960205260409020805460ff1916911515919091179055565b610e4a338261210f565b610e665760405162461bcd60e51b8152600401610b879061405f565b610cbd838383612206565b60d0546001600160a01b0316331480610e9457506033546001600160a01b031633145b610ed05760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b6044820152606401610b87565b6001600160a01b0391909116600090815260cd60205260409020805460ff1916911515919091179055565b610cbd83838360405180602001604052806000815250611bf9565b600060d754341015610f5e5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610b87565b610f69338585612268565b506000610f77335b84612a88565b33600090815260cc6020526040902081905560d754909150341115610fd35760d75433906108fc90610fa9903461436b565b6040518115909202916000818181858888f19350505050158015610fd1573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb813387878760405161100a9594939291906140fb565b60405180910390a1949350505050565b60d0546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561106057600080fd5b505afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190613baa565b6001600160a01b038316600090815260c9602052604090205460609061ffff8316106111065760405162461bcd60e51b815260206004820152601f60248201527f47455420535542205245464552524552533a204f7574206f662052616e6765006044820152606401610b87565b6001600160a01b038416600090815260c96020908152604080832080548251818502810185019093528083529192909190849084015b828210156111e857838290600052602060002001805461115b906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611187906143d1565b80156111d45780601f106111a9576101008083540402835291602001916111d4565b820191906000526020600020905b8154815290600101906020018083116111b757829003601f168201915b50505050508152602001906001019061113c565b5050505090506112346040518060c001604052806000815260200160006001600160a01b0316815260200160608152602001600081526020016000151581526020016000151581525090565b604080516020808201835260008252825180840190935260018352602360f81b908301529061ffff87165b61126a8760016141b0565b61ffff168110156116fc5760ca85828151811061128957611289614467565b602002602001015160405161129e9190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916112e3906143d1565b80601f016020809104026020016040519081016040528092919081815260200182805461130f906143d1565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff808216151560408085019190915261010090920416151560609092019190915282820180516001600160a01b0316600090815260cb90935291209051919550849184919082906113c990612ac0565b866113d78a60000151612c07565b886113e58c60600151612c07565b6040516020016113fd99989796959493929190613ca5565b604051602081830303815290604052925083608001511515600115151415611666576020808501516001600160a01b0316600090815260c9825260408082208054825181860281018601909352808352929391929091849084015b82821015611504578382906000526020600020018054611477906143d1565b80601f01602080910402602001604051908101604052809291908181526020018280546114a3906143d1565b80156114f05780601f106114c5576101008083540402835291602001916114f0565b820191906000526020600020905b8154815290600101906020018083116114d357829003601f168201915b505050505081526020019060010190611458565b505050509050600060ca8260008151811061152157611521614467565b60200260200101516040516115369190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b031691840191909152600281018054919284019161157b906143d1565b80601f01602080910402602001604051908101604052809291908181526020018280546115a7906143d1565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505091835250506003820154602082015260049091015460ff80821615156040840152610100909104161515606090910152805190915085908590819061163b90612c07565b60405160200161164e9493929190613e29565b6040516020818303038152906040529450505061168d565b82828360405160200161167b93929190613d94565b60405160208183030381529060405292505b60a08401511515600114156116c55782826040516020016116af929190613dee565b60405160208183030381529060405292506116ea565b82826040516020016116d8929190613d59565b60405160208183030381529060405292505b806116f48161440c565b91505061125f565b5090979650505050505050565b6033546001600160a01b031633146117335760405162461bcd60e51b8152600401610b8790613fe8565b8051610de79060d890602084019061372f565b6000818152609960205260408120546001600160a01b031680610a7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b87565b60006001600160a01b0382166118285760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b87565b506001600160a01b03166000908152609a602052604090205490565b60006001600160a01b0382166118945760405162461bcd60e51b8152602060048201526015602482015274616464726573732043414e2754204245205a45524f60581b6044820152606401610b87565b506001600160a01b0316600090815260cc602052604090205490565b6033546001600160a01b031633146118da5760405162461bcd60e51b8152600401610b8790613fe8565b6118e46000612d05565b565b6033546001600160a01b031633146119105760405162461bcd60e51b8152600401610b8790613fe8565b60d555565b6033546001600160a01b0316331461193f5760405162461bcd60e51b8152600401610b8790613fe8565b60d355565b60006119506001612d57565b90508015611968576000805461ff0019166101001790555b6119ba6040518060400160405280601081526020016f10da18591a5b9d481592540810d85c9960821b815250604051806040016040528060088152602001671592540810d85c9960c21b815250612de4565b6119c2612e32565b602160d181905560d255604b60d35560d480546001600160a01b03191673c040e348fc48ecd2ab355499211bf208b38918371790556212750060d5556702c68af0bb14000060d655670214e8348c4f000060d7558015611a28576000805461ff00191690555b50565b6033546001600160a01b03163314611a555760405162461bcd60e51b8152600401610b8790613fe8565b60d655565b606060988054610a8f906143d1565b610de7338383612e62565b600060d65434101580611a96575033600090815260cd602052604090205460ff165b611ad65760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610b87565b611ae03384612f31565b6000611aeb33610f71565b33600090815260cc6020526040902081905560d654909150341115611b475760d65433906108fc90611b1d903461436b565b6040518115909202916000818181858888f19350505050158015611b45573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb81338686604051611b7c9493929190614157565b60405180910390a19392505050565b600060ca82604051611b9d9190613c89565b90815260405190819003602001902054158015611bbb575060018251115b8015610a7a5750505160101190565b6033546001600160a01b03163314611bf45760405162461bcd60e51b8152600401610b8790613fe8565b60d755565b611c03338361210f565b611c1f5760405162461bcd60e51b8152600401610b879061405f565b611c2b848484846131f6565b50505050565b6000818152609960205260409020546060906001600160a01b0316611cb05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b87565b600082815260cf602052604081208054611cc9906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf5906143d1565b8015611d425780601f10611d1757610100808354040283529160200191611d42565b820191906000526020600020905b815481529060010190602001808311611d2557829003601f168201915b5050505050905060d88054611d56906143d1565b15159050611d645792915050565b805115611d965760d881604051602001611d7f929190613e90565b604051602081830303815290604052915050919050565b60d8611da184612c07565b604051602001611d7f929190613e90565b60d88054611dbf906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611deb906143d1565b8015611e385780601f10611e0d57610100808354040283529160200191611e38565b820191906000526020600020905b815481529060010190602001808311611e1b57829003601f168201915b505050505081565b6033546001600160a01b03163314611e6a5760405162461bcd60e51b8152600401610b8790613fe8565b60d255565b6033546001600160a01b03163314611e995760405162461bcd60e51b8152600401610b8790613fe8565b60d4546001600160a01b0382811691161415611f0c5760405162461bcd60e51b815260206004820152602c60248201527f4e6577207365636f6e646172792064657620616464726573732069732073616d60448201526b65206173206f6c64206f6e6560a01b6064820152608401610b87565b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611f585760405162461bcd60e51b8152600401610b8790613fe8565b60d155565b6033546001600160a01b03163314611f875760405162461bcd60e51b8152600401610b8790613fe8565b6001600160a01b038116611fec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b87565b611a2881612d05565b6001600160a01b038116600090815260cb6020526040902080546060919061201c906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612048906143d1565b80156120955780601f1061206a57610100808354040283529160200191612095565b820191906000526020600020905b81548152906001019060200180831161207857829003601f168201915b50505050509050919050565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120d682611746565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152609960205260408120546001600160a01b03166121885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b87565b600061219383611746565b9050806001600160a01b0316846001600160a01b031614806121da57506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b806121fe5750836001600160a01b03166121f384610b12565b6001600160a01b0316145b949350505050565b6001600160a01b0383161561225d5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e2774207472616e736665722074686973204e46542e000000006044820152606401610b87565b610cbd838383613229565b6001600160a01b038316600090815260cb6020526040812080546002919061228f906143d1565b9050106122ae5760405162461bcd60e51b8152600401610b879061401d565b600183511180156122c0575060108351105b6122dc5760405162461bcd60e51b8152600401610b8790613f05565b600182511180156122ee575060108251105b61234a5760405162461bcd60e51b815260206004820152602760248201527f4552524f523a2020726566657272657220636f6465206c656e677468206973206044820152661a5b9d985b1a5960ca1b6064820152608401610b87565b60006001600160a01b031660ca846040516123659190613c89565b908152604051908190036020019020600101546001600160a01b0316146123ce5760405162461bcd60e51b815260206004820152601860248201527f75736572636f646520697320616c7265616479207573656400000000000000006044820152606401610b87565b6001600160a01b0384166124325760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b87565b60006001600160a01b031660ca8360405161244d9190613c89565b908152604051908190036020019020600101546001600160a01b031614156124b75760405162461bcd60e51b815260206004820152601e60248201527f726566657272657220636f6465206973206e6f7420657869736974696e6700006044820152606401610b87565b836001600160a01b031660ca836040516124d19190613c89565b908152604051908190036020019020600101546001600160a01b031614156125475760405162461bcd60e51b8152602060048201526024808201527f63726561746f7220636f756c646e27742062652073616d652061732072656665604482015263393932b960e11b6064820152608401610b87565b6000606460d25460d75461255b919061432b565b612565919061420a565b90506000606460d15460d75461257b919061432b565b612585919061420a565b90506000818360d754612598919061436b565b6125a2919061436b565b9050600060ca866040516125b69190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916125fb906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612627906143d1565b80156126745780601f1061264957610100808354040283529160200191612674565b820191906000526020600020905b81548152906001019060200180831161265757829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff8082161515604080850191909152610100909204161515606090920191909152828201516001600160a01b0316600090815260c983529081208054600181018255908252908290208a519394506126ee939101918a019061372f565b5060a0810151151560011480159061270b57506001816040015151115b1561288257600060ca876040516127229190613c89565b9081526020016040518091039020905060d554826000015142612745919061436b565b101561286457606082015115612850576127a660ca836040015160405161276c9190613c89565b908152604051908190036020019020600101546001600160a01b03166001600160a01b0316600090815260d9602052604090205460ff1690565b156127ef5760d45460608301516040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156127e9573d6000803e3d6000fd5b50612850565b60ca82604001516040516128039190613c89565b9081526040519081900360200181206001015460608401516001600160a01b039091169181156108fc0291906000818181858888f1935050505015801561284e573d6000803e3d6000fd5b505b60048101805460ff19166001179055612871565b60048101805460ff191690555b600401805461ff0019166101001790555b606460d7541115612979576128b381602001516001600160a01b0316600090815260d9602052604090205460ff1690565b156128ff5760d4546001600160a01b03166108fc6128d185856141cd565b6040518115909202916000818181858888f193505050501580156128f9573d6000803e3d6000fd5b50612979565b80602001516001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561293c573d6000803e3d6000fd5b5060d4546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612977573d6000803e3d6000fd5b505b6040805160c0810182524281526001600160a01b038a1660208201528082018890526060810186905260006080820181905260a0820152905160ca906129c0908a90613c89565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b039092169190911790559083015180519192612a149260028501929091019061372f565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038816600090815260cb602090815260409091208851612a79928a019061372f565b50600198975050505050505050565b6000612a9860ce80546001019055565b6000612aa360ce5490565b9050612aaf84826133c5565b612ab981846133df565b9392505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015612c00576000612afd82601361436b565b612b0890600861432b565b612b13906002614283565b612b26906001600160a01b03871661420a565b60f81b9050600060108260f81c612b3d919061421e565b60f81b905060008160f81c6010612b54919061434a565b8360f81c612b629190614382565b60f81b9050612b7082613477565b85612b7c86600261432b565b81518110612b8c57612b8c614467565b60200101906001600160f81b031916908160001a905350612bac81613477565b85612bb886600261432b565b612bc39060016141cd565b81518110612bd357612bd3614467565b60200101906001600160f81b031916908160001a9053505050508080612bf89061440c565b915050612ae7565b5092915050565b606081612c2b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c555780612c3f8161440c565b9150612c4e9050600a8361420a565b9150612c2f565b60008167ffffffffffffffff811115612c7057612c7061447d565b6040519080825280601f01601f191660200182016040528015612c9a576020820181803683370190505b5090505b84156121fe57612caf60018361436b565b9150612cbc600a86614427565b612cc79060306141cd565b60f81b818381518110612cdc57612cdc614467565b60200101906001600160f81b031916908160001a905350612cfe600a8661420a565b9450612c9e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615612d9e578160ff166001148015612d7a5750303b155b612d965760405162461bcd60e51b8152600401610b8790613f9a565b506000919050565b60005460ff808416911610612dc55760405162461bcd60e51b8152600401610b8790613f9a565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff16612e0b5760405162461bcd60e51b8152600401610b87906140b0565b8151612e1e90609790602085019061372f565b508051610cbd90609890602084019061372f565b600054610100900460ff16612e595760405162461bcd60e51b8152600401610b87906140b0565b6118e433612d05565b816001600160a01b0316836001600160a01b03161415612ec45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b87565b6001600160a01b038381166000818152609c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038216600090815260cb60205260409020805460029190612f58906143d1565b905010612f775760405162461bcd60e51b8152600401610b879061401d565b60018151118015612f89575060108151105b612fa55760405162461bcd60e51b8152600401610b8790613f05565b6001600160a01b038216612ffb5760405162461bcd60e51b815260206004820181905260248201527f435348543a20207a65726f20616464726573732063616e2774206372656174656044820152606401610b87565b60006001600160a01b031660ca826040516130169190613c89565b908152604051908190036020019020600101546001600160a01b03161461307f5760405162461bcd60e51b815260206004820152601960248201527f7573657220636f646520697320616c72656164792075736564000000000000006044820152606401610b87565b6040518060c00160405280428152602001836001600160a01b03168152602001604051806020016040528060008152508152602001600081526020016000151581526020016000151581525060ca826040516130db9190613c89565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b03909216919091179055908301518051919261312f9260028501929091019061372f565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038216600090815260cb6020908152604090912082516131949284019061372f565b506001600160a01b038216600090815260cd602052604090205460ff16156131ba575050565b60d45460d6546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610cbd573d6000803e3d6000fd5b613201848484612206565b61320d848484846134ad565b611c2b5760405162461bcd60e51b8152600401610b8790613f48565b826001600160a01b031661323c82611746565b6001600160a01b0316146132a05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b87565b6001600160a01b0382166133025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b87565b61330d6000826120a1565b6001600160a01b0383166000908152609a6020526040812080546001929061333690849061436b565b90915550506001600160a01b0382166000908152609a602052604081208054600192906133649084906141cd565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610de78282604051806020016040528060008152506135ba565b6000828152609960205260409020546001600160a01b03166134585760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b87565b600082815260cf602090815260409091208251610cbd9284019061372f565b6000600a60f883901c101561349e5761349560f883901c60306141e5565b60f81b92915050565b61349560f883901c60576141e5565b60006001600160a01b0384163b156135af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134f1903390899088908890600401613eb5565b602060405180830381600087803b15801561350b57600080fd5b505af192505050801561353b575060408051601f3d908101601f1916820190925261353891810190613a53565b60015b613595573d808015613569576040519150601f19603f3d011682016040523d82523d6000602084013e61356e565b606091505b50805161358d5760405162461bcd60e51b8152600401610b8790613f48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121fe565b506001949350505050565b6135c483836135ed565b6135d160008484846134ad565b610cbd5760405162461bcd60e51b8152600401610b8790613f48565b6001600160a01b0382166136435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b87565b6000818152609960205260409020546001600160a01b0316156136a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b87565b6001600160a01b0382166000908152609a602052604081208054600192906136d19084906141cd565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461373b906143d1565b90600052602060002090601f01602090048101928261375d57600085556137a3565b82601f1061377657805160ff19168380011785556137a3565b828001600101855582156137a3579182015b828111156137a3578251825591602001919060010190613788565b506137af9291506137b3565b5090565b5b808211156137af57600081556001016137b4565b600067ffffffffffffffff808411156137e3576137e361447d565b604051601f8501601f19908116603f0116810190828211818310171561380b5761380b61447d565b8160405280935085815286868601111561382457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612ddf57600080fd5b600082601f83011261386657600080fd5b612ab9838335602085016137c8565b803561ffff81168114612ddf57600080fd5b60006020828403121561389957600080fd5b612ab98261383e565b600080604083850312156138b557600080fd5b6138be8361383e565b91506138cc6020840161383e565b90509250929050565b6000806000606084860312156138ea57600080fd5b6138f38461383e565b92506139016020850161383e565b9150604084013590509250925092565b6000806000806080858703121561392757600080fd5b6139308561383e565b935061393e6020860161383e565b925060408501359150606085013567ffffffffffffffff81111561396157600080fd5b8501601f8101871361397257600080fd5b613981878235602084016137c8565b91505092959194509250565b600080604083850312156139a057600080fd5b6139a98361383e565b9150602083013580151581146139be57600080fd5b809150509250929050565b6000806000606084860312156139de57600080fd5b6139e78461383e565b92506139f560208501613875565b9150613a0360408501613875565b90509250925092565b60008060408385031215613a1f57600080fd5b613a288361383e565b946020939093013593505050565b600060208284031215613a4857600080fd5b8135612ab981614493565b600060208284031215613a6557600080fd5b8151612ab981614493565b600060208284031215613a8257600080fd5b813567ffffffffffffffff811115613a9957600080fd5b6121fe84828501613855565b60008060408385031215613ab857600080fd5b823567ffffffffffffffff80821115613ad057600080fd5b613adc86838701613855565b93506020850135915080821115613af257600080fd5b50613aff85828601613855565b9150509250929050565b600080600060608486031215613b1e57600080fd5b833567ffffffffffffffff80821115613b3657600080fd5b613b4287838801613855565b94506020860135915080821115613b5857600080fd5b613b6487838801613855565b93506040860135915080821115613b7a57600080fd5b50613b8786828701613855565b9150509250925092565b600060208284031215613ba357600080fd5b5035919050565b600060208284031215613bbc57600080fd5b5051919050565b60008151808452613bdb8160208601602086016143a5565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613c0957607f831692505b6020808410821415613c2b57634e487b7160e01b600052602260045260246000fd5b818015613c3f5760018114613c5057613c7d565b60ff19861689528489019650613c7d565b60008881526020902060005b86811015613c755781548b820152908501908301613c5c565b505084890196505b50505050505092915050565b60008251613c9b8184602087016143a5565b9190910192915050565b60008a51613cb7818460208f016143a5565b8a5190830190613ccb818360208f016143a5565b613cd78183018c613bef565b9150508851613cea818360208d016143a5565b8851910190613cfd818360208c016143a5565b8751910190613d10818360208b016143a5565b8651910190613d23818360208a016143a5565b8551910190613d368183602089016143a5565b8451910190613d498183602088016143a5565b019b9a5050505050505050505050565b60008351613d6b8184602088016143a5565b835190830190613d7f8183602088016143a5565b600360fc1b9101908152600101949350505050565b60008451613da68184602089016143a5565b845190830190613dba8183602089016143a5565b600360fc1b91018181528451909190613dda8160018501602089016143a5565b600192019182015260020195945050505050565b60008351613e008184602088016143a5565b835190830190613e148183602088016143a5565b603160f81b9101908152600101949350505050565b60008551613e3b818460208a016143a5565b855190830190613e4f818360208a016143a5565b603160f81b91019081528451613e6c8160018401602089016143a5565b8451910190613e828160018401602088016143a5565b016001019695505050505050565b6000613e9c8285613bef565b8351613eac8183602088016143a5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ee890830184613bc3565b9695505050505050565b602081526000612ab96020830184613bc3565b60208082526023908201527f4552524f523a20207573657220636f6465206c656e67746820697320696e76616040820152621b1a5960ea1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4163636f756e742068617320616c7265616479206d696e74656420616e204e466040820152612a1760f11b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8581526001600160a01b038516602082015260a06040820181905260009061412590830186613bc3565b82810360608401526141378186613bc3565b9050828103608084015261414b8185613bc3565b98975050505050505050565b8481526001600160a01b038416602082015260a06040820181905260009061418190830185613bc3565b82810380606085015260008252602081016080850152506141a56020820185613bc3565b979650505050505050565b600061ffff808316818516808303821115613eac57613eac61443b565b600082198211156141e0576141e061443b565b500190565b600060ff821660ff84168060ff038211156142025761420261443b565b019392505050565b60008261421957614219614451565b500490565b600060ff83168061423157614231614451565b8060ff84160491505092915050565b600181815b8085111561427b5781600019048211156142615761426161443b565b8085161561426e57918102915b93841c9390800290614245565b509250929050565b6000612ab9838360008261429957506001610a7a565b816142a657506000610a7a565b81600181146142bc57600281146142c6576142e2565b6001915050610a7a565b60ff8411156142d7576142d761443b565b50506001821b610a7a565b5060208310610133831016604e8410600b8410161715614305575081810a610a7a565b61430f8383614240565b80600019048211156143235761432361443b565b029392505050565b60008160001904831182151516156143455761434561443b565b500290565b600060ff821660ff84168160ff04811182151516156143235761432361443b565b60008282101561437d5761437d61443b565b500390565b600060ff821660ff84168082101561439c5761439c61443b565b90039392505050565b60005b838110156143c05781810151838201526020016143a8565b83811115611c2b5750506000910152565b600181811c908216806143e557607f821691505b6020821081141561440657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144205761442061443b565b5060010190565b60008261443657614436614451565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2857600080fdfea2646970667358221220add2ae2ac984126259f379d15db49f4b0cc4e5426a593bc2622c7951f88d465764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106103395760003560e01c80638129fc1c116101ab578063c87b56dd116100f7578063e985e9c511610095578063f9cb9e891161006f578063f9cb9e891461099f578063fc0c546a146109b5578063fcc9d262146109d5578063fe575a87146109f557600080fd5b8063e985e9c514610920578063ec2e0ab314610969578063f2fde38b1461097f57600080fd5b8063d848f3ea116100d1578063d848f3ea146108ab578063dc88fdb7146108cb578063dcf141ea146108e0578063decc1a861461090057600080fd5b8063c87b56dd14610861578063d547cfb714610881578063d68cda3b1461089657600080fd5b8063a22cb46511610164578063b211e9381161013e578063b211e938146107ee578063b24f4b8d14610801578063b65076a214610821578063b88d4fde1461084157600080fd5b8063a22cb46514610799578063a7f93ebd146107b9578063a879b632146107ce57600080fd5b80638129fc1c146106e35780638417b47f146106f85780638ae21b66146107185780638da5cb5b1461073657806395d89b41146107545780639cee21421461076957600080fd5b806340015e60116102855780636352211e11610223578063715018a6116101fd578063715018a6146106785780637561a71d1461068d57806378e8cde1146106a35780637c43548c146106c357600080fd5b80636352211e1461061857806370a082311461063857806370e224ba1461065857600080fd5b806347e851fa1161025f57806347e851fa146105a257806348ed51ca146105c25780635580d89c146105e257806355f804b3146105f857600080fd5b806340015e601461053957806342842e0e1461056f57806343fa5e6a1461058f57600080fd5b806317061e65116102f257806320d8dad0116102cc57806320d8dad0146104aa57806323b872dd146104e357806335db70b5146105035780633714020e1461051957600080fd5b806317061e651461043a57806317ca2e411461045a5780631cdd3be31461047a57600080fd5b806301ffc9a71461034557806306fdde031461037a578063081812fc1461039c578063095ea7b3146103d45780630e68460e146103f657806316bb6c131461041a57600080fd5b3661034057005b600080fd5b34801561035157600080fd5b50610365610360366004613a36565b610a2e565b60405190151581526020015b60405180910390f35b34801561038657600080fd5b5061038f610a80565b6040516103719190613ef2565b3480156103a857600080fd5b506103bc6103b7366004613b91565b610b12565b6040516001600160a01b039091168152602001610371565b3480156103e057600080fd5b506103f46103ef366004613a0c565b610bac565b005b34801561040257600080fd5b5061040c60d75481565b604051908152602001610371565b34801561042657600080fd5b506103f4610435366004613887565b610cc2565b34801561044657600080fd5b506103f4610455366004613b91565b610d78565b34801561046657600080fd5b506103f461047536600461398d565b610deb565b34801561048657600080fd5b50610365610495366004613887565b60d96020526000908152604090205460ff1681565b3480156104b657600080fd5b506103656104c5366004613887565b6001600160a01b0316600090815260cd602052604090205460ff1690565b3480156104ef57600080fd5b506103f46104fe3660046138d5565b610e40565b34801561050f57600080fd5b5061040c60d65481565b34801561052557600080fd5b506103f461053436600461398d565b610e71565b34801561054557600080fd5b5061040c610554366004613887565b6001600160a01b0316600090815260c9602052604090205490565b34801561057b57600080fd5b506103f461058a3660046138d5565b610efb565b61040c61059d366004613b09565b610f16565b3480156105ae57600080fd5b5061040c6105bd366004613887565b61101a565b3480156105ce57600080fd5b5061038f6105dd3660046139c9565b611098565b3480156105ee57600080fd5b5061040c60d55481565b34801561060457600080fd5b506103f4610613366004613a70565b611709565b34801561062457600080fd5b506103bc610633366004613b91565b611746565b34801561064457600080fd5b5061040c610653366004613887565b6117bd565b34801561066457600080fd5b5061040c610673366004613887565b611844565b34801561068457600080fd5b506103f46118b0565b34801561069957600080fd5b5061040c60d35481565b3480156106af57600080fd5b506103f46106be366004613b91565b6118e6565b3480156106cf57600080fd5b506103f46106de366004613b91565b611915565b3480156106ef57600080fd5b506103f4611944565b34801561070457600080fd5b506103f4610713366004613b91565b611a2b565b34801561072457600080fd5b5060d4546001600160a01b03166103bc565b34801561074257600080fd5b506033546001600160a01b03166103bc565b34801561076057600080fd5b5061038f611a5a565b34801561077557600080fd5b50610365610784366004613887565b60cd6020526000908152604090205460ff1681565b3480156107a557600080fd5b506103f46107b436600461398d565b611a69565b3480156107c557600080fd5b5060d65461040c565b3480156107da57600080fd5b5060d4546103bc906001600160a01b031681565b61040c6107fc366004613aa5565b611a74565b34801561080d57600080fd5b5061036561081c366004613a70565b611b8b565b34801561082d57600080fd5b506103f461083c366004613b91565b611bca565b34801561084d57600080fd5b506103f461085c366004613911565b611bf9565b34801561086d57600080fd5b5061038f61087c366004613b91565b611c31565b34801561088d57600080fd5b5061038f611db2565b3480156108a257600080fd5b5060d75461040c565b3480156108b757600080fd5b506103f46108c6366004613b91565b611e40565b3480156108d757600080fd5b5060d55461040c565b3480156108ec57600080fd5b506103f46108fb366004613887565b611e6f565b34801561090c57600080fd5b506103f461091b366004613b91565b611f2e565b34801561092c57600080fd5b5061036561093b3660046138a2565b6001600160a01b039182166000908152609c6020908152604080832093909416825291909152205460ff1690565b34801561097557600080fd5b5061040c60d15481565b34801561098b57600080fd5b506103f461099a366004613887565b611f5d565b3480156109ab57600080fd5b5061040c60d25481565b3480156109c157600080fd5b5060d0546103bc906001600160a01b031681565b3480156109e157600080fd5b5061038f6109f0366004613887565b611ff5565b348015610a0157600080fd5b50610365610a10366004613887565b6001600160a01b0316600090815260d9602052604090205460ff1690565b60006001600160e01b031982166380ac58cd60e01b1480610a5f57506001600160e01b03198216635b5e139f60e01b145b80610a7a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060978054610a8f906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610abb906143d1565b8015610b085780601f10610add57610100808354040283529160200191610b08565b820191906000526020600020905b815481529060010190602001808311610aeb57829003601f168201915b5050505050905090565b6000818152609960205260408120546001600160a01b0316610b905760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609b60205260409020546001600160a01b031690565b6000610bb782611746565b9050806001600160a01b0316836001600160a01b03161415610c255760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b87565b336001600160a01b0382161480610c415750610c41813361093b565b610cb35760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b87565b610cbd83836120a1565b505050565b6033546001600160a01b03163314610cec5760405162461bcd60e51b8152600401610b8790613fe8565b60d0546001600160a01b0382811691161415610d565760405162461bcd60e51b8152602060048201526024808201527f4e657720746f6b656e20616464726573732069732073616d65206173206f6c64604482015263206f6e6560e01b6064820152608401610b87565b60d080546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610da25760405162461bcd60e51b8152600401610b8790613fe8565b47811115610dad5750475b6033546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015610de7573d6000803e3d6000fd5b5050565b6033546001600160a01b03163314610e155760405162461bcd60e51b8152600401610b8790613fe8565b6001600160a01b0391909116600090815260d960205260409020805460ff1916911515919091179055565b610e4a338261210f565b610e665760405162461bcd60e51b8152600401610b879061405f565b610cbd838383612206565b60d0546001600160a01b0316331480610e9457506033546001600160a01b031633145b610ed05760405162461bcd60e51b815260206004820152600d60248201526c1058d8d95cdcc811195b9a5959609a1b6044820152606401610b87565b6001600160a01b0391909116600090815260cd60205260409020805460ff1916911515919091179055565b610cbd83838360405180602001604052806000815250611bf9565b600060d754341015610f5e5760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610b87565b610f69338585612268565b506000610f77335b84612a88565b33600090815260cc6020526040902081905560d754909150341115610fd35760d75433906108fc90610fa9903461436b565b6040518115909202916000818181858888f19350505050158015610fd1573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb813387878760405161100a9594939291906140fb565b60405180910390a1949350505050565b60d0546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561106057600080fd5b505afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7a9190613baa565b6001600160a01b038316600090815260c9602052604090205460609061ffff8316106111065760405162461bcd60e51b815260206004820152601f60248201527f47455420535542205245464552524552533a204f7574206f662052616e6765006044820152606401610b87565b6001600160a01b038416600090815260c96020908152604080832080548251818502810185019093528083529192909190849084015b828210156111e857838290600052602060002001805461115b906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611187906143d1565b80156111d45780601f106111a9576101008083540402835291602001916111d4565b820191906000526020600020905b8154815290600101906020018083116111b757829003601f168201915b50505050508152602001906001019061113c565b5050505090506112346040518060c001604052806000815260200160006001600160a01b0316815260200160608152602001600081526020016000151581526020016000151581525090565b604080516020808201835260008252825180840190935260018352602360f81b908301529061ffff87165b61126a8760016141b0565b61ffff168110156116fc5760ca85828151811061128957611289614467565b602002602001015160405161129e9190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916112e3906143d1565b80601f016020809104026020016040519081016040528092919081815260200182805461130f906143d1565b801561135c5780601f106113315761010080835404028352916020019161135c565b820191906000526020600020905b81548152906001019060200180831161133f57829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff808216151560408085019190915261010090920416151560609092019190915282820180516001600160a01b0316600090815260cb90935291209051919550849184919082906113c990612ac0565b866113d78a60000151612c07565b886113e58c60600151612c07565b6040516020016113fd99989796959493929190613ca5565b604051602081830303815290604052925083608001511515600115151415611666576020808501516001600160a01b0316600090815260c9825260408082208054825181860281018601909352808352929391929091849084015b82821015611504578382906000526020600020018054611477906143d1565b80601f01602080910402602001604051908101604052809291908181526020018280546114a3906143d1565b80156114f05780601f106114c5576101008083540402835291602001916114f0565b820191906000526020600020905b8154815290600101906020018083116114d357829003601f168201915b505050505081526020019060010190611458565b505050509050600060ca8260008151811061152157611521614467565b60200260200101516040516115369190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b031691840191909152600281018054919284019161157b906143d1565b80601f01602080910402602001604051908101604052809291908181526020018280546115a7906143d1565b80156115f45780601f106115c9576101008083540402835291602001916115f4565b820191906000526020600020905b8154815290600101906020018083116115d757829003601f168201915b50505091835250506003820154602082015260049091015460ff80821615156040840152610100909104161515606090910152805190915085908590819061163b90612c07565b60405160200161164e9493929190613e29565b6040516020818303038152906040529450505061168d565b82828360405160200161167b93929190613d94565b60405160208183030381529060405292505b60a08401511515600114156116c55782826040516020016116af929190613dee565b60405160208183030381529060405292506116ea565b82826040516020016116d8929190613d59565b60405160208183030381529060405292505b806116f48161440c565b91505061125f565b5090979650505050505050565b6033546001600160a01b031633146117335760405162461bcd60e51b8152600401610b8790613fe8565b8051610de79060d890602084019061372f565b6000818152609960205260408120546001600160a01b031680610a7a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b87565b60006001600160a01b0382166118285760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b87565b506001600160a01b03166000908152609a602052604090205490565b60006001600160a01b0382166118945760405162461bcd60e51b8152602060048201526015602482015274616464726573732043414e2754204245205a45524f60581b6044820152606401610b87565b506001600160a01b0316600090815260cc602052604090205490565b6033546001600160a01b031633146118da5760405162461bcd60e51b8152600401610b8790613fe8565b6118e46000612d05565b565b6033546001600160a01b031633146119105760405162461bcd60e51b8152600401610b8790613fe8565b60d555565b6033546001600160a01b0316331461193f5760405162461bcd60e51b8152600401610b8790613fe8565b60d355565b60006119506001612d57565b90508015611968576000805461ff0019166101001790555b6119ba6040518060400160405280601081526020016f10da18591a5b9d481592540810d85c9960821b815250604051806040016040528060088152602001671592540810d85c9960c21b815250612de4565b6119c2612e32565b602160d181905560d255604b60d35560d480546001600160a01b03191673c040e348fc48ecd2ab355499211bf208b38918371790556212750060d5556702c68af0bb14000060d655670214e8348c4f000060d7558015611a28576000805461ff00191690555b50565b6033546001600160a01b03163314611a555760405162461bcd60e51b8152600401610b8790613fe8565b60d655565b606060988054610a8f906143d1565b610de7338383612e62565b600060d65434101580611a96575033600090815260cd602052604090205460ff165b611ad65760405162461bcd60e51b8152602060048201526011602482015270125b9cdd59999a58da595b9d08119d5b99607a1b6044820152606401610b87565b611ae03384612f31565b6000611aeb33610f71565b33600090815260cc6020526040902081905560d654909150341115611b475760d65433906108fc90611b1d903461436b565b6040518115909202916000818181858888f19350505050158015611b45573d6000803e3d6000fd5b505b7f83dccdf3f2e2864e31b51b8043c5a1713bf88997265c066a523dffdd3d9082fb81338686604051611b7c9493929190614157565b60405180910390a19392505050565b600060ca82604051611b9d9190613c89565b90815260405190819003602001902054158015611bbb575060018251115b8015610a7a5750505160101190565b6033546001600160a01b03163314611bf45760405162461bcd60e51b8152600401610b8790613fe8565b60d755565b611c03338361210f565b611c1f5760405162461bcd60e51b8152600401610b879061405f565b611c2b848484846131f6565b50505050565b6000818152609960205260409020546060906001600160a01b0316611cb05760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b87565b600082815260cf602052604081208054611cc9906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611cf5906143d1565b8015611d425780601f10611d1757610100808354040283529160200191611d42565b820191906000526020600020905b815481529060010190602001808311611d2557829003601f168201915b5050505050905060d88054611d56906143d1565b15159050611d645792915050565b805115611d965760d881604051602001611d7f929190613e90565b604051602081830303815290604052915050919050565b60d8611da184612c07565b604051602001611d7f929190613e90565b60d88054611dbf906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054611deb906143d1565b8015611e385780601f10611e0d57610100808354040283529160200191611e38565b820191906000526020600020905b815481529060010190602001808311611e1b57829003601f168201915b505050505081565b6033546001600160a01b03163314611e6a5760405162461bcd60e51b8152600401610b8790613fe8565b60d255565b6033546001600160a01b03163314611e995760405162461bcd60e51b8152600401610b8790613fe8565b60d4546001600160a01b0382811691161415611f0c5760405162461bcd60e51b815260206004820152602c60248201527f4e6577207365636f6e646172792064657620616464726573732069732073616d60448201526b65206173206f6c64206f6e6560a01b6064820152608401610b87565b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611f585760405162461bcd60e51b8152600401610b8790613fe8565b60d155565b6033546001600160a01b03163314611f875760405162461bcd60e51b8152600401610b8790613fe8565b6001600160a01b038116611fec5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b87565b611a2881612d05565b6001600160a01b038116600090815260cb6020526040902080546060919061201c906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612048906143d1565b80156120955780601f1061206a57610100808354040283529160200191612095565b820191906000526020600020905b81548152906001019060200180831161207857829003601f168201915b50505050509050919050565b6000818152609b6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120d682611746565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152609960205260408120546001600160a01b03166121885760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b87565b600061219383611746565b9050806001600160a01b0316846001600160a01b031614806121da57506001600160a01b038082166000908152609c602090815260408083209388168352929052205460ff165b806121fe5750836001600160a01b03166121f384610b12565b6001600160a01b0316145b949350505050565b6001600160a01b0383161561225d5760405162461bcd60e51b815260206004820152601c60248201527f596f752063616e2774207472616e736665722074686973204e46542e000000006044820152606401610b87565b610cbd838383613229565b6001600160a01b038316600090815260cb6020526040812080546002919061228f906143d1565b9050106122ae5760405162461bcd60e51b8152600401610b879061401d565b600183511180156122c0575060108351105b6122dc5760405162461bcd60e51b8152600401610b8790613f05565b600182511180156122ee575060108251105b61234a5760405162461bcd60e51b815260206004820152602760248201527f4552524f523a2020726566657272657220636f6465206c656e677468206973206044820152661a5b9d985b1a5960ca1b6064820152608401610b87565b60006001600160a01b031660ca846040516123659190613c89565b908152604051908190036020019020600101546001600160a01b0316146123ce5760405162461bcd60e51b815260206004820152601860248201527f75736572636f646520697320616c7265616479207573656400000000000000006044820152606401610b87565b6001600160a01b0384166124325760405162461bcd60e51b815260206004820152602560248201527f435348543a20206372656174696f6e2066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610b87565b60006001600160a01b031660ca8360405161244d9190613c89565b908152604051908190036020019020600101546001600160a01b031614156124b75760405162461bcd60e51b815260206004820152601e60248201527f726566657272657220636f6465206973206e6f7420657869736974696e6700006044820152606401610b87565b836001600160a01b031660ca836040516124d19190613c89565b908152604051908190036020019020600101546001600160a01b031614156125475760405162461bcd60e51b8152602060048201526024808201527f63726561746f7220636f756c646e27742062652073616d652061732072656665604482015263393932b960e11b6064820152608401610b87565b6000606460d25460d75461255b919061432b565b612565919061420a565b90506000606460d15460d75461257b919061432b565b612585919061420a565b90506000818360d754612598919061436b565b6125a2919061436b565b9050600060ca866040516125b69190613c89565b90815260408051918290036020908101832060c0840183528054845260018101546001600160a01b03169184019190915260028101805491928401916125fb906143d1565b80601f0160208091040260200160405190810160405280929190818152602001828054612627906143d1565b80156126745780601f1061264957610100808354040283529160200191612674565b820191906000526020600020905b81548152906001019060200180831161265757829003601f168201915b5050509183525050600382015460208083019190915260049092015460ff8082161515604080850191909152610100909204161515606090920191909152828201516001600160a01b0316600090815260c983529081208054600181018255908252908290208a519394506126ee939101918a019061372f565b5060a0810151151560011480159061270b57506001816040015151115b1561288257600060ca876040516127229190613c89565b9081526020016040518091039020905060d554826000015142612745919061436b565b101561286457606082015115612850576127a660ca836040015160405161276c9190613c89565b908152604051908190036020019020600101546001600160a01b03166001600160a01b0316600090815260d9602052604090205460ff1690565b156127ef5760d45460608301516040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156127e9573d6000803e3d6000fd5b50612850565b60ca82604001516040516128039190613c89565b9081526040519081900360200181206001015460608401516001600160a01b039091169181156108fc0291906000818181858888f1935050505015801561284e573d6000803e3d6000fd5b505b60048101805460ff19166001179055612871565b60048101805460ff191690555b600401805461ff0019166101001790555b606460d7541115612979576128b381602001516001600160a01b0316600090815260d9602052604090205460ff1690565b156128ff5760d4546001600160a01b03166108fc6128d185856141cd565b6040518115909202916000818181858888f193505050501580156128f9573d6000803e3d6000fd5b50612979565b80602001516001600160a01b03166108fc849081150290604051600060405180830381858888f1935050505015801561293c573d6000803e3d6000fd5b5060d4546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612977573d6000803e3d6000fd5b505b6040805160c0810182524281526001600160a01b038a1660208201528082018890526060810186905260006080820181905260a0820152905160ca906129c0908a90613c89565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b039092169190911790559083015180519192612a149260028501929091019061372f565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038816600090815260cb602090815260409091208851612a79928a019061372f565b50600198975050505050505050565b6000612a9860ce80546001019055565b6000612aa360ce5490565b9050612aaf84826133c5565b612ab981846133df565b9392505050565b60408051602880825260608281019093526000919060208201818036833701905050905060005b6014811015612c00576000612afd82601361436b565b612b0890600861432b565b612b13906002614283565b612b26906001600160a01b03871661420a565b60f81b9050600060108260f81c612b3d919061421e565b60f81b905060008160f81c6010612b54919061434a565b8360f81c612b629190614382565b60f81b9050612b7082613477565b85612b7c86600261432b565b81518110612b8c57612b8c614467565b60200101906001600160f81b031916908160001a905350612bac81613477565b85612bb886600261432b565b612bc39060016141cd565b81518110612bd357612bd3614467565b60200101906001600160f81b031916908160001a9053505050508080612bf89061440c565b915050612ae7565b5092915050565b606081612c2b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612c555780612c3f8161440c565b9150612c4e9050600a8361420a565b9150612c2f565b60008167ffffffffffffffff811115612c7057612c7061447d565b6040519080825280601f01601f191660200182016040528015612c9a576020820181803683370190505b5090505b84156121fe57612caf60018361436b565b9150612cbc600a86614427565b612cc79060306141cd565b60f81b818381518110612cdc57612cdc614467565b60200101906001600160f81b031916908160001a905350612cfe600a8661420a565b9450612c9e565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008054610100900460ff1615612d9e578160ff166001148015612d7a5750303b155b612d965760405162461bcd60e51b8152600401610b8790613f9a565b506000919050565b60005460ff808416911610612dc55760405162461bcd60e51b8152600401610b8790613f9a565b506000805460ff191660ff92909216919091179055600190565b919050565b600054610100900460ff16612e0b5760405162461bcd60e51b8152600401610b87906140b0565b8151612e1e90609790602085019061372f565b508051610cbd90609890602084019061372f565b600054610100900460ff16612e595760405162461bcd60e51b8152600401610b87906140b0565b6118e433612d05565b816001600160a01b0316836001600160a01b03161415612ec45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b87565b6001600160a01b038381166000818152609c6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038216600090815260cb60205260409020805460029190612f58906143d1565b905010612f775760405162461bcd60e51b8152600401610b879061401d565b60018151118015612f89575060108151105b612fa55760405162461bcd60e51b8152600401610b8790613f05565b6001600160a01b038216612ffb5760405162461bcd60e51b815260206004820181905260248201527f435348543a20207a65726f20616464726573732063616e2774206372656174656044820152606401610b87565b60006001600160a01b031660ca826040516130169190613c89565b908152604051908190036020019020600101546001600160a01b03161461307f5760405162461bcd60e51b815260206004820152601960248201527f7573657220636f646520697320616c72656164792075736564000000000000006044820152606401610b87565b6040518060c00160405280428152602001836001600160a01b03168152602001604051806020016040528060008152508152602001600081526020016000151581526020016000151581525060ca826040516130db9190613c89565b908152604080516020928190038301902083518155838301516001820180546001600160a01b0319166001600160a01b03909216919091179055908301518051919261312f9260028501929091019061372f565b506060820151600382015560808201516004909101805460a09093015115156101000261ff00199215159290921661ffff19909316929092171790556001600160a01b038216600090815260cb6020908152604090912082516131949284019061372f565b506001600160a01b038216600090815260cd602052604090205460ff16156131ba575050565b60d45460d6546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610cbd573d6000803e3d6000fd5b613201848484612206565b61320d848484846134ad565b611c2b5760405162461bcd60e51b8152600401610b8790613f48565b826001600160a01b031661323c82611746565b6001600160a01b0316146132a05760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610b87565b6001600160a01b0382166133025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b87565b61330d6000826120a1565b6001600160a01b0383166000908152609a6020526040812080546001929061333690849061436b565b90915550506001600160a01b0382166000908152609a602052604081208054600192906133649084906141cd565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610de78282604051806020016040528060008152506135ba565b6000828152609960205260409020546001600160a01b03166134585760405162461bcd60e51b815260206004820152602c60248201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b87565b600082815260cf602090815260409091208251610cbd9284019061372f565b6000600a60f883901c101561349e5761349560f883901c60306141e5565b60f81b92915050565b61349560f883901c60576141e5565b60006001600160a01b0384163b156135af57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906134f1903390899088908890600401613eb5565b602060405180830381600087803b15801561350b57600080fd5b505af192505050801561353b575060408051601f3d908101601f1916820190925261353891810190613a53565b60015b613595573d808015613569576040519150601f19603f3d011682016040523d82523d6000602084013e61356e565b606091505b50805161358d5760405162461bcd60e51b8152600401610b8790613f48565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121fe565b506001949350505050565b6135c483836135ed565b6135d160008484846134ad565b610cbd5760405162461bcd60e51b8152600401610b8790613f48565b6001600160a01b0382166136435760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b87565b6000818152609960205260409020546001600160a01b0316156136a85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b87565b6001600160a01b0382166000908152609a602052604081208054600192906136d19084906141cd565b909155505060008181526099602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461373b906143d1565b90600052602060002090601f01602090048101928261375d57600085556137a3565b82601f1061377657805160ff19168380011785556137a3565b828001600101855582156137a3579182015b828111156137a3578251825591602001919060010190613788565b506137af9291506137b3565b5090565b5b808211156137af57600081556001016137b4565b600067ffffffffffffffff808411156137e3576137e361447d565b604051601f8501601f19908116603f0116810190828211818310171561380b5761380b61447d565b8160405280935085815286868601111561382457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114612ddf57600080fd5b600082601f83011261386657600080fd5b612ab9838335602085016137c8565b803561ffff81168114612ddf57600080fd5b60006020828403121561389957600080fd5b612ab98261383e565b600080604083850312156138b557600080fd5b6138be8361383e565b91506138cc6020840161383e565b90509250929050565b6000806000606084860312156138ea57600080fd5b6138f38461383e565b92506139016020850161383e565b9150604084013590509250925092565b6000806000806080858703121561392757600080fd5b6139308561383e565b935061393e6020860161383e565b925060408501359150606085013567ffffffffffffffff81111561396157600080fd5b8501601f8101871361397257600080fd5b613981878235602084016137c8565b91505092959194509250565b600080604083850312156139a057600080fd5b6139a98361383e565b9150602083013580151581146139be57600080fd5b809150509250929050565b6000806000606084860312156139de57600080fd5b6139e78461383e565b92506139f560208501613875565b9150613a0360408501613875565b90509250925092565b60008060408385031215613a1f57600080fd5b613a288361383e565b946020939093013593505050565b600060208284031215613a4857600080fd5b8135612ab981614493565b600060208284031215613a6557600080fd5b8151612ab981614493565b600060208284031215613a8257600080fd5b813567ffffffffffffffff811115613a9957600080fd5b6121fe84828501613855565b60008060408385031215613ab857600080fd5b823567ffffffffffffffff80821115613ad057600080fd5b613adc86838701613855565b93506020850135915080821115613af257600080fd5b50613aff85828601613855565b9150509250929050565b600080600060608486031215613b1e57600080fd5b833567ffffffffffffffff80821115613b3657600080fd5b613b4287838801613855565b94506020860135915080821115613b5857600080fd5b613b6487838801613855565b93506040860135915080821115613b7a57600080fd5b50613b8786828701613855565b9150509250925092565b600060208284031215613ba357600080fd5b5035919050565b600060208284031215613bbc57600080fd5b5051919050565b60008151808452613bdb8160208601602086016143a5565b601f01601f19169290920160200192915050565b8054600090600181811c9080831680613c0957607f831692505b6020808410821415613c2b57634e487b7160e01b600052602260045260246000fd5b818015613c3f5760018114613c5057613c7d565b60ff19861689528489019650613c7d565b60008881526020902060005b86811015613c755781548b820152908501908301613c5c565b505084890196505b50505050505092915050565b60008251613c9b8184602087016143a5565b9190910192915050565b60008a51613cb7818460208f016143a5565b8a5190830190613ccb818360208f016143a5565b613cd78183018c613bef565b9150508851613cea818360208d016143a5565b8851910190613cfd818360208c016143a5565b8751910190613d10818360208b016143a5565b8651910190613d23818360208a016143a5565b8551910190613d368183602089016143a5565b8451910190613d498183602088016143a5565b019b9a5050505050505050505050565b60008351613d6b8184602088016143a5565b835190830190613d7f8183602088016143a5565b600360fc1b9101908152600101949350505050565b60008451613da68184602089016143a5565b845190830190613dba8183602089016143a5565b600360fc1b91018181528451909190613dda8160018501602089016143a5565b600192019182015260020195945050505050565b60008351613e008184602088016143a5565b835190830190613e148183602088016143a5565b603160f81b9101908152600101949350505050565b60008551613e3b818460208a016143a5565b855190830190613e4f818360208a016143a5565b603160f81b91019081528451613e6c8160018401602089016143a5565b8451910190613e828160018401602088016143a5565b016001019695505050505050565b6000613e9c8285613bef565b8351613eac8183602088016143a5565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ee890830184613bc3565b9695505050505050565b602081526000612ab96020830184613bc3565b60208082526023908201527f4552524f523a20207573657220636f6465206c656e67746820697320696e76616040820152621b1a5960ea1b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4163636f756e742068617320616c7265616479206d696e74656420616e204e466040820152612a1760f11b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b8581526001600160a01b038516602082015260a06040820181905260009061412590830186613bc3565b82810360608401526141378186613bc3565b9050828103608084015261414b8185613bc3565b98975050505050505050565b8481526001600160a01b038416602082015260a06040820181905260009061418190830185613bc3565b82810380606085015260008252602081016080850152506141a56020820185613bc3565b979650505050505050565b600061ffff808316818516808303821115613eac57613eac61443b565b600082198211156141e0576141e061443b565b500190565b600060ff821660ff84168060ff038211156142025761420261443b565b019392505050565b60008261421957614219614451565b500490565b600060ff83168061423157614231614451565b8060ff84160491505092915050565b600181815b8085111561427b5781600019048211156142615761426161443b565b8085161561426e57918102915b93841c9390800290614245565b509250929050565b6000612ab9838360008261429957506001610a7a565b816142a657506000610a7a565b81600181146142bc57600281146142c6576142e2565b6001915050610a7a565b60ff8411156142d7576142d761443b565b50506001821b610a7a565b5060208310610133831016604e8410600b8410161715614305575081810a610a7a565b61430f8383614240565b80600019048211156143235761432361443b565b029392505050565b60008160001904831182151516156143455761434561443b565b500290565b600060ff821660ff84168160ff04811182151516156143235761432361443b565b60008282101561437d5761437d61443b565b500390565b600060ff821660ff84168082101561439c5761439c61443b565b90039392505050565b60005b838110156143c05781810151838201526020016143a8565b83811115611c2b5750506000910152565b600181811c908216806143e557607f821691505b6020821081141561440657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156144205761442061443b565b5060010190565b60008261443657614436614451565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a2857600080fdfea2646970667358221220add2ae2ac984126259f379d15db49f4b0cc4e5426a593bc2622c7951f88d465764736f6c63430008070033
Deployed Bytecode Sourcemap
286:15367:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1906:344:5;;;;;;;;;;-1:-1:-1;1906:344:5;;;;;:::i;:::-;;:::i;:::-;;;13872:14:14;;13865:22;13847:41;;13835:2;13820:18;1906:344:5;;;;;;;;2868:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4391:217::-;;;;;;;;;;-1:-1:-1;4391:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;13170:32:14;;;13152:51;;13140:2;13125:18;4391:217:5;13006:203:14;3918:412:5;;;;;;;;;;-1:-1:-1;3918:412:5;;;;;:::i;:::-;;:::i;:::-;;1256:34:1;;;;;;;;;;;;;;;;;;;28136:25:14;;;28124:2;28109:18;1256:34:1;27990:177:14;13247:231:1;;;;;;;;;;-1:-1:-1;13247:231:1;;;;;:::i;:::-;;:::i;13055:184::-;;;;;;;;;;-1:-1:-1;13055:184:1;;;;;:::i;:::-;;:::i;9838:118::-;;;;;;;;;;-1:-1:-1;9838:118:1;;;;;:::i;:::-;;:::i;1332:46::-;;;;;;;;;;-1:-1:-1;1332:46:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;9709:121;;;;;;;;;;-1:-1:-1;9709:121:1;;;;;:::i;:::-;-1:-1:-1;;;;;9799:23:1;9775:4;9799:23;;;:14;:23;;;;;;;;;9709:121;5118:330:5;;;;;;;;;;-1:-1:-1;5118:330:5;;;;;:::i;:::-;;:::i;1222:27:1:-;;;;;;;;;;;;;;;;9464:237;;;;;;;;;;-1:-1:-1;9464:237:1;;;;;:::i;:::-;;:::i;10088:166::-;;;;;;;;;;-1:-1:-1;10088:166:1;;;;;:::i;:::-;-1:-1:-1;;;;;10217:22:1;10185:7;10217:22;;;:13;:22;;;;;:29;;10088:166;5514:179:5;;;;;;;;;;-1:-1:-1;5514:179:5;;;;;:::i;:::-;;:::i;4429:660:1:-;;;;;;:::i;:::-;;:::i;13486:121::-;;;;;;;;;;-1:-1:-1;13486:121:1;;;;;:::i;:::-;;:::i;10262:2096::-;;;;;;;;;;-1:-1:-1;10262:2096:1;;;;;:::i;:::-;;:::i;1184:31::-;;;;;;;;;;;;;;;;15547:103;;;;;;;;;;-1:-1:-1;15547:103:1;;;;;:::i;:::-;;:::i;2571:235:5:-;;;;;;;;;;-1:-1:-1;2571:235:5;;;;;:::i;:::-;;:::i;2309:205::-;;;;;;;;;;-1:-1:-1;2309:205:5;;;;;:::i;:::-;;:::i;13615:181:1:-;;;;;;;;;;-1:-1:-1;13615:181:1;;;;;:::i;:::-;;:::i;1946:103:12:-;;;;;;;;;;;;;:::i;1107:25:1:-;;;;;;;;;;;;;;;;14992:123;;;;;;;;;;-1:-1:-1;14992:123:1;;;;;:::i;:::-;;:::i;15321:97::-;;;;;;;;;;-1:-1:-1;15321:97:1;;;;;:::i;:::-;;:::i;1555:423::-;;;;;;;;;;;;;:::i;14071:118::-;;;;;;;;;;-1:-1:-1;14071:118:1;;;;;:::i;:::-;;:::i;14490:111::-;;;;;;;;;;-1:-1:-1;14574:19:1;;-1:-1:-1;;;;;14574:19:1;14490:111;;1295:87:12;;;;;;;;;;-1:-1:-1;1368:6:12;;-1:-1:-1;;;;;1368:6:12;1295:87;;3030:102:5;;;;;;;;;;;;;:::i;871:46:1:-;;;;;;;;;;-1:-1:-1;871:46:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;4675:153:5;;;;;;;;;;-1:-1:-1;4675:153:5;;;;;:::i;:::-;;:::i;13969:94:1:-;;;;;;;;;;-1:-1:-1;14043:12:1;;13969:94;;1141:34;;;;;;;;;;-1:-1:-1;1141:34:1;;;;-1:-1:-1;;;;;1141:34:1;;;3784:637;;;;;;:::i;:::-;;:::i;9237:219::-;;;;;;;;;;-1:-1:-1;9237:219:1;;;;;:::i;:::-;;:::i;14313:169::-;;;;;;;;;;-1:-1:-1;14313:169:1;;;;;:::i;:::-;;:::i;5759:320:5:-;;;;;;;;;;-1:-1:-1;5759:320:5;;;;;:::i;:::-;;:::i;2524:969:1:-;;;;;;;;;;-1:-1:-1;2524:969:1;;;;;:::i;:::-;;:::i;1297:26::-;;;;;;;;;;;;;:::i;14197:108::-;;;;;;;;;;-1:-1:-1;14278:19:1;;14197:108;;15220:93;;;;;;;;;;-1:-1:-1;15220:93:1;;;;;:::i;:::-;;:::i;14877:107::-;;;;;;;;;;-1:-1:-1;14960:16:1;;14877:107;;14609:260;;;;;;;;;;-1:-1:-1;14609:260:1;;;;;:::i;:::-;;:::i;15123:89::-;;;;;;;;;;-1:-1:-1;15123:89:1;;;;;:::i;:::-;;:::i;4894:162:5:-;;;;;;;;;;-1:-1:-1;4894:162:5;;;;;:::i;:::-;-1:-1:-1;;;;;5014:25:5;;;4991:4;5014:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4894:162;1049:21:1;;;;;;;;;;;;;;;;2204:201:12;;;;;;;;;;-1:-1:-1;2204:201:12;;;;;:::i;:::-;;:::i;1077:23:1:-;;;;;;;;;;;;;;;;1021:19;;;;;;;;;;-1:-1:-1;1021:19:1;;;;-1:-1:-1;;;;;1021:19:1;;;13804:157;;;;;;;;;;-1:-1:-1;13804:157:1;;;;;:::i;:::-;;:::i;9964:116::-;;;;;;;;;;-1:-1:-1;9964:116:1;;;;;:::i;:::-;-1:-1:-1;;;;;10049:23:1;10025:4;10049:23;;;:14;:23;;;;;;;;;9964:116;1906:344:5;2030:4;-1:-1:-1;;;;;;2065:51:5;;-1:-1:-1;;;2065:51:5;;:126;;-1:-1:-1;;;;;;;2132:59:5;;-1:-1:-1;;;2132:59:5;2065:126;:178;;;-1:-1:-1;;;;;;;;;;1152:51:4;;;2207:36:5;2046:197;1906:344;-1:-1:-1;;1906:344:5:o;2868:98::-;2922:13;2954:5;2947:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2868:98;:::o;4391:217::-;4467:7;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;4486:73;;;;-1:-1:-1;;;4486:73:5;;22784:2:14;4486:73:5;;;22766:21:14;22823:2;22803:18;;;22796:30;22862:34;22842:18;;;22835:62;-1:-1:-1;;;22913:18:14;;;22906:42;22965:19;;4486:73:5;;;;;;;;;-1:-1:-1;4577:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4577:24:5;;4391:217::o;3918:412::-;3998:13;4014:34;4040:7;4014:25;:34::i;:::-;3998:50;;4072:5;-1:-1:-1;;;;;4066:11:5;:2;-1:-1:-1;;;;;4066:11:5;;;4058:57;;;;-1:-1:-1;;;4058:57:5;;25103:2:14;4058:57:5;;;25085:21:14;25142:2;25122:18;;;25115:30;25181:34;25161:18;;;25154:62;-1:-1:-1;;;25232:18:14;;;25225:31;25273:19;;4058:57:5;24901:397:14;4058:57:5;916:10:2;-1:-1:-1;;;;;4147:21:5;;;;:62;;-1:-1:-1;4172:37:5;4189:5;916:10:2;4894:162:5;:::i;4172:37::-;4126:165;;;;-1:-1:-1;;;4126:165:5;;20762:2:14;4126:165:5;;;20744:21:14;20801:2;20781:18;;;20774:30;20840:34;20820:18;;;20813:62;20911:26;20891:18;;;20884:54;20955:19;;4126:165:5;20560:420:14;4126:165:5;4302:21;4311:2;4315:7;4302:8;:21::i;:::-;3988:342;3918:412;;:::o;13247:231:1:-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13363:5:1::1;::::0;-1:-1:-1;;;;;13341:28:1;;::::1;13363:5:::0;::::1;13341:28;;13319:114;;;::::0;-1:-1:-1;;;13319:114:1;;16949:2:14;13319:114:1::1;::::0;::::1;16931:21:14::0;16988:2;16968:18;;;16961:30;17027:34;17007:18;;;17000:62;-1:-1:-1;;;17078:18:14;;;17071:34;17122:19;;13319:114:1::1;16747:400:14::0;13319:114:1::1;13444:5;:26:::0;;-1:-1:-1;;;;;;13444:26:1::1;-1:-1:-1::0;;;;;13444:26:1;;;::::1;::::0;;;::::1;::::0;;13247:231::o;13055:184::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;13134:21:1::1;13125:6;:30;13121:66;;;-1:-1:-1::0;13166:21:1::1;13121:66;1368:6:12::0;;13198:33:1::1;::::0;-1:-1:-1;;;;;1368:6:12;;;;13198:33:1;::::1;;;::::0;13224:6;;13198:33:::1;::::0;;;13224:6;1368::12;13198:33:1;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13055:184:::0;:::o;9838:118::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;9917:23:1;;;::::1;;::::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;9917:31:1::1;::::0;::::1;;::::0;;;::::1;::::0;;9838:118::o;5118:330:5:-;5307:41;916:10:2;5340:7:5;5307:18;:41::i;:::-;5299:103;;;;-1:-1:-1;;;5299:103:5;;;;;;;:::i;:::-;5413:28;5423:4;5429:2;5433:7;5413:9;:28::i;9464:237:1:-;9579:5;;-1:-1:-1;;;;;9579:5:1;9557:10;:28;;:53;;-1:-1:-1;1368:6:12;;-1:-1:-1;;;;;1368:6:12;9589:10:1;:21;9557:53;9535:116;;;;-1:-1:-1;;;9535:116:1;;19240:2:14;9535:116:1;;;19222:21:14;19279:2;19259:18;;;19252:30;-1:-1:-1;;;19298:18:14;;;19291:43;19351:18;;9535:116:1;19038:337:14;9535:116:1;-1:-1:-1;;;;;9662:23:1;;;;;;;;:14;:23;;;;;:31;;-1:-1:-1;;9662:31:1;;;;;;;;;;9464:237::o;5514:179:5:-;5647:39;5664:4;5670:2;5674:7;5647:39;;;;;;;;;;;;:16;:39::i;4429:660:1:-;4603:7;4644:19;;4631:9;:32;;4623:62;;;;-1:-1:-1;;;4623:62:1;;27846:2:14;4623:62:1;;;27828:21:14;27885:2;27865:18;;;27858:30;-1:-1:-1;;;27904:18:14;;;27897:47;27961:18;;4623:62:1;27644:341:14;4623:62:1;4698:59;916:10:2;4734:8:1;4744:12;4698:21;:59::i;:::-;-1:-1:-1;4768:10:1;4781:34;916:10:2;4789:12:1;4803:11;4781:7;:34::i;:::-;916:10:2;4826:24:1;;;;:10;:24;;;;;:29;;;4882:19;;4768:47;;-1:-1:-1;4870:9:1;:31;4866:113;;;4959:19;;916:10:2;;4916:63:1;;4947:31;;:9;:31;:::i;:::-;4916:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4866:113;4997:64;5007:2;916:10:2;5025:8:1;5035:12;5049:11;4997:64;;;;;;;;;;:::i;:::-;;;;;;;;5079:2;4429:660;-1:-1:-1;;;;4429:660:1:o;13486:121::-;13575:5;;:24;;-1:-1:-1;;;13575:24:1;;-1:-1:-1;;;;;13170:32:14;;;13575:24:1;;;13152:51:14;13548:7:1;;13575:5;;:15;;13125:18:14;;13575:24:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10262:2096::-;-1:-1:-1;;;;;10444:22:1;;;;;;:13;:22;;;;;:29;10396:13;;10444:40;;;-1:-1:-1;10422:121:1;;;;-1:-1:-1;;;10422:121:1;;18880:2:14;10422:121:1;;;18862:21:14;18919:2;18899:18;;;18892:30;18958:33;18938:18;;;18931:61;19009:18;;10422:121:1;18678:355:14;10422:121:1;-1:-1:-1;;;;;10580:22:1;;10554:23;10580:22;;;:13;:22;;;;;;;;10554:48;;;;;;;;;;;;;;;;;;;10580:22;;10554:48;:23;;:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10613:25;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10613:25:1;10649:26;;;;;;;;;:21;:26;;10686:29;;;;;;;;;;;-1:-1:-1;;;10686:29:1;;;;10649:26;10733:22;;;10728:1596;10761:12;:8;10772:1;10761:12;:::i;:::-;10757:16;;:1;:16;10728:1596;;;10802:14;10817:7;10825:1;10817:10;;;;;;;;:::i;:::-;;;;;;;10802:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;10795:33;;;;;;;;;;;;;-1:-1:-1;;;;;10795:33:1;;;;;;;;;;;;;10802:26;;10795:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10795:33:1;;;-1:-1:-1;;10795:33:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10994:12;;;;;-1:-1:-1;;;;;10979:28:1;-1:-1:-1;10979:28:1;;;:14;:28;;;;;11076:12;;10795:33;;-1:-1:-1;10917:7:1;;10947:9;;10979:28;10947:9;;11062:27;;:13;:27::i;:::-;11112:9;11144:46;11172:4;:17;;;11144:27;:46::i;:::-;11213:9;11245:46;11273:4;:17;;;11245:27;:46::i;:::-;10878:432;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10843:482;;11346:4;:15;;;:23;;11365:4;11346:23;;;11342:731;;;11435:12;;;;;-1:-1:-1;;;;;11421:27:1;11390:28;11421:27;;;:13;:27;;;;;;11390:58;;;;;;;;;;;;;;;;;:28;;:58;;11421:27;;11390:28;;:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11467:30;11500:14;11537:12;11550:1;11537:15;;;;;;;;:::i;:::-;;;;;;;11500:71;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;11467:104;;;;;;;;;;;;;-1:-1:-1;;;;;11467:104:1;;;;;;;;;;;;;11500:71;;11467:104;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11467:104:1;;;-1:-1:-1;;11467:104:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11836:22;;11467:104;;-1:-1:-1;11672:7:1;;11706:9;;;;11808:51;;:27;:51::i;:::-;11629:253;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11590:311;;11371:546;;11342:731;;;11998:7;12007:9;12023;11981:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11942:115;;11342:731;12091:18;;;;:26;;12113:4;12091:26;12087:226;;;12172:7;12181:9;12155:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12138:59;;12087:226;;;12272:7;12281:9;12255:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12238:59;;12087:226;10775:3;;;;:::i;:::-;;;;10728:1596;;;-1:-1:-1;12343:7:1;;10262:2096;-1:-1:-1;;;;;;;10262:2096:1:o;15547:103::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;15620:22:1;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;2571:235:5:-:0;2643:7;2678:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2678:16:5;2712:19;2704:73;;;;-1:-1:-1;;;2704:73:5;;21598:2:14;2704:73:5;;;21580:21:14;21637:2;21617:18;;;21610:30;21676:34;21656:18;;;21649:62;-1:-1:-1;;;21727:18:14;;;21720:39;21776:19;;2704:73:5;21396:405:14;2309:205:5;2381:7;-1:-1:-1;;;;;2408:19:5;;2400:74;;;;-1:-1:-1;;;2400:74:5;;21187:2:14;2400:74:5;;;21169:21:14;21226:2;21206:18;;;21199:30;21265:34;21245:18;;;21238:62;-1:-1:-1;;;21316:18:14;;;21309:40;21366:19;;2400:74:5;20985:406:14;2400:74:5;-1:-1:-1;;;;;;2491:16:5;;;;;:9;:16;;;;;;;2309:205::o;13615:181:1:-;13676:7;-1:-1:-1;;;;;13704:21:1;;13696:55;;;;-1:-1:-1;;;13696:55:1;;27496:2:14;13696:55:1;;;27478:21:14;27535:2;27515:18;;;27508:30;-1:-1:-1;;;27554:18:14;;;27547:51;27615:18;;13696:55:1;27294:345:14;13696:55:1;-1:-1:-1;;;;;;13769:19:1;;;;;:10;:19;;;;;;;13615:181::o;1946:103:12:-;1368:6;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;2011:30:::1;2038:1;2011:18;:30::i;:::-;1946:103::o:0;14992:123:1:-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;15077:16:1::1;:30:::0;14992:123::o;15321:97::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;15392:10:1::1;:18:::0;15321:97::o;1555:423::-;3040:19:11;3062:25;3085:1;3062:22;:25::i;:::-;3040:47;;3102:14;3098:67;;;3133:13;:20;;-1:-1:-1;;3133:20:11;;;;;3098:67;1607:55:1::1;;;;;;;;;;;;;;-1:-1:-1::0;;;1607:55:1::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;1607:55:1::1;;::::0;:23:::1;:55::i;:::-;1673:26;:24;:26::i;:::-;1721:2;1712:6;:11:::0;;;1734:8:::1;:13:::0;1771:2:::1;1758:10;:15:::0;1786:19:::1;:64:::0;;-1:-1:-1;;;;;;1786:64:1::1;1808:42;1786:64;::::0;;1880:10:::1;1861:16;:29:::0;1916:10:::1;1901:12;:25:::0;1959:11:::1;1937:19;:33:::0;3187:68:11;;;;3238:5;3222:21;;-1:-1:-1;;3222:21:11;;;3187:68;3029:233;1555:423:1:o;14071:118::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;14151:12:1::1;:30:::0;14071:118::o;3030:102:5:-;3086:13;3118:7;3111:14;;;;;:::i;4675:153::-;4769:52;916:10:2;4802:8:5;4812;4769:18;:52::i;3784:637:1:-;3909:7;3969:12;;3956:9;:25;;:55;;;-1:-1:-1;4000:10:1;3985:26;;;;:14;:26;;;;;;;;3956:55;3934:122;;;;-1:-1:-1;;;3934:122:1;;27846:2:14;3934:122:1;;;27828:21:14;27885:2;27865:18;;;27858:30;-1:-1:-1;;;27904:18:14;;;27897:47;27961:18;;3934:122:1;27644:341:14;3934:122:1;4067:48;916:10:2;4106:8:1;4067:24;:48::i;:::-;4126:10;4139:34;916:10:2;4147:12:1;837:96:2;4139:34:1;916:10:2;4184:24:1;;;;:10;:24;;;;;:29;;;4240:12;;4126:47;;-1:-1:-1;4228:9:1;:24;4224:99;;;4310:12;;916:10:2;;4267:56:1;;4298:24;;:9;:24;:::i;:::-;4267:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4224:99;4339:54;4349:2;916:10:2;4367:8:1;4381:11;4339:54;;;;;;;;;:::i;:::-;;;;;;;;4411:2;3784:637;-1:-1:-1;;;3784:637:1:o;9237:219::-;9305:4;9330:14;9345:4;9330:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:33;:38;:77;;;;;9406:1;9391:4;9385:18;:22;9330:77;:117;;;;-1:-1:-1;;9424:18:1;9445:2;-1:-1:-1;9424:23:1;9237:219::o;14313:169::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;14430:19:1::1;:44:::0;14313:169::o;5759:320:5:-;5928:41;916:10:2;5961:7:5;5928:18;:41::i;:::-;5920:103;;;;-1:-1:-1;;;5920:103:5;;;;;;;:::i;:::-;6033:39;6047:4;6053:2;6057:7;6066:5;6033:13;:39::i;:::-;5759:320;;;;:::o;2524:969:1:-;7616:4:5;7639:16;;;:7;:16;;;;;;2625:13:1;;-1:-1:-1;;;;;7639:16:5;2656:113:1;;;;-1:-1:-1;;;2656:113:1;;23971:2:14;2656:113:1;;;23953:21:14;24010:2;23990:18;;;23983:30;24049:34;24029:18;;;24022:62;-1:-1:-1;;;24100:18:14;;;24093:45;24155:19;;2656:113:1;23769:411:14;2656:113:1;2782:23;2808:19;;;:10;:19;;;;;2782:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2909:12;2903:26;;;;;:::i;:::-;:31;2899:80;;-1:-1:-1;2899:80:1;;2958:9;2524:969;-1:-1:-1;;2524:969:1:o;2899:80::-;3083:23;;:27;3079:116;;3158:12;3172:9;3141:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3127:56;;;2524:969;;;:::o;3079:116::-;3380:12;3415:36;3443:7;3415:27;:36::i;:::-;3341:129;;;;;;;;;:::i;1297:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15220:93::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;15289:8:1::1;:16:::0;15220:93::o;14609:260::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;14727:19:1::1;::::0;-1:-1:-1;;;;;14713:33:1;;::::1;14727:19:::0;::::1;14713:33;;14691:127;;;::::0;-1:-1:-1;;;14691:127:1;;19582:2:14;14691:127:1::1;::::0;::::1;19564:21:14::0;19621:2;19601:18;;;19594:30;19660:34;19640:18;;;19633:62;-1:-1:-1;;;19711:18:14;;;19704:42;19763:19;;14691:127:1::1;19380:408:14::0;14691:127:1::1;14829:19;:32:::0;;-1:-1:-1;;;;;;14829:32:1::1;-1:-1:-1::0;;;;;14829:32:1;;;::::1;::::0;;;::::1;::::0;;14609:260::o;15123:89::-;1368:6:12;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;15190:6:1::1;:14:::0;15123:89::o;2204:201:12:-;1368:6;;-1:-1:-1;;;;;1368:6:12;916:10:2;1515:23:12;1507:68;;;;-1:-1:-1;;;1507:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2293:22:12;::::1;2285:73;;;::::0;-1:-1:-1;;;2285:73:12;;15779:2:14;2285:73:12::1;::::0;::::1;15761:21:14::0;15818:2;15798:18;;;15791:30;15857:34;15837:18;;;15830:62;-1:-1:-1;;;15908:18:14;;;15901:36;15954:19;;2285:73:12::1;15577:402:14::0;2285:73:12::1;2369:28;2388:8;2369:18;:28::i;13804:157:1:-:0;-1:-1:-1;;;;;13930:23:1;;;;;;:14;:23;;;;;13923:30;;13892:13;;13930:23;13923:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13804:157;;;:::o;11593:182:5:-;11667:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11667:29:5;-1:-1:-1;;;;;11667:29:5;;;;;;;;:24;;11720:34;11667:24;11720:25;:34::i;:::-;-1:-1:-1;;;;;11711:57:5;;;;;;;;;;;11593:182;;:::o;7834:355::-;7927:4;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;7943:73;;;;-1:-1:-1;;;7943:73:5;;19995:2:14;7943:73:5;;;19977:21:14;20034:2;20014:18;;;20007:30;20073:34;20053:18;;;20046:62;-1:-1:-1;;;20124:18:14;;;20117:42;20176:19;;7943:73:5;19793:408:14;7943:73:5;8026:13;8042:34;8068:7;8042:25;:34::i;:::-;8026:50;;8105:5;-1:-1:-1;;;;;8094:16:5;:7;-1:-1:-1;;;;;8094:16:5;;:52;;;-1:-1:-1;;;;;;5014:25:5;;;4991:4;5014:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8114:32;8094:87;;;;8174:7;-1:-1:-1;;;;;8150:31:5;:20;8162:7;8150:11;:20::i;:::-;-1:-1:-1;;;;;8150:31:5;;8094:87;8086:96;7834:355;-1:-1:-1;;;;7834:355:5:o;1986:239:1:-;-1:-1:-1;;;;;2119:18:1;;;2111:59;;;;-1:-1:-1;;;2111:59:1;;24746:2:14;2111:59:1;;;24728:21:14;24785:2;24765:18;;;24758:30;24824;24804:18;;;24797:58;24872:18;;2111:59:1;24544:352:14;2111:59:1;2183:34;2199:4;2205:2;2209:7;2183:15;:34::i;6135:3094::-;-1:-1:-1;;;;;6332:23:1;;6287:4;6332:23;;;:14;:23;;;;;6326:37;;6366:1;;6332:23;6326:37;;;:::i;:::-;;;:41;6304:125;;;;-1:-1:-1;;;6304:125:1;;;;;;;:::i;:::-;6487:1;6468:8;6462:22;:26;:57;;;;;6517:2;6498:8;6492:22;:27;6462:57;6440:142;;;;-1:-1:-1;;;6440:142:1;;;;;;;:::i;:::-;6644:1;6621:12;6615:26;:30;:65;;;;;6678:2;6655:12;6649:26;:31;6615:65;6593:154;;;;-1:-1:-1;;;6593:154:1;;14548:2:14;6593:154:1;;;14530:21:14;14587:2;14567:18;;;14560:30;14626:34;14606:18;;;14599:62;-1:-1:-1;;;14677:18:14;;;14670:37;14724:19;;6593:154:1;14346:403:14;6593:154:1;6824:1;-1:-1:-1;;;;;6780:46:1;:14;6795:8;6780:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;-1:-1:-1;;;;;6780:32:1;:46;6758:120;;;;-1:-1:-1;;;6758:120:1;;27143:2:14;6758:120:1;;;27125:21:14;27182:2;27162:18;;;27155:30;27221:26;27201:18;;;27194:54;27265:18;;6758:120:1;26941:348:14;6758:120:1;-1:-1:-1;;;;;6897:21:1;;6889:71;;;;-1:-1:-1;;;6889:71:1;;17354:2:14;6889:71:1;;;17336:21:14;17393:2;17373:18;;;17366:30;17432:34;17412:18;;;17405:62;-1:-1:-1;;;17483:18:14;;;17476:35;17528:19;;6889:71:1;17152:401:14;6889:71:1;7041:1;-1:-1:-1;;;;;6993:50:1;:14;7008:12;6993:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;-1:-1:-1;;;;;6993:36:1;:50;;6971:130;;;;-1:-1:-1;;;6971:130:1;;24387:2:14;6971:130:1;;;24369:21:14;24426:2;24406:18;;;24399:30;24465:32;24445:18;;;24438:60;24515:18;;6971:130:1;24185:354:14;6971:130:1;7174:7;-1:-1:-1;;;;;7134:47:1;:14;7149:12;7134:28;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;-1:-1:-1;;;;;7134:36:1;:47;;7112:133;;;;-1:-1:-1;;;7112:133:1;;25505:2:14;7112:133:1;;;25487:21:14;25544:2;25524:18;;;25517:30;25583:34;25563:18;;;25556:62;-1:-1:-1;;;25634:18:14;;;25627:34;25678:19;;7112:133:1;25303:400:14;7112:133:1;7258:20;7316:3;7304:8;;7282:19;;:30;;;;:::i;:::-;7281:38;;;;:::i;:::-;7258:61;;7330:17;7383:3;7373:6;;7351:19;;:28;;;;:::i;:::-;7350:36;;;;:::i;:::-;7330:56;;7397:17;7454:9;7439:12;7417:19;;:34;;;;:::i;:::-;:46;;;;:::i;:::-;7397:66;;7476:25;7504:14;7519:12;7504:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;7476:56;;;;;;;;;;;;;-1:-1:-1;;;;;7476:56:1;;;;;;;;;;;;;7504:28;;7476:56;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7476:56:1;;;-1:-1:-1;;7476:56:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7557:12;;;;-1:-1:-1;;;;;7543:27:1;-1:-1:-1;7543:27:1;;;:13;:27;;;;;:42;;7476:56;7543:42;;;;;;;;;;;;;7476:56;;-1:-1:-1;7543:42:1;;;;;;;;;:::i;:::-;-1:-1:-1;7602:18:1;;;;:26;;7624:4;7602:26;;;;:65;;;7666:1;7638:4;:17;;;7632:31;:35;7602:65;7598:919;;;7684:27;7714:14;7729:12;7714:28;;;;;;:::i;:::-;;;;;;;;;;;;;7684:58;;7799:16;;7779:4;:17;;;7761:15;:35;;;;:::i;:::-;:54;7757:708;;;7840:17;;;;:21;7836:507;;7916:56;7930:14;7945:4;:17;;;7930:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;-1:-1:-1;;;;;7930:41:1;-1:-1:-1;;;;;10049:23:1;10025:4;10049:23;;;:14;:23;;;;;;;;;9964:116;7916:56;7886:438;;;8031:19;;8091:17;;;;8023:112;;-1:-1:-1;;;;;8031:19:1;;;;8023:112;;;;;8091:17;8031:19;8023:112;8031:19;8023:112;8091:17;8031:19;8023:112;;;;;;;;;;;;;;;;;;;;;7886:438;;;8200:14;8215:4;:17;;;8200:33;;;;;;:::i;:::-;;;;;;;;;;;;;;:41;;;8282:17;;;;-1:-1:-1;;;;;8200:41:1;;;;8192:108;;;;;8282:17;8200:41;:33;:41;:33;8282:17;8200:41;8192:108;;;;;;;;;;;;;;;;;;;;;7886:438;8361:16;;;:23;;-1:-1:-1;;8361:23:1;8380:4;8361:23;;;7757:708;;;8425:16;;;:24;;-1:-1:-1;;8425:24:1;;;7757:708;8479:19;;:26;;-1:-1:-1;;8479:26:1;;;;;7598:919;8555:3;8533:19;;:25;8529:334;;;8579:27;8593:4;:12;;;-1:-1:-1;;;;;10049:23:1;10025:4;10049:23;;;:14;:23;;;;;;;;;9964:116;8579:27;8575:277;;;8635:19;;-1:-1:-1;;;;;8635:19:1;8627:60;8665:21;8677:9;8665;:21;:::i;:::-;8627:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8575:277;;;8736:4;:12;;;-1:-1:-1;;;;;8728:30:1;:41;8759:9;8728:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8796:19:1;;8788:48;;-1:-1:-1;;;;;8796:19:1;;;;8788:48;;;;;8826:9;;8796:19;8788:48;8796:19;8788:48;8826:9;8796:19;8788:48;;;;;;;;;;;;;;;;;;;;;8575:277;8902:250;;;;;;;;8945:15;8902:250;;-1:-1:-1;;;;;8902:250:1;;;;;;;;;;;;;;;;;;-1:-1:-1;8902:250:1;;;;;;;;;;8875:24;;:14;;:24;;8890:8;;8875:24;:::i;:::-;;;;;;;;;;;;;;;;:277;;;;;;;;;;;;;-1:-1:-1;;;;;;8875:277:1;-1:-1:-1;;;;;8875:277:1;;;;;;;;;;;;;;;:24;;:277;;;;;;;;;;;:::i;:::-;-1:-1:-1;8875:277:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8875:277:1;;;;;;;-1:-1:-1;;8875:277:1;;;;;;;;;;-1:-1:-1;;;;;9163:23:1;;8875:277;9163:23;;;:14;:23;;;;;;;;:34;;;;;;;;:::i;:::-;-1:-1:-1;9217:4:1;;6135:3094;-1:-1:-1;;;;;;;;6135:3094:1:o;2233:283::-;2328:7;2353:21;:9;1032:19:3;;1050:1;1032:19;;;945:123;2353:21:1;2385:10;2398:19;:9;918:14:3;;827:112;2398:19:1;2385:32;;2428:20;2438:5;2445:2;2428:9;:20::i;:::-;2459:29;2472:2;2476:11;2459:12;:29::i;:::-;2506:2;2233:283;-1:-1:-1;;;2233:283:1:o;12366:465::-;12466:13;;;12476:2;12466:13;;;12423;12466;;;;;;12449:14;;12466:13;;;;;;;;;;;-1:-1:-1;12466:13:1;12449:30;;12495:9;12490:307;12514:2;12510:1;:6;12490:307;;;12538:8;12594:6;12599:1;12594:2;:6;:::i;:::-;12589:12;;:1;:12;:::i;:::-;12585:17;;:1;:17;:::i;:::-;12562:41;;-1:-1:-1;;;;;12562:19:1;;:41;:::i;:::-;12549:56;;12538:67;;12620:9;12650:2;12645:1;12639:8;;:13;;;;:::i;:::-;12632:21;;12620:33;;12668:9;12709:2;12703:9;;12698:2;:14;;;;:::i;:::-;12693:1;12687:8;;:25;;;;:::i;:::-;12680:33;;12668:45;;12739:8;12744:2;12739:4;:8::i;:::-;12728:1;12730:5;12734:1;12730;:5;:::i;:::-;12728:8;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;12728:19:1;;;;;;;;;12777:8;12782:2;12777:4;:8::i;:::-;12762:1;12764:5;12768:1;12764;:5;:::i;:::-;:9;;12772:1;12764:9;:::i;:::-;12762:12;;;;;;;;:::i;:::-;;;;:23;-1:-1:-1;;;;;12762:23:1;;;;;;;;;12523:274;;;12518:3;;;;;:::i;:::-;;;;12490:307;;;-1:-1:-1;12821:1:1;12366:465;-1:-1:-1;;12366:465:1:o;339:703:13:-;395:13;612:10;608:51;;-1:-1:-1;;638:10:13;;;;;;;;;;;;-1:-1:-1;;;638:10:13;;;;;339:703::o;608:51::-;683:5;668:12;722:75;729:9;;722:75;;754:8;;;;:::i;:::-;;-1:-1:-1;776:10:13;;-1:-1:-1;784:2:13;776:10;;:::i;:::-;;;722:75;;;806:19;838:6;828:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;828:17:13;;806:39;;855:150;862:10;;855:150;;888:11;898:1;888:11;;:::i;:::-;;-1:-1:-1;956:10:13;964:2;956:5;:10;:::i;:::-;943:24;;:2;:24;:::i;:::-;930:39;;913:6;920;913:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;913:56:13;;;;;;;;-1:-1:-1;983:11:13;992:2;983:11;;:::i;:::-;;;855:150;;2565:191:12;2658:6;;;-1:-1:-1;;;;;2675:17:12;;;-1:-1:-1;;;;;;2675:17:12;;;;;;;2708:40;;2658:6;;;2675:17;2658:6;;2708:40;;2639:16;;2708:40;2628:128;2565:191;:::o;5196:823:11:-;5260:4;5597:13;;;;;;;5593:419;;;5653:7;:12;;5664:1;5653:12;:61;;;;-1:-1:-1;5708:4:11;1476:19:0;:23;5653:61:11;5627:169;;;;-1:-1:-1;;;5627:169:11;;;;;;;:::i;:::-;-1:-1:-1;5818:5:11;;5196:823;-1:-1:-1;5196:823:11:o;5593:419::-;5864:12;;:22;;;;:12;;:22;5856:81;;;;-1:-1:-1;;;5856:81:11;;;;;;;:::i;:::-;-1:-1:-1;5952:12:11;:22;;-1:-1:-1;;5952:22:11;;;;;;;;;;;;-1:-1:-1;;5196:823:11:o;5593:419::-;5196:823;;;:::o;1679:160:5:-;4593:13:11;;;;;;;4585:69;;;;-1:-1:-1;;;4585:69:11;;;;;;;:::i;:::-;1792:13:5;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;1815:17:5;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;1101:113:12:-:0;4593:13:11;;;;;;;4585:69;;;;-1:-1:-1;;;4585:69:11;;;;;;;:::i;:::-;1174:32:12::1;916:10:2::0;1174:18:12::1;:32::i;11910:307:5:-:0;12060:8;-1:-1:-1;;;;;12051:17:5;:5;-1:-1:-1;;;;;12051:17:5;;;12043:55;;;;-1:-1:-1;;;12043:55:5;;18165:2:14;12043:55:5;;;18147:21:14;18204:2;18184:18;;;18177:30;18243:27;18223:18;;;18216:55;18288:18;;12043:55:5;17963:349:14;12043:55:5;-1:-1:-1;;;;;12108:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12108:46:5;;;;;;;;;;12169:41;;13847::14;;;12169::5;;13820:18:14;12169:41:5;;;;;;;11910:307;;;:::o;5097:1030:1:-;-1:-1:-1;;;;;5234:23:1;;;;;;:14;:23;;;;;5228:37;;5268:1;;5234:23;5228:37;;;:::i;:::-;;;:41;5206:125;;;;-1:-1:-1;;;5206:125:1;;;;;;;:::i;:::-;5389:1;5370:8;5364:22;:26;:57;;;;;5419:2;5400:8;5394:22;:27;5364:57;5342:142;;;;-1:-1:-1;;;5342:142:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5503:21:1;;5495:66;;;;-1:-1:-1;;;5495:66:1;;18519:2:14;5495:66:1;;;18501:21:14;;;18538:18;;;18531:30;18597:34;18577:18;;;18570:62;18649:18;;5495:66:1;18317:356:14;5495:66:1;5638:1;-1:-1:-1;;;;;5594:46:1;:14;5609:8;5594:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:32;;;-1:-1:-1;;;;;5594:32:1;:46;5572:121;;;;-1:-1:-1;;;5572:121:1;;20408:2:14;5572:121:1;;;20390:21:14;20447:2;20427:18;;;20420:30;20486:27;20466:18;;;20459:55;20531:18;;5572:121:1;20206:349:14;5572:121:1;5733:229;;;;;;;;5776:15;5733:229;;;;5815:7;-1:-1:-1;;;;;5733:229:1;;;;;;;;;;;;;;;;;;;;;5882:1;5733:229;;;;5910:5;5733:229;;;;;;5945:5;5733:229;;;;;5706:14;5721:8;5706:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:256;;;;;;;;;;;;;-1:-1:-1;;;;;;5706:256:1;-1:-1:-1;;;;;5706:256:1;;;;;;;;;;;;;;;:24;;:256;;;;;;;;;;;:::i;:::-;-1:-1:-1;5706:256:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5706:256:1;;;;;;;-1:-1:-1;;5706:256:1;;;;;;;;;;-1:-1:-1;;;;;5973:23:1;;5706:256;5973:23;;;:14;:23;;;;;;;;:34;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6024:23:1;;;;;;:14;:23;;;;;;;;6020:36;;;5097:1030;;:::o;6020:36::-;6076:19;;6106:12;;6068:51;;-1:-1:-1;;;;;6076:19:1;;;;6068:51;;;;;6106:12;6076:19;6068:51;6076:19;6068:51;6106:12;6076:19;6068:51;;;;;;;;;;;;;;;;;;;6941:307:5;7092:28;7102:4;7108:2;7112:7;7092:9;:28::i;:::-;7138:48;7161:4;7167:2;7171:7;7180:5;7138:22;:48::i;:::-;7130:111;;;;-1:-1:-1;;;7130:111:5;;;;;;;:::i;10866:616::-;11031:4;-1:-1:-1;;;;;10993:42:5;:34;11019:7;10993:25;:34::i;:::-;-1:-1:-1;;;;;10993:42:5;;10985:92;;;;-1:-1:-1;;;10985:92:5;;16186:2:14;10985:92:5;;;16168:21:14;16225:2;16205:18;;;16198:30;16264:34;16244:18;;;16237:62;-1:-1:-1;;;16315:18:14;;;16308:35;16360:19;;10985:92:5;15984:401:14;10985:92:5;-1:-1:-1;;;;;11095:16:5;;11087:65;;;;-1:-1:-1;;;11087:65:5;;17760:2:14;11087:65:5;;;17742:21:14;17799:2;17779:18;;;17772:30;17838:34;17818:18;;;17811:62;-1:-1:-1;;;17889:18:14;;;17882:34;17933:19;;11087:65:5;17558:400:14;11087:65:5;11264:29;11281:1;11285:7;11264:8;:29::i;:::-;-1:-1:-1;;;;;11304:15:5;;;;;;:9;:15;;;;;:20;;11323:1;;11304:15;:20;;11323:1;;11304:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11334:13:5;;;;;;:9;:13;;;;;:18;;11351:1;;11334:13;:18;;11351:1;;11334:18;:::i;:::-;;;;-1:-1:-1;;11362:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11362:21:5;-1:-1:-1;;;;;11362:21:5;;;;;;;;;11399:27;;11362:16;;11399:27;;;;;;;3988:342;3918:412;;:::o;8519:108::-;8594:26;8604:2;8608:7;8594:26;;;;;;;;;;;;:9;:26::i;3501:275:1:-;7616:4:5;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;3616:110:1;;;;-1:-1:-1;;;3616:110:1;;23197:2:14;3616:110:1;;;23179:21:14;23236:2;23216:18;;;23209:30;23275:34;23255:18;;;23248:62;-1:-1:-1;;;23326:18:14;;;23319:42;23378:19;;3616:110:1;22995:408:14;3616:110:1;3737:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;12839:171::-;12886:8;12922:2;12911:8;;;;:13;12907:95;;;12940:15;:8;;;;12951:4;12940:15;:::i;:::-;12933:23;;;12839:171;-1:-1:-1;;12839:171:1:o;12907:95::-;12986:15;:8;;;;12997:4;12986:15;:::i;12770:800:5:-;12920:4;-1:-1:-1;;;;;12940:13:5;;1476:19:0;:23;12936:628:5;;12975:83;;-1:-1:-1;;;12975:83:5;;-1:-1:-1;;;;;12975:47:5;;;;;:83;;916:10:2;;13037:4:5;;13043:7;;13052:5;;12975:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12975:83:5;;;;;;;;-1:-1:-1;;12975:83:5;;;;;;;;;;;;:::i;:::-;;;12971:541;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13236:13:5;;13232:266;;13278:60;;-1:-1:-1;;;13278:60:5;;;;;;;:::i;13232:266::-;13450:6;13444:13;13435:6;13431:2;13427:15;13420:38;12971:541;-1:-1:-1;;;;;;13108:62:5;-1:-1:-1;;;13108:62:5;;-1:-1:-1;13101:69:5;;12936:628;-1:-1:-1;13549:4:5;12770:800;;;;;;:::o;8848:311::-;8973:18;8979:2;8983:7;8973:5;:18::i;:::-;9022:54;9053:1;9057:2;9061:7;9070:5;9022:22;:54::i;:::-;9001:151;;;;-1:-1:-1;;;9001:151:5;;;;;;;:::i;9481:427::-;-1:-1:-1;;;;;9560:16:5;;9552:61;;;;-1:-1:-1;;;9552:61:5;;22423:2:14;9552:61:5;;;22405:21:14;;;22442:18;;;22435:30;22501:34;22481:18;;;22474:62;22553:18;;9552:61:5;22221:356:14;9552:61:5;7616:4;7639:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7639:16:5;:30;9623:58;;;;-1:-1:-1;;;9623:58:5;;16592:2:14;9623:58:5;;;16574:21:14;16631:2;16611:18;;;16604:30;16670;16650:18;;;16643:58;16718:18;;9623:58:5;16390:352:14;9623:58:5;-1:-1:-1;;;;;9748:13:5;;;;;;:9;:13;;;;;:18;;9765:1;;9748:13;:18;;9765:1;;9748:18;:::i;:::-;;;;-1:-1:-1;;9776:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9776:21:5;-1:-1:-1;;;;;9776:21:5;;;;;;;;9813:33;;9776:16;;;9813:33;;9776:16;;9813:33;13198::1::1;13055:184:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:14;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:14;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:14;;757:42;;747:70;;813:1;810;803:12;828:221;871:5;924:3;917:4;909:6;905:17;901:27;891:55;;942:1;939;932:12;891:55;964:79;1039:3;1030:6;1017:20;1010:4;1002:6;998:17;964:79;:::i;1054:159::-;1121:20;;1181:6;1170:18;;1160:29;;1150:57;;1203:1;1200;1193:12;1218:186;1277:6;1330:2;1318:9;1309:7;1305:23;1301:32;1298:52;;;1346:1;1343;1336:12;1298:52;1369:29;1388:9;1369:29;:::i;1409:260::-;1477:6;1485;1538:2;1526:9;1517:7;1513:23;1509:32;1506:52;;;1554:1;1551;1544:12;1506:52;1577:29;1596:9;1577:29;:::i;:::-;1567:39;;1625:38;1659:2;1648:9;1644:18;1625:38;:::i;:::-;1615:48;;1409:260;;;;;:::o;1674:328::-;1751:6;1759;1767;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1859:29;1878:9;1859:29;:::i;:::-;1849:39;;1907:38;1941:2;1930:9;1926:18;1907:38;:::i;:::-;1897:48;;1992:2;1981:9;1977:18;1964:32;1954:42;;1674:328;;;;;:::o;2007:666::-;2102:6;2110;2118;2126;2179:3;2167:9;2158:7;2154:23;2150:33;2147:53;;;2196:1;2193;2186:12;2147:53;2219:29;2238:9;2219:29;:::i;:::-;2209:39;;2267:38;2301:2;2290:9;2286:18;2267:38;:::i;:::-;2257:48;;2352:2;2341:9;2337:18;2324:32;2314:42;;2407:2;2396:9;2392:18;2379:32;2434:18;2426:6;2423:30;2420:50;;;2466:1;2463;2456:12;2420:50;2489:22;;2542:4;2534:13;;2530:27;-1:-1:-1;2520:55:14;;2571:1;2568;2561:12;2520:55;2594:73;2659:7;2654:2;2641:16;2636:2;2632;2628:11;2594:73;:::i;:::-;2584:83;;;2007:666;;;;;;;:::o;2678:347::-;2743:6;2751;2804:2;2792:9;2783:7;2779:23;2775:32;2772:52;;;2820:1;2817;2810:12;2772:52;2843:29;2862:9;2843:29;:::i;:::-;2833:39;;2922:2;2911:9;2907:18;2894:32;2969:5;2962:13;2955:21;2948:5;2945:32;2935:60;;2991:1;2988;2981:12;2935:60;3014:5;3004:15;;;2678:347;;;;;:::o;3030:330::-;3105:6;3113;3121;3174:2;3162:9;3153:7;3149:23;3145:32;3142:52;;;3190:1;3187;3180:12;3142:52;3213:29;3232:9;3213:29;:::i;:::-;3203:39;;3261:37;3294:2;3283:9;3279:18;3261:37;:::i;:::-;3251:47;;3317:37;3350:2;3339:9;3335:18;3317:37;:::i;:::-;3307:47;;3030:330;;;;;:::o;3365:254::-;3433:6;3441;3494:2;3482:9;3473:7;3469:23;3465:32;3462:52;;;3510:1;3507;3500:12;3462:52;3533:29;3552:9;3533:29;:::i;:::-;3523:39;3609:2;3594:18;;;;3581:32;;-1:-1:-1;;;3365:254:14:o;3624:245::-;3682:6;3735:2;3723:9;3714:7;3710:23;3706:32;3703:52;;;3751:1;3748;3741:12;3703:52;3790:9;3777:23;3809:30;3833:5;3809:30;:::i;3874:249::-;3943:6;3996:2;3984:9;3975:7;3971:23;3967:32;3964:52;;;4012:1;4009;4002:12;3964:52;4044:9;4038:16;4063:30;4087:5;4063:30;:::i;4128:322::-;4197:6;4250:2;4238:9;4229:7;4225:23;4221:32;4218:52;;;4266:1;4263;4256:12;4218:52;4306:9;4293:23;4339:18;4331:6;4328:30;4325:50;;;4371:1;4368;4361:12;4325:50;4394;4436:7;4427:6;4416:9;4412:22;4394:50;:::i;4455:543::-;4543:6;4551;4604:2;4592:9;4583:7;4579:23;4575:32;4572:52;;;4620:1;4617;4610:12;4572:52;4660:9;4647:23;4689:18;4730:2;4722:6;4719:14;4716:34;;;4746:1;4743;4736:12;4716:34;4769:50;4811:7;4802:6;4791:9;4787:22;4769:50;:::i;:::-;4759:60;;4872:2;4861:9;4857:18;4844:32;4828:48;;4901:2;4891:8;4888:16;4885:36;;;4917:1;4914;4907:12;4885:36;;4940:52;4984:7;4973:8;4962:9;4958:24;4940:52;:::i;:::-;4930:62;;;4455:543;;;;;:::o;5003:743::-;5110:6;5118;5126;5179:2;5167:9;5158:7;5154:23;5150:32;5147:52;;;5195:1;5192;5185:12;5147:52;5235:9;5222:23;5264:18;5305:2;5297:6;5294:14;5291:34;;;5321:1;5318;5311:12;5291:34;5344:50;5386:7;5377:6;5366:9;5362:22;5344:50;:::i;:::-;5334:60;;5447:2;5436:9;5432:18;5419:32;5403:48;;5476:2;5466:8;5463:16;5460:36;;;5492:1;5489;5482:12;5460:36;5515:52;5559:7;5548:8;5537:9;5533:24;5515:52;:::i;:::-;5505:62;;5620:2;5609:9;5605:18;5592:32;5576:48;;5649:2;5639:8;5636:16;5633:36;;;5665:1;5662;5655:12;5633:36;;5688:52;5732:7;5721:8;5710:9;5706:24;5688:52;:::i;:::-;5678:62;;;5003:743;;;;;:::o;5751:180::-;5810:6;5863:2;5851:9;5842:7;5838:23;5834:32;5831:52;;;5879:1;5876;5869:12;5831:52;-1:-1:-1;5902:23:14;;5751:180;-1:-1:-1;5751:180:14:o;5936:184::-;6006:6;6059:2;6047:9;6038:7;6034:23;6030:32;6027:52;;;6075:1;6072;6065:12;6027:52;-1:-1:-1;6098:16:14;;5936:184;-1:-1:-1;5936:184:14:o;6125:257::-;6166:3;6204:5;6198:12;6231:6;6226:3;6219:19;6247:63;6303:6;6296:4;6291:3;6287:14;6280:4;6273:5;6269:16;6247:63;:::i;:::-;6364:2;6343:15;-1:-1:-1;;6339:29:14;6330:39;;;;6371:4;6326:50;;6125:257;-1:-1:-1;;6125:257:14:o;6387:973::-;6472:12;;6437:3;;6527:1;6547:18;;;;6600;;;;6627:61;;6681:4;6673:6;6669:17;6659:27;;6627:61;6707:2;6755;6747:6;6744:14;6724:18;6721:38;6718:161;;;6801:10;6796:3;6792:20;6789:1;6782:31;6836:4;6833:1;6826:15;6864:4;6861:1;6854:15;6718:161;6895:18;6922:104;;;;7040:1;7035:319;;;;6888:466;;6922:104;-1:-1:-1;;6955:24:14;;6943:37;;7000:16;;;;-1:-1:-1;6922:104:14;;7035:319;29726:1;29719:14;;;29763:4;29750:18;;7129:1;7143:165;7157:6;7154:1;7151:13;7143:165;;;7235:14;;7222:11;;;7215:35;7278:16;;;;7172:10;;7143:165;;;7147:3;;7337:6;7332:3;7328:16;7321:23;;6888:466;;;;;;;6387:973;;;;:::o;7365:276::-;7496:3;7534:6;7528:13;7550:53;7596:6;7591:3;7584:4;7576:6;7572:17;7550:53;:::i;:::-;7619:16;;;;;7365:276;-1:-1:-1;;7365:276:14:o;7646:1705::-;8158:3;8196:6;8190:13;8212:53;8258:6;8253:3;8246:4;8238:6;8234:17;8212:53;:::i;:::-;8328:13;;8287:16;;;;8350:57;8328:13;8287:16;8384:4;8372:17;;8350:57;:::i;:::-;8426:55;8471:8;8464:5;8460:20;8452:6;8426:55;:::i;:::-;8416:65;;;8512:6;8506:13;8528:54;8573:8;8569:2;8562:4;8554:6;8550:17;8528:54;:::i;:::-;8646:13;;8604:17;;;8668:57;8646:13;8604:17;8702:4;8690:17;;8668:57;:::i;:::-;8792:13;;8747:20;;;8814:57;8792:13;8747:20;8848:4;8836:17;;8814:57;:::i;:::-;8938:13;;8893:20;;;8960:57;8938:13;8893:20;8994:4;8982:17;;8960:57;:::i;:::-;9084:13;;9039:20;;;9106:57;9084:13;9039:20;9140:4;9128:17;;9106:57;:::i;:::-;9230:13;;9185:20;;;9252:57;9230:13;9185:20;9286:4;9274:17;;9252:57;:::i;:::-;9325:20;;7646:1705;-1:-1:-1;;;;;;;;;;;7646:1705:14:o;9356:633::-;9636:3;9674:6;9668:13;9690:53;9736:6;9731:3;9724:4;9716:6;9712:17;9690:53;:::i;:::-;9806:13;;9765:16;;;;9828:57;9806:13;9765:16;9862:4;9850:17;;9828:57;:::i;:::-;-1:-1:-1;;;9907:20:14;;9936:18;;;9981:1;9970:13;;9356:633;-1:-1:-1;;;;9356:633:14:o;9994:982::-;10423:3;10461:6;10455:13;10477:53;10523:6;10518:3;10511:4;10503:6;10499:17;10477:53;:::i;:::-;10593:13;;10552:16;;;;10615:57;10593:13;10552:16;10649:4;10637:17;;10615:57;:::i;:::-;-1:-1:-1;;;10694:20:14;;10745:17;;;10787:13;;10694:20;;10733:3;10809:65;10787:13;10861:1;10850:13;;10843:4;10831:17;;10809:65;:::i;:::-;10937:1;10893:20;;10929:10;;;10922:22;10968:1;10960:10;;9994:982;-1:-1:-1;;;;;9994:982:14:o;10981:633::-;11261:3;11299:6;11293:13;11315:53;11361:6;11356:3;11349:4;11341:6;11337:17;11315:53;:::i;:::-;11431:13;;11390:16;;;;11453:57;11431:13;11390:16;11487:4;11475:17;;11453:57;:::i;:::-;-1:-1:-1;;;11532:20:14;;11561:18;;;11606:1;11595:13;;10981:633;-1:-1:-1;;;;10981:633:14:o;11619:1001::-;11995:3;12033:6;12027:13;12049:53;12095:6;12090:3;12083:4;12075:6;12071:17;12049:53;:::i;:::-;12165:13;;12124:16;;;;12187:57;12165:13;12124:16;12221:4;12209:17;;12187:57;:::i;:::-;-1:-1:-1;;;12266:20:14;;12295:18;;;12338:13;;12360:65;12338:13;12412:1;12401:13;;12394:4;12382:17;;12360:65;:::i;:::-;12489:13;;12444:20;;;12511:62;12489:13;12560:1;12552:10;;12545:4;12533:17;;12511:62;:::i;:::-;12593:17;12612:1;12589:25;;11619:1001;-1:-1:-1;;;;;;11619:1001:14:o;12625:376::-;12801:3;12829:38;12863:3;12855:6;12829:38;:::i;:::-;12896:6;12890:13;12912:52;12957:6;12953:2;12946:4;12938:6;12934:17;12912:52;:::i;:::-;12980:15;;12625:376;-1:-1:-1;;;;12625:376:14:o;13214:488::-;-1:-1:-1;;;;;13483:15:14;;;13465:34;;13535:15;;13530:2;13515:18;;13508:43;13582:2;13567:18;;13560:34;;;13630:3;13625:2;13610:18;;13603:31;;;13408:4;;13651:45;;13676:19;;13668:6;13651:45;:::i;:::-;13643:53;13214:488;-1:-1:-1;;;;;;13214:488:14:o;14122:219::-;14271:2;14260:9;14253:21;14234:4;14291:44;14331:2;14320:9;14316:18;14308:6;14291:44;:::i;14754:399::-;14956:2;14938:21;;;14995:2;14975:18;;;14968:30;15034:34;15029:2;15014:18;;15007:62;-1:-1:-1;;;15100:2:14;15085:18;;15078:33;15143:3;15128:19;;14754:399::o;15158:414::-;15360:2;15342:21;;;15399:2;15379:18;;;15372:30;15438:34;15433:2;15418:18;;15411:62;-1:-1:-1;;;15504:2:14;15489:18;;15482:48;15562:3;15547:19;;15158:414::o;21806:410::-;22008:2;21990:21;;;22047:2;22027:18;;;22020:30;22086:34;22081:2;22066:18;;22059:62;-1:-1:-1;;;22152:2:14;22137:18;;22130:44;22206:3;22191:19;;21806:410::o;23408:356::-;23610:2;23592:21;;;23629:18;;;23622:30;23688:34;23683:2;23668:18;;23661:62;23755:2;23740:18;;23408:356::o;25708:398::-;25910:2;25892:21;;;25949:2;25929:18;;;25922:30;25988:34;25983:2;25968:18;;25961:62;-1:-1:-1;;;26054:2:14;26039:18;;26032:32;26096:3;26081:19;;25708:398::o;26111:413::-;26313:2;26295:21;;;26352:2;26332:18;;;26325:30;26391:34;26386:2;26371:18;;26364:62;-1:-1:-1;;;26457:2:14;26442:18;;26435:47;26514:3;26499:19;;26111:413::o;26529:407::-;26731:2;26713:21;;;26770:2;26750:18;;;26743:30;26809:34;26804:2;26789:18;;26782:62;-1:-1:-1;;;26875:2:14;26860:18;;26853:41;26926:3;26911:19;;26529:407::o;28172:714::-;28455:25;;;-1:-1:-1;;;;;28516:32:14;;28511:2;28496:18;;28489:60;28536:3;28580:2;28565:18;;28558:31;;;-1:-1:-1;;28612:45:14;;28637:19;;28629:6;28612:45;:::i;:::-;28705:9;28697:6;28693:22;28688:2;28677:9;28673:18;28666:50;28739:32;28764:6;28756;28739:32;:::i;:::-;28725:46;;28820:9;28812:6;28808:22;28802:3;28791:9;28787:19;28780:51;28848:32;28873:6;28865;28848:32;:::i;:::-;28840:40;28172:714;-1:-1:-1;;;;;;;;28172:714:14:o;28891:757::-;29227:25;;;-1:-1:-1;;;;;29288:32:14;;29283:2;29268:18;;29261:60;29308:3;29352:2;29337:18;;29330:31;;;-1:-1:-1;;29384:45:14;;29409:19;;29401:6;29384:45;:::i;:::-;29460:9;29452:6;29448:22;29506:2;29501;29490:9;29486:18;29479:30;29533:1;29525:6;29518:17;29580:2;29576;29572:11;29566:3;29555:9;29551:19;29544:40;;29601:41;29638:2;29630:6;29626:15;29618:6;29601:41;:::i;:::-;29593:49;28891:757;-1:-1:-1;;;;;;;28891:757:14:o;29779:224::-;29818:3;29846:6;29879:2;29876:1;29872:10;29909:2;29906:1;29902:10;29940:3;29936:2;29932:12;29927:3;29924:21;29921:47;;;29948:18;;:::i;30008:128::-;30048:3;30079:1;30075:6;30072:1;30069:13;30066:39;;;30085:18;;:::i;:::-;-1:-1:-1;30121:9:14;;30008:128::o;30141:204::-;30179:3;30215:4;30212:1;30208:12;30247:4;30244:1;30240:12;30282:3;30276:4;30272:14;30267:3;30264:23;30261:49;;;30290:18;;:::i;:::-;30326:13;;30141:204;-1:-1:-1;;;30141:204:14:o;30350:120::-;30390:1;30416;30406:35;;30421:18;;:::i;:::-;-1:-1:-1;30455:9:14;;30350:120::o;30475:165::-;30513:1;30547:4;30544:1;30540:12;30571:3;30561:37;;30578:18;;:::i;:::-;30630:3;30623:4;30620:1;30616:12;30612:22;30607:27;;;30475:165;;;;:::o;30645:422::-;30734:1;30777:5;30734:1;30791:270;30812:7;30802:8;30799:21;30791:270;;;30871:4;30867:1;30863:6;30859:17;30853:4;30850:27;30847:53;;;30880:18;;:::i;:::-;30930:7;30920:8;30916:22;30913:55;;;30950:16;;;;30913:55;31029:22;;;;30989:15;;;;30791:270;;;30795:3;30645:422;;;;;:::o;31072:131::-;31132:5;31161:36;31188:8;31182:4;31257:5;31287:8;31277:80;;-1:-1:-1;31328:1:14;31342:5;;31277:80;31376:4;31366:76;;-1:-1:-1;31413:1:14;31427:5;;31366:76;31458:4;31476:1;31471:59;;;;31544:1;31539:130;;;;31451:218;;31471:59;31501:1;31492:10;;31515:5;;;31539:130;31576:3;31566:8;31563:17;31560:43;;;31583:18;;:::i;:::-;-1:-1:-1;;31639:1:14;31625:16;;31654:5;;31451:218;;31753:2;31743:8;31740:16;31734:3;31728:4;31725:13;31721:36;31715:2;31705:8;31702:16;31697:2;31691:4;31688:12;31684:35;31681:77;31678:159;;;-1:-1:-1;31790:19:14;;;31822:5;;31678:159;31869:34;31894:8;31888:4;31869:34;:::i;:::-;31939:6;31935:1;31931:6;31927:19;31918:7;31915:32;31912:58;;;31950:18;;:::i;:::-;31988:20;;31208:806;-1:-1:-1;;;31208:806:14:o;32019:168::-;32059:7;32125:1;32121;32117:6;32113:14;32110:1;32107:21;32102:1;32095:9;32088:17;32084:45;32081:71;;;32132:18;;:::i;:::-;-1:-1:-1;32172:9:14;;32019:168::o;32192:238::-;32230:7;32270:4;32267:1;32263:12;32302:4;32299:1;32295:12;32362:3;32356:4;32352:14;32347:3;32344:23;32337:3;32330:11;32323:19;32319:49;32316:75;;;32371:18;;:::i;32435:125::-;32475:4;32503:1;32500;32497:8;32494:34;;;32508:18;;:::i;:::-;-1:-1:-1;32545:9:14;;32435:125::o;32565:195::-;32603:4;32640;32637:1;32633:12;32672:4;32669:1;32665:12;32697:3;32692;32689:12;32686:38;;;32704:18;;:::i;:::-;32741:13;;;32565:195;-1:-1:-1;;;32565:195:14:o;32765:258::-;32837:1;32847:113;32861:6;32858:1;32855:13;32847:113;;;32937:11;;;32931:18;32918:11;;;32911:39;32883:2;32876:10;32847:113;;;32978:6;32975:1;32972:13;32969:48;;;-1:-1:-1;;33013:1:14;32995:16;;32988:27;32765:258::o;33028:380::-;33107:1;33103:12;;;;33150;;;33171:61;;33225:4;33217:6;33213:17;33203:27;;33171:61;33278:2;33270:6;33267:14;33247:18;33244:38;33241:161;;;33324:10;33319:3;33315:20;33312:1;33305:31;33359:4;33356:1;33349:15;33387:4;33384:1;33377:15;33241:161;;33028:380;;;:::o;33413:135::-;33452:3;-1:-1:-1;;33473:17:14;;33470:43;;;33493:18;;:::i;:::-;-1:-1:-1;33540:1:14;33529:13;;33413:135::o;33553:112::-;33585:1;33611;33601:35;;33616:18;;:::i;:::-;-1:-1:-1;33650:9:14;;33553:112::o;33670:127::-;33731:10;33726:3;33722:20;33719:1;33712:31;33762:4;33759:1;33752:15;33786:4;33783:1;33776:15;33802:127;33863:10;33858:3;33854:20;33851:1;33844:31;33894:4;33891:1;33884:15;33918:4;33915:1;33908:15;33934:127;33995:10;33990:3;33986:20;33983:1;33976:31;34026:4;34023:1;34016:15;34050:4;34047:1;34040:15;34066:127;34127:10;34122:3;34118:20;34115:1;34108:31;34158:4;34155:1;34148:15;34182:4;34179:1;34172:15;34198:131;-1:-1:-1;;;;;;34272:32:14;;34262:43;;34252:71;;34319:1;34316;34309:12
Swarm Source
ipfs://add2ae2ac984126259f379d15db49f4b0cc4e5426a593bc2622c7951f88d4657
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.