ERC-721
Overview
Max Total Supply
8,080 FLUX
Holders
3,534
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FLUXLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FyatLux
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.0; import './ERC721Enumerable.sol'; import './Ownable.sol'; import './Strings.sol'; import './MerkleProof.sol'; contract FyatLux is ERC721Enumerable, Ownable { using Strings for uint256; uint256 public totalPublicSupply; uint256 public totalGiftSupply; uint256 public PURCHASE_LIMIT = 2; uint256 public PRICE = 0.125 ether; uint256 public constant FL_GIFT = 50; uint256 public constant FL_PUBLIC = 8030; uint256 public constant MAX_SUPPLY = FL_PUBLIC + FL_GIFT; bool public _isAllowListRequired = true; bool public isActive = false; mapping(address => uint256) private _allowListClaimed; string private _contractURI = ''; string private _tokenBaseURI = ''; string private _tokenRevealedBaseURI = ''; bytes32 private _allowedRoot; constructor(string memory name, string memory symbol) ERC721(name, symbol) {} function getRoot() external onlyOwner view returns (bytes32) { return _allowedRoot; } function setRoot(bytes32 newRoot) external onlyOwner { _allowedRoot = newRoot; } function isAllowListRequired() external onlyOwner view returns (bool){ return _isAllowListRequired; } function setAllowListRequired(bool isRequired) external onlyOwner { _isAllowListRequired = isRequired; } function setPurchaseLimit(uint256 limit) external onlyOwner { require(limit > 0, 'Limit must be larger than 0'); PURCHASE_LIMIT = limit; } function setTokenPrice(uint256 newPrice) external onlyOwner { PRICE = newPrice; } function purchase(uint256 numberOfTokens, bytes32[] calldata proof) external payable { require(numberOfTokens > 0, 'Minted tokens must be larger than 0'); require(isActive, 'Contract is not active'); require(totalSupply() < MAX_SUPPLY, 'All tokens have been minted'); require(numberOfTokens <= PURCHASE_LIMIT, 'Would exceed PURCHASE_LIMIT'); require(_allowListClaimed[msg.sender] + numberOfTokens <= PURCHASE_LIMIT, 'Would surpass number of allocations.'); if(_isAllowListRequired){ bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); require(MerkleProof.verify(proof, _allowedRoot, leaf), 'Invalid proof.'); } require(totalPublicSupply < FL_PUBLIC, 'Purchase would exceed Public Supply.'); require(PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient'); for (uint256 i = 0; i < numberOfTokens; i++) { if (totalPublicSupply < FL_PUBLIC) { uint256 tId = FL_GIFT + totalPublicSupply + 1; totalPublicSupply += 1; _allowListClaimed[msg.sender] += 1; _safeMint(msg.sender, tId); } } } function gift(address[] calldata to) external onlyOwner { require(totalSupply() < MAX_SUPPLY, 'All tokens have been minted'); require(totalGiftSupply + to.length <= FL_GIFT, 'Not enough tokens left to gift'); for(uint256 i = 0; i < to.length; i++) { uint256 tokenId = totalGiftSupply + 1; totalGiftSupply += 1; _safeMint(to[i], tokenId); } } function setIsActive(bool _isActive) external onlyOwner { isActive = _isActive; } function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function setContractURI(string calldata URI) external onlyOwner { _contractURI = URI; } function setBaseURI(string calldata URI) external onlyOwner { _tokenBaseURI = URI; } function setRevealedBaseURI(string calldata revealedBaseURI) external onlyOwner { _tokenRevealedBaseURI = revealedBaseURI; } function contractURI() public view returns (string memory) { return _contractURI; } function isWhitelisted(bytes32[] calldata proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(proof, _allowedRoot, leaf); } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), 'Token does not exist'); string memory revealedBaseURI = _tokenRevealedBaseURI; return bytes(revealedBaseURI).length > 0 ? string(abi.encodePacked(revealedBaseURI, tokenId.toString())) : _tokenBaseURI; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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 pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @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 pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ 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
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FL_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FL_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_isAllowListRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRequired","type":"bool"}],"name":"setAllowListRequired","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setPurchaseLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526002600d556701bc16d674ec8000600e556001600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff02191690831515021790555060405180602001604052806000815250601190805190602001906200007292919062000222565b5060405180602001604052806000815250601290805190602001906200009a92919062000222565b506040518060200160405280600081525060139080519060200190620000c292919062000222565b50348015620000d057600080fd5b50604051620054ce380380620054ce8339818101604052810190620000f6919062000344565b818181600090805190602001906200011092919062000222565b5080600190805190602001906200012992919062000222565b5050506200014c620001406200015460201b60201c565b6200015c60201b60201c565b5050620004e8565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002309062000454565b90600052602060002090601f016020900481019282620002545760008555620002a0565b82601f106200026f57805160ff1916838001178555620002a0565b82800160010185558215620002a0579182015b828111156200029f57825182559160200191906001019062000282565b5b509050620002af9190620002b3565b5090565b5b80821115620002ce576000816000905550600101620002b4565b5090565b6000620002e9620002e384620003eb565b620003b7565b9050828152602081018484840111156200030257600080fd5b6200030f8482856200041e565b509392505050565b600082601f8301126200032957600080fd5b81516200033b848260208601620002d2565b91505092915050565b600080604083850312156200035857600080fd5b600083015167ffffffffffffffff8111156200037357600080fd5b620003818582860162000317565b925050602083015167ffffffffffffffff8111156200039f57600080fd5b620003ad8582860162000317565b9150509250929050565b6000604051905081810181811067ffffffffffffffff82111715620003e157620003e0620004b9565b5b8060405250919050565b600067ffffffffffffffff821115620004095762000408620004b9565b5b601f19601f8301169050602081019050919050565b60005b838110156200043e57808201518184015260208101905062000421565b838111156200044e576000848401525b50505050565b600060028204905060018216806200046d57607f821691505b602082108114156200048457620004836200048a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614fd680620004f86000396000f3fe60806040526004361061025c5760003560e01c80636352211e11610144578063b6c35e8e116100b6578063da7e7c501161007a578063da7e7c50146108e6578063dab5f34014610902578063e6a5931e1461092b578063e8a3d48514610956578063e985e9c514610981578063f2fde38b146109be5761025c565b8063b6c35e8e146107ff578063b88d4fde1461082a578063c87b56dd14610853578063d6f407c714610890578063d75e6110146108bb5761025c565b8063715018a611610108578063715018a6146107155780638d859f3e1461072c5780638da5cb5b14610757578063938e3d7b1461078257806395d89b41146107ab578063a22cb465146107d65761025c565b80636352211e146106205780636a61e5fc1461065d5780636e83843a146106865780636edc4388146106af57806370a08231146106d85761025c565b806322f3e2d4116101dd5780633ccfd60b116101a15780633ccfd60b1461052657806342842e0e1461053d5780634f6ccce71461056657806355808dfe146105a357806355f804b3146105cc5780635ca1e165146105f55761025c565b806322f3e2d41461044157806323b872dd1461046c5780632750fc78146104955780632f745c59146104be57806332cb6b0c146104fb5761025c565b8063095ea7b311610224578063095ea7b31461036e5780630db9765714610397578063132a97da146103c2578063163e1e61146103ed57806318160ddd146104165761025c565b806301ffc9a7146102615780630672a2591461029e578063069824fb146102c957806306fdde0314610306578063081812fc14610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ab6565b6109e7565b604051610295919061470d565b60405180910390f35b3480156102aa57600080fd5b506102b3610a61565b6040516102c0919061470d565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613a1f565b610a74565b6040516102fd919061470d565b60405180910390f35b34801561031257600080fd5b5061031b610af7565b6040516103289190614743565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190613b4d565b610b89565b60405161036591906146a6565b60405180910390f35b34801561037a57600080fd5b506103956004803603810190610390919061399e565b610c0e565b005b3480156103a357600080fd5b506103ac610d26565b6040516103b9919061470d565b60405180910390f35b3480156103ce57600080fd5b506103d7610db9565b6040516103e49190614ae5565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906139da565b610dbf565b005b34801561042257600080fd5b5061042b610f91565b6040516104389190614ae5565b60405180910390f35b34801561044d57600080fd5b50610456610f9e565b604051610463919061470d565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613898565b610fb1565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613a64565b611011565b005b3480156104ca57600080fd5b506104e560048036038101906104e0919061399e565b6110aa565b6040516104f29190614ae5565b60405180910390f35b34801561050757600080fd5b5061051061114f565b60405161051d9190614ae5565b60405180910390f35b34801561053257600080fd5b5061053b611161565b005b34801561054957600080fd5b50610564600480360381019061055f9190613898565b61122c565b005b34801561057257600080fd5b5061058d60048036038101906105889190613b4d565b61124c565b60405161059a9190614ae5565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613a64565b6112e3565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613b08565b61137c565b005b34801561060157600080fd5b5061060a61140e565b6040516106179190614728565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613b4d565b611494565b60405161065491906146a6565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190613b4d565b611546565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613b08565b6115cc565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613b4d565b61165e565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613833565b611727565b60405161070c9190614ae5565b60405180910390f35b34801561072157600080fd5b5061072a6117df565b005b34801561073857600080fd5b50610741611867565b60405161074e9190614ae5565b60405180910390f35b34801561076357600080fd5b5061076c61186d565b60405161077991906146a6565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613b08565b611897565b005b3480156107b757600080fd5b506107c0611929565b6040516107cd9190614743565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613962565b6119bb565b005b34801561080b57600080fd5b50610814611b3c565b6040516108219190614ae5565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906138e7565b611b41565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613b4d565b611ba3565b6040516108879190614743565b60405180910390f35b34801561089c57600080fd5b506108a5611d48565b6040516108b29190614ae5565b60405180910390f35b3480156108c757600080fd5b506108d0611d4e565b6040516108dd9190614ae5565b60405180910390f35b61090060048036038101906108fb9190613b76565b611d54565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a8d565b612142565b005b34801561093757600080fd5b506109406121c8565b60405161094d9190614ae5565b60405180910390f35b34801561096257600080fd5b5061096b6121ce565b6040516109789190614743565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061385c565b612260565b6040516109b5919061470d565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e09190613833565b6122f4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5a5750610a59826123ec565b5b9050919050565b600f60009054906101000a900460ff1681565b60008033604051602001610a88919061463b565b604051602081830303815290604052805190602001209050610aee848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836124ce565b91505092915050565b606060008054610b0690614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3290614d79565b8015610b7f5780601f10610b5457610100808354040283529160200191610b7f565b820191906000526020600020905b815481529060010190602001808311610b6257829003601f168201915b5050505050905090565b6000610b94826125aa565b610bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bca90614985565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1982611494565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614a25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca9612616565b73ffffffffffffffffffffffffffffffffffffffff161480610cd85750610cd781610cd2612616565b612260565b5b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906148e5565b60405180910390fd5b610d21838361261e565b505050565b6000610d30612616565b73ffffffffffffffffffffffffffffffffffffffff16610d4e61186d565b73ffffffffffffffffffffffffffffffffffffffff1614610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b906149a5565b60405180910390fd5b600f60009054906101000a900460ff16905090565b611f5e81565b610dc7612616565b73ffffffffffffffffffffffffffffffffffffffff16610de561186d565b73ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e32906149a5565b60405180910390fd5b6032611f5e610e4a9190614ba4565b610e52610f91565b10610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614ac5565b60405180910390fd5b603282829050600c54610ea59190614ba4565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614a05565b60405180910390fd5b60005b82829050811015610f8c5760006001600c54610f059190614ba4565b90506001600c6000828254610f1a9190614ba4565b92505081905550610f78848484818110610f5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f729190613833565b826126d7565b508080610f8490614dab565b915050610ee9565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b610fc2610fbc612616565b826126f5565b611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890614a65565b60405180910390fd5b61100c8383836127d3565b505050565b611019612616565b73ffffffffffffffffffffffffffffffffffffffff1661103761186d565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906149a5565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60006110b583611727565b82106110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90614765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6032611f5e61115e9190614ba4565b81565b611169612616565b73ffffffffffffffffffffffffffffffffffffffff1661118761186d565b73ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d4906149a5565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611228573d6000803e3d6000fd5b5050565b61124783838360405180602001604052806000815250611b41565b505050565b6000611256610f91565b8210611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614a85565b60405180910390fd5b600882815481106112d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112eb612616565b73ffffffffffffffffffffffffffffffffffffffff1661130961186d565b73ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906149a5565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611384612616565b73ffffffffffffffffffffffffffffffffffffffff166113a261186d565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef906149a5565b60405180910390fd5b8181601291906114099291906135cc565b505050565b6000611418612616565b73ffffffffffffffffffffffffffffffffffffffff1661143661186d565b73ffffffffffffffffffffffffffffffffffffffff161461148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906149a5565b60405180910390fd5b601454905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614925565b60405180910390fd5b80915050919050565b61154e612616565b73ffffffffffffffffffffffffffffffffffffffff1661156c61186d565b73ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b9906149a5565b60405180910390fd5b80600e8190555050565b6115d4612616565b73ffffffffffffffffffffffffffffffffffffffff166115f261186d565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f906149a5565b60405180910390fd5b8181601391906116599291906135cc565b505050565b611666612616565b73ffffffffffffffffffffffffffffffffffffffff1661168461186d565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906149a5565b60405180910390fd5b6000811161171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906148c5565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614905565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e7612616565b73ffffffffffffffffffffffffffffffffffffffff1661180561186d565b73ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611852906149a5565b60405180910390fd5b6118656000612a2f565b565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61189f612616565b73ffffffffffffffffffffffffffffffffffffffff166118bd61186d565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906149a5565b60405180910390fd5b8181601191906119249291906135cc565b505050565b60606001805461193890614d79565b80601f016020809104026020016040519081016040528092919081815260200182805461196490614d79565b80156119b15780601f10611986576101008083540402835291602001916119b1565b820191906000526020600020905b81548152906001019060200180831161199457829003601f168201915b5050505050905090565b6119c3612616565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890614845565b60405180910390fd5b8060056000611a3e612616565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aeb612616565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b30919061470d565b60405180910390a35050565b603281565b611b52611b4c612616565b836126f5565b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890614a65565b60405180910390fd5b611b9d84848484612af5565b50505050565b6060611bae826125aa565b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490614865565b60405180910390fd5b600060138054611bfc90614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2890614d79565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505090506000815111611d155760128054611c9290614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe90614d79565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b5050505050611d40565b80611d1f84612b51565b604051602001611d30929190614682565b6040516020818303038152906040525b915050919050565b600c5481565b600d5481565b60008311611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e906147a5565b60405180910390fd5b600f60019054906101000a900460ff16611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614965565b60405180910390fd5b6032611f5e611df59190614ba4565b611dfd610f91565b10611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490614ac5565b60405180910390fd5b600d54831115611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614805565b60405180910390fd5b600d5483601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ed09190614ba4565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614a45565b60405180910390fd5b600f60009054906101000a900460ff1615611fe057600033604051602001611f39919061463b565b604051602081830303815290604052805190602001209050611f9f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836124ce565b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590614aa5565b60405180910390fd5b505b611f5e600b5410612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906149c5565b60405180910390fd5b3483600e546120359190614c2b565b1115612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614885565b60405180910390fd5b60005b8381101561213c57611f5e600b5410156121295760006001600b5460326120a09190614ba4565b6120aa9190614ba4565b90506001600b60008282546120bf9190614ba4565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121169190614ba4565b9250508190555061212733826126d7565b505b808061213490614dab565b915050612079565b50505050565b61214a612616565b73ffffffffffffffffffffffffffffffffffffffff1661216861186d565b73ffffffffffffffffffffffffffffffffffffffff16146121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b5906149a5565b60405180910390fd5b8060148190555050565b600b5481565b6060601180546121dd90614d79565b80601f016020809104026020016040519081016040528092919081815260200182805461220990614d79565b80156122565780601f1061222b57610100808354040283529160200191612256565b820191906000526020600020905b81548152906001019060200180831161223957829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122fc612616565b73ffffffffffffffffffffffffffffffffffffffff1661231a61186d565b73ffffffffffffffffffffffffffffffffffffffff1614612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612367906149a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d7906147c5565b60405180910390fd5b6123e981612a2f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124c757506124c682612cfe565b5b9050919050565b60008082905060005b855181101561259c57600086828151811061251b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161255c57828160405160200161253f929190614656565b604051602081830303815290604052805190602001209250612588565b808360405160200161256f929190614656565b6040516020818303038152906040528051906020012092505b50808061259490614dab565b9150506124d7565b508381149150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611494565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6126f1828260405180602001604052806000815250612d68565b5050565b6000612700826125aa565b61273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906148a5565b60405180910390fd5b600061274a83611494565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b957508373ffffffffffffffffffffffffffffffffffffffff166127a184610b89565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ca57506127c98185612260565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127f382611494565b73ffffffffffffffffffffffffffffffffffffffff1614612849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612840906149e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090614825565b60405180910390fd5b6128c4838383612dc3565b6128cf60008261261e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291f9190614c85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129769190614ba4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b008484846127d3565b612b0c84848484612ed7565b612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614785565b60405180910390fd5b50505050565b60606000821415612b99576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cf9565b600082905060005b60008214612bcb578080612bb490614dab565b915050600a82612bc49190614bfa565b9150612ba1565b60008167ffffffffffffffff811115612c0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c3f5781602001600182028036833780820191505090505b5090505b60008514612cf257600182612c589190614c85565b9150600a85612c679190614e22565b6030612c739190614ba4565b60f81b818381518110612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ceb9190614bfa565b9450612c43565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d72838361306e565b612d7f6000848484612ed7565b612dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db590614785565b60405180910390fd5b505050565b612dce83838361323c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1157612e0c81613241565b612e50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e4f57612e4e838261328a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9357612e8e816133f7565b612ed2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ed157612ed0828261353a565b5b5b505050565b6000612ef88473ffffffffffffffffffffffffffffffffffffffff166135b9565b15613061578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f21612616565b8786866040518563ffffffff1660e01b8152600401612f4394939291906146c1565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613adf565b60015b613011573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090614785565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613066565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d590614945565b60405180910390fd5b6130e7816125aa565b15613127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311e906147e5565b60405180910390fd5b61313360008383612dc3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131839190614ba4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161329784611727565b6132a19190614c85565b9050600060076000848152602001908152602001600020549050818114613386576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061340b9190614c85565b9050600060096000848152602001908152602001600020549050600060088381548110613461577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106134a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061351e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061354583611727565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546135d890614d79565b90600052602060002090601f0160209004810192826135fa5760008555613641565b82601f1061361357803560ff1916838001178555613641565b82800160010185558215613641579182015b82811115613640578235825591602001919060010190613625565b5b50905061364e9190613652565b5090565b5b8082111561366b576000816000905550600101613653565b5090565b600061368261367d84614b31565b614b00565b90508281526020810184848401111561369a57600080fd5b6136a5848285614d37565b509392505050565b6000813590506136bc81614f2d565b92915050565b60008083601f8401126136d457600080fd5b8235905067ffffffffffffffff8111156136ed57600080fd5b60208301915083602082028301111561370557600080fd5b9250929050565b60008083601f84011261371e57600080fd5b8235905067ffffffffffffffff81111561373757600080fd5b60208301915083602082028301111561374f57600080fd5b9250929050565b60008135905061376581614f44565b92915050565b60008135905061377a81614f5b565b92915050565b60008135905061378f81614f72565b92915050565b6000815190506137a481614f72565b92915050565b600082601f8301126137bb57600080fd5b81356137cb84826020860161366f565b91505092915050565b60008083601f8401126137e657600080fd5b8235905067ffffffffffffffff8111156137ff57600080fd5b60208301915083600182028301111561381757600080fd5b9250929050565b60008135905061382d81614f89565b92915050565b60006020828403121561384557600080fd5b6000613853848285016136ad565b91505092915050565b6000806040838503121561386f57600080fd5b600061387d858286016136ad565b925050602061388e858286016136ad565b9150509250929050565b6000806000606084860312156138ad57600080fd5b60006138bb868287016136ad565b93505060206138cc868287016136ad565b92505060406138dd8682870161381e565b9150509250925092565b600080600080608085870312156138fd57600080fd5b600061390b878288016136ad565b945050602061391c878288016136ad565b935050604061392d8782880161381e565b925050606085013567ffffffffffffffff81111561394a57600080fd5b613956878288016137aa565b91505092959194509250565b6000806040838503121561397557600080fd5b6000613983858286016136ad565b925050602061399485828601613756565b9150509250929050565b600080604083850312156139b157600080fd5b60006139bf858286016136ad565b92505060206139d08582860161381e565b9150509250929050565b600080602083850312156139ed57600080fd5b600083013567ffffffffffffffff811115613a0757600080fd5b613a13858286016136c2565b92509250509250929050565b60008060208385031215613a3257600080fd5b600083013567ffffffffffffffff811115613a4c57600080fd5b613a588582860161370c565b92509250509250929050565b600060208284031215613a7657600080fd5b6000613a8484828501613756565b91505092915050565b600060208284031215613a9f57600080fd5b6000613aad8482850161376b565b91505092915050565b600060208284031215613ac857600080fd5b6000613ad684828501613780565b91505092915050565b600060208284031215613af157600080fd5b6000613aff84828501613795565b91505092915050565b60008060208385031215613b1b57600080fd5b600083013567ffffffffffffffff811115613b3557600080fd5b613b41858286016137d4565b92509250509250929050565b600060208284031215613b5f57600080fd5b6000613b6d8482850161381e565b91505092915050565b600080600060408486031215613b8b57600080fd5b6000613b998682870161381e565b935050602084013567ffffffffffffffff811115613bb657600080fd5b613bc28682870161370c565b92509250509250925092565b613bd781614cb9565b82525050565b613bee613be982614cb9565b614df4565b82525050565b613bfd81614ccb565b82525050565b613c0c81614cd7565b82525050565b613c23613c1e82614cd7565b614e06565b82525050565b6000613c3482614b61565b613c3e8185614b77565b9350613c4e818560208601614d46565b613c5781614f0f565b840191505092915050565b6000613c6d82614b6c565b613c778185614b88565b9350613c87818560208601614d46565b613c9081614f0f565b840191505092915050565b6000613ca682614b6c565b613cb08185614b99565b9350613cc0818560208601614d46565b80840191505092915050565b6000613cd9602b83614b88565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3f603283614b88565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613da5602383614b88565b91507f4d696e74656420746f6b656e73206d757374206265206c61726765722074686160008301527f6e203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0b602683614b88565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e71601c83614b88565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613eb1601b83614b88565b91507f576f756c64206578636565642050555243484153455f4c494d495400000000006000830152602082019050919050565b6000613ef1602483614b88565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f57601983614b88565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f97601483614b88565b91507f546f6b656e20646f6573206e6f742065786973740000000000000000000000006000830152602082019050919050565b6000613fd7601c83614b88565b91507f45544820616d6f756e74206973206e6f742073756666696369656e74000000006000830152602082019050919050565b6000614017602c83614b88565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061407d601b83614b88565b91507f4c696d6974206d757374206265206c6172676572207468616e203000000000006000830152602082019050919050565b60006140bd603883614b88565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614123602a83614b88565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614189602983614b88565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef602083614b88565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061422f601683614b88565b91507f436f6e7472616374206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061426f602c83614b88565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142d5602083614b88565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614315602483614b88565b91507f507572636861736520776f756c6420657863656564205075626c69632053757060008301527f706c792e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061437b602983614b88565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e1601e83614b88565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206769667400006000830152602082019050919050565b6000614421602183614b88565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614487602483614b88565b91507f576f756c642073757270617373206e756d626572206f6620616c6c6f6361746960008301527f6f6e732e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ed603183614b88565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614553602c83614b88565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006145b9600e83614b88565b91507f496e76616c69642070726f6f662e0000000000000000000000000000000000006000830152602082019050919050565b60006145f9601b83614b88565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b61463581614d2d565b82525050565b60006146478284613bdd565b60148201915081905092915050565b60006146628285613c12565b6020820191506146728284613c12565b6020820191508190509392505050565b600061468e8285613c9b565b915061469a8284613c9b565b91508190509392505050565b60006020820190506146bb6000830184613bce565b92915050565b60006080820190506146d66000830187613bce565b6146e36020830186613bce565b6146f0604083018561462c565b81810360608301526147028184613c29565b905095945050505050565b60006020820190506147226000830184613bf4565b92915050565b600060208201905061473d6000830184613c03565b92915050565b6000602082019050818103600083015261475d8184613c62565b905092915050565b6000602082019050818103600083015261477e81613ccc565b9050919050565b6000602082019050818103600083015261479e81613d32565b9050919050565b600060208201905081810360008301526147be81613d98565b9050919050565b600060208201905081810360008301526147de81613dfe565b9050919050565b600060208201905081810360008301526147fe81613e64565b9050919050565b6000602082019050818103600083015261481e81613ea4565b9050919050565b6000602082019050818103600083015261483e81613ee4565b9050919050565b6000602082019050818103600083015261485e81613f4a565b9050919050565b6000602082019050818103600083015261487e81613f8a565b9050919050565b6000602082019050818103600083015261489e81613fca565b9050919050565b600060208201905081810360008301526148be8161400a565b9050919050565b600060208201905081810360008301526148de81614070565b9050919050565b600060208201905081810360008301526148fe816140b0565b9050919050565b6000602082019050818103600083015261491e81614116565b9050919050565b6000602082019050818103600083015261493e8161417c565b9050919050565b6000602082019050818103600083015261495e816141e2565b9050919050565b6000602082019050818103600083015261497e81614222565b9050919050565b6000602082019050818103600083015261499e81614262565b9050919050565b600060208201905081810360008301526149be816142c8565b9050919050565b600060208201905081810360008301526149de81614308565b9050919050565b600060208201905081810360008301526149fe8161436e565b9050919050565b60006020820190508181036000830152614a1e816143d4565b9050919050565b60006020820190508181036000830152614a3e81614414565b9050919050565b60006020820190508181036000830152614a5e8161447a565b9050919050565b60006020820190508181036000830152614a7e816144e0565b9050919050565b60006020820190508181036000830152614a9e81614546565b9050919050565b60006020820190508181036000830152614abe816145ac565b9050919050565b60006020820190508181036000830152614ade816145ec565b9050919050565b6000602082019050614afa600083018461462c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b2757614b26614ee0565b5b8060405250919050565b600067ffffffffffffffff821115614b4c57614b4b614ee0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614baf82614d2d565b9150614bba83614d2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bef57614bee614e53565b5b828201905092915050565b6000614c0582614d2d565b9150614c1083614d2d565b925082614c2057614c1f614e82565b5b828204905092915050565b6000614c3682614d2d565b9150614c4183614d2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c7a57614c79614e53565b5b828202905092915050565b6000614c9082614d2d565b9150614c9b83614d2d565b925082821015614cae57614cad614e53565b5b828203905092915050565b6000614cc482614d0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d64578082015181840152602081019050614d49565b83811115614d73576000848401525b50505050565b60006002820490506001821680614d9157607f821691505b60208210811415614da557614da4614eb1565b5b50919050565b6000614db682614d2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614de957614de8614e53565b5b600182019050919050565b6000614dff82614e10565b9050919050565b6000819050919050565b6000614e1b82614f20565b9050919050565b6000614e2d82614d2d565b9150614e3883614d2d565b925082614e4857614e47614e82565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614f3681614cb9565b8114614f4157600080fd5b50565b614f4d81614ccb565b8114614f5857600080fd5b50565b614f6481614cd7565b8114614f6f57600080fd5b50565b614f7b81614ce1565b8114614f8657600080fd5b50565b614f9281614d2d565b8114614f9d57600080fd5b5056fea264697066735822122055dd91d708d35d99d982de12031068b68480b0edde2cac9cf2b79606f465eec564736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000846796174204c75780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004464c555800000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80636352211e11610144578063b6c35e8e116100b6578063da7e7c501161007a578063da7e7c50146108e6578063dab5f34014610902578063e6a5931e1461092b578063e8a3d48514610956578063e985e9c514610981578063f2fde38b146109be5761025c565b8063b6c35e8e146107ff578063b88d4fde1461082a578063c87b56dd14610853578063d6f407c714610890578063d75e6110146108bb5761025c565b8063715018a611610108578063715018a6146107155780638d859f3e1461072c5780638da5cb5b14610757578063938e3d7b1461078257806395d89b41146107ab578063a22cb465146107d65761025c565b80636352211e146106205780636a61e5fc1461065d5780636e83843a146106865780636edc4388146106af57806370a08231146106d85761025c565b806322f3e2d4116101dd5780633ccfd60b116101a15780633ccfd60b1461052657806342842e0e1461053d5780634f6ccce71461056657806355808dfe146105a357806355f804b3146105cc5780635ca1e165146105f55761025c565b806322f3e2d41461044157806323b872dd1461046c5780632750fc78146104955780632f745c59146104be57806332cb6b0c146104fb5761025c565b8063095ea7b311610224578063095ea7b31461036e5780630db9765714610397578063132a97da146103c2578063163e1e61146103ed57806318160ddd146104165761025c565b806301ffc9a7146102615780630672a2591461029e578063069824fb146102c957806306fdde0314610306578063081812fc14610331575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613ab6565b6109e7565b604051610295919061470d565b60405180910390f35b3480156102aa57600080fd5b506102b3610a61565b6040516102c0919061470d565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613a1f565b610a74565b6040516102fd919061470d565b60405180910390f35b34801561031257600080fd5b5061031b610af7565b6040516103289190614743565b60405180910390f35b34801561033d57600080fd5b5061035860048036038101906103539190613b4d565b610b89565b60405161036591906146a6565b60405180910390f35b34801561037a57600080fd5b506103956004803603810190610390919061399e565b610c0e565b005b3480156103a357600080fd5b506103ac610d26565b6040516103b9919061470d565b60405180910390f35b3480156103ce57600080fd5b506103d7610db9565b6040516103e49190614ae5565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f91906139da565b610dbf565b005b34801561042257600080fd5b5061042b610f91565b6040516104389190614ae5565b60405180910390f35b34801561044d57600080fd5b50610456610f9e565b604051610463919061470d565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e9190613898565b610fb1565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613a64565b611011565b005b3480156104ca57600080fd5b506104e560048036038101906104e0919061399e565b6110aa565b6040516104f29190614ae5565b60405180910390f35b34801561050757600080fd5b5061051061114f565b60405161051d9190614ae5565b60405180910390f35b34801561053257600080fd5b5061053b611161565b005b34801561054957600080fd5b50610564600480360381019061055f9190613898565b61122c565b005b34801561057257600080fd5b5061058d60048036038101906105889190613b4d565b61124c565b60405161059a9190614ae5565b60405180910390f35b3480156105af57600080fd5b506105ca60048036038101906105c59190613a64565b6112e3565b005b3480156105d857600080fd5b506105f360048036038101906105ee9190613b08565b61137c565b005b34801561060157600080fd5b5061060a61140e565b6040516106179190614728565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613b4d565b611494565b60405161065491906146a6565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f9190613b4d565b611546565b005b34801561069257600080fd5b506106ad60048036038101906106a89190613b08565b6115cc565b005b3480156106bb57600080fd5b506106d660048036038101906106d19190613b4d565b61165e565b005b3480156106e457600080fd5b506106ff60048036038101906106fa9190613833565b611727565b60405161070c9190614ae5565b60405180910390f35b34801561072157600080fd5b5061072a6117df565b005b34801561073857600080fd5b50610741611867565b60405161074e9190614ae5565b60405180910390f35b34801561076357600080fd5b5061076c61186d565b60405161077991906146a6565b60405180910390f35b34801561078e57600080fd5b506107a960048036038101906107a49190613b08565b611897565b005b3480156107b757600080fd5b506107c0611929565b6040516107cd9190614743565b60405180910390f35b3480156107e257600080fd5b506107fd60048036038101906107f89190613962565b6119bb565b005b34801561080b57600080fd5b50610814611b3c565b6040516108219190614ae5565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c91906138e7565b611b41565b005b34801561085f57600080fd5b5061087a60048036038101906108759190613b4d565b611ba3565b6040516108879190614743565b60405180910390f35b34801561089c57600080fd5b506108a5611d48565b6040516108b29190614ae5565b60405180910390f35b3480156108c757600080fd5b506108d0611d4e565b6040516108dd9190614ae5565b60405180910390f35b61090060048036038101906108fb9190613b76565b611d54565b005b34801561090e57600080fd5b5061092960048036038101906109249190613a8d565b612142565b005b34801561093757600080fd5b506109406121c8565b60405161094d9190614ae5565b60405180910390f35b34801561096257600080fd5b5061096b6121ce565b6040516109789190614743565b60405180910390f35b34801561098d57600080fd5b506109a860048036038101906109a3919061385c565b612260565b6040516109b5919061470d565b60405180910390f35b3480156109ca57600080fd5b506109e560048036038101906109e09190613833565b6122f4565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5a5750610a59826123ec565b5b9050919050565b600f60009054906101000a900460ff1681565b60008033604051602001610a88919061463b565b604051602081830303815290604052805190602001209050610aee848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836124ce565b91505092915050565b606060008054610b0690614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3290614d79565b8015610b7f5780601f10610b5457610100808354040283529160200191610b7f565b820191906000526020600020905b815481529060010190602001808311610b6257829003601f168201915b5050505050905090565b6000610b94826125aa565b610bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bca90614985565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c1982611494565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614a25565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca9612616565b73ffffffffffffffffffffffffffffffffffffffff161480610cd85750610cd781610cd2612616565b612260565b5b610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906148e5565b60405180910390fd5b610d21838361261e565b505050565b6000610d30612616565b73ffffffffffffffffffffffffffffffffffffffff16610d4e61186d565b73ffffffffffffffffffffffffffffffffffffffff1614610da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9b906149a5565b60405180910390fd5b600f60009054906101000a900460ff16905090565b611f5e81565b610dc7612616565b73ffffffffffffffffffffffffffffffffffffffff16610de561186d565b73ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e32906149a5565b60405180910390fd5b6032611f5e610e4a9190614ba4565b610e52610f91565b10610e92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8990614ac5565b60405180910390fd5b603282829050600c54610ea59190614ba4565b1115610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90614a05565b60405180910390fd5b60005b82829050811015610f8c5760006001600c54610f059190614ba4565b90506001600c6000828254610f1a9190614ba4565b92505081905550610f78848484818110610f5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610f729190613833565b826126d7565b508080610f8490614dab565b915050610ee9565b505050565b6000600880549050905090565b600f60019054906101000a900460ff1681565b610fc2610fbc612616565b826126f5565b611001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff890614a65565b60405180910390fd5b61100c8383836127d3565b505050565b611019612616565b73ffffffffffffffffffffffffffffffffffffffff1661103761186d565b73ffffffffffffffffffffffffffffffffffffffff161461108d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611084906149a5565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b60006110b583611727565b82106110f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ed90614765565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6032611f5e61115e9190614ba4565b81565b611169612616565b73ffffffffffffffffffffffffffffffffffffffff1661118761186d565b73ffffffffffffffffffffffffffffffffffffffff16146111dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d4906149a5565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611228573d6000803e3d6000fd5b5050565b61124783838360405180602001604052806000815250611b41565b505050565b6000611256610f91565b8210611297576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128e90614a85565b60405180910390fd5b600882815481106112d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112eb612616565b73ffffffffffffffffffffffffffffffffffffffff1661130961186d565b73ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611356906149a5565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b611384612616565b73ffffffffffffffffffffffffffffffffffffffff166113a261186d565b73ffffffffffffffffffffffffffffffffffffffff16146113f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ef906149a5565b60405180910390fd5b8181601291906114099291906135cc565b505050565b6000611418612616565b73ffffffffffffffffffffffffffffffffffffffff1661143661186d565b73ffffffffffffffffffffffffffffffffffffffff161461148c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611483906149a5565b60405180910390fd5b601454905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561153d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153490614925565b60405180910390fd5b80915050919050565b61154e612616565b73ffffffffffffffffffffffffffffffffffffffff1661156c61186d565b73ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b9906149a5565b60405180910390fd5b80600e8190555050565b6115d4612616565b73ffffffffffffffffffffffffffffffffffffffff166115f261186d565b73ffffffffffffffffffffffffffffffffffffffff1614611648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163f906149a5565b60405180910390fd5b8181601391906116599291906135cc565b505050565b611666612616565b73ffffffffffffffffffffffffffffffffffffffff1661168461186d565b73ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d1906149a5565b60405180910390fd5b6000811161171d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611714906148c5565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f90614905565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117e7612616565b73ffffffffffffffffffffffffffffffffffffffff1661180561186d565b73ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611852906149a5565b60405180910390fd5b6118656000612a2f565b565b600e5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61189f612616565b73ffffffffffffffffffffffffffffffffffffffff166118bd61186d565b73ffffffffffffffffffffffffffffffffffffffff1614611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906149a5565b60405180910390fd5b8181601191906119249291906135cc565b505050565b60606001805461193890614d79565b80601f016020809104026020016040519081016040528092919081815260200182805461196490614d79565b80156119b15780601f10611986576101008083540402835291602001916119b1565b820191906000526020600020905b81548152906001019060200180831161199457829003601f168201915b5050505050905090565b6119c3612616565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2890614845565b60405180910390fd5b8060056000611a3e612616565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aeb612616565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611b30919061470d565b60405180910390a35050565b603281565b611b52611b4c612616565b836126f5565b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8890614a65565b60405180910390fd5b611b9d84848484612af5565b50505050565b6060611bae826125aa565b611bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be490614865565b60405180910390fd5b600060138054611bfc90614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2890614d79565b8015611c755780601f10611c4a57610100808354040283529160200191611c75565b820191906000526020600020905b815481529060010190602001808311611c5857829003601f168201915b505050505090506000815111611d155760128054611c9290614d79565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe90614d79565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b5050505050611d40565b80611d1f84612b51565b604051602001611d30929190614682565b6040516020818303038152906040525b915050919050565b600c5481565b600d5481565b60008311611d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8e906147a5565b60405180910390fd5b600f60019054906101000a900460ff16611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90614965565b60405180910390fd5b6032611f5e611df59190614ba4565b611dfd610f91565b10611e3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3490614ac5565b60405180910390fd5b600d54831115611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614805565b60405180910390fd5b600d5483601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ed09190614ba4565b1115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614a45565b60405180910390fd5b600f60009054906101000a900460ff1615611fe057600033604051602001611f39919061463b565b604051602081830303815290604052805190602001209050611f9f838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601454836124ce565b611fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd590614aa5565b60405180910390fd5b505b611f5e600b5410612026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201d906149c5565b60405180910390fd5b3483600e546120359190614c2b565b1115612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90614885565b60405180910390fd5b60005b8381101561213c57611f5e600b5410156121295760006001600b5460326120a09190614ba4565b6120aa9190614ba4565b90506001600b60008282546120bf9190614ba4565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121169190614ba4565b9250508190555061212733826126d7565b505b808061213490614dab565b915050612079565b50505050565b61214a612616565b73ffffffffffffffffffffffffffffffffffffffff1661216861186d565b73ffffffffffffffffffffffffffffffffffffffff16146121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b5906149a5565b60405180910390fd5b8060148190555050565b600b5481565b6060601180546121dd90614d79565b80601f016020809104026020016040519081016040528092919081815260200182805461220990614d79565b80156122565780601f1061222b57610100808354040283529160200191612256565b820191906000526020600020905b81548152906001019060200180831161223957829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122fc612616565b73ffffffffffffffffffffffffffffffffffffffff1661231a61186d565b73ffffffffffffffffffffffffffffffffffffffff1614612370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612367906149a5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d7906147c5565b60405180910390fd5b6123e981612a2f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124b757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124c757506124c682612cfe565b5b9050919050565b60008082905060005b855181101561259c57600086828151811061251b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831161255c57828160405160200161253f929190614656565b604051602081830303815290604052805190602001209250612588565b808360405160200161256f929190614656565b6040516020818303038152906040528051906020012092505b50808061259490614dab565b9150506124d7565b508381149150509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661269183611494565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6126f1828260405180602001604052806000815250612d68565b5050565b6000612700826125aa565b61273f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612736906148a5565b60405180910390fd5b600061274a83611494565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b957508373ffffffffffffffffffffffffffffffffffffffff166127a184610b89565b73ffffffffffffffffffffffffffffffffffffffff16145b806127ca57506127c98185612260565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127f382611494565b73ffffffffffffffffffffffffffffffffffffffff1614612849576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612840906149e5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b090614825565b60405180910390fd5b6128c4838383612dc3565b6128cf60008261261e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291f9190614c85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129769190614ba4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b008484846127d3565b612b0c84848484612ed7565b612b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4290614785565b60405180910390fd5b50505050565b60606000821415612b99576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cf9565b600082905060005b60008214612bcb578080612bb490614dab565b915050600a82612bc49190614bfa565b9150612ba1565b60008167ffffffffffffffff811115612c0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c3f5781602001600182028036833780820191505090505b5090505b60008514612cf257600182612c589190614c85565b9150600a85612c679190614e22565b6030612c739190614ba4565b60f81b818381518110612caf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ceb9190614bfa565b9450612c43565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d72838361306e565b612d7f6000848484612ed7565b612dbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db590614785565b60405180910390fd5b505050565b612dce83838361323c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e1157612e0c81613241565b612e50565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e4f57612e4e838261328a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e9357612e8e816133f7565b612ed2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ed157612ed0828261353a565b5b5b505050565b6000612ef88473ffffffffffffffffffffffffffffffffffffffff166135b9565b15613061578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f21612616565b8786866040518563ffffffff1660e01b8152600401612f4394939291906146c1565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613adf565b60015b613011573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300090614785565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613066565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130d590614945565b60405180910390fd5b6130e7816125aa565b15613127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311e906147e5565b60405180910390fd5b61313360008383612dc3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131839190614ba4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161329784611727565b6132a19190614c85565b9050600060076000848152602001908152602001600020549050818114613386576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061340b9190614c85565b9050600060096000848152602001908152602001600020549050600060088381548110613461577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106134a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061351e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061354583611727565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546135d890614d79565b90600052602060002090601f0160209004810192826135fa5760008555613641565b82601f1061361357803560ff1916838001178555613641565b82800160010185558215613641579182015b82811115613640578235825591602001919060010190613625565b5b50905061364e9190613652565b5090565b5b8082111561366b576000816000905550600101613653565b5090565b600061368261367d84614b31565b614b00565b90508281526020810184848401111561369a57600080fd5b6136a5848285614d37565b509392505050565b6000813590506136bc81614f2d565b92915050565b60008083601f8401126136d457600080fd5b8235905067ffffffffffffffff8111156136ed57600080fd5b60208301915083602082028301111561370557600080fd5b9250929050565b60008083601f84011261371e57600080fd5b8235905067ffffffffffffffff81111561373757600080fd5b60208301915083602082028301111561374f57600080fd5b9250929050565b60008135905061376581614f44565b92915050565b60008135905061377a81614f5b565b92915050565b60008135905061378f81614f72565b92915050565b6000815190506137a481614f72565b92915050565b600082601f8301126137bb57600080fd5b81356137cb84826020860161366f565b91505092915050565b60008083601f8401126137e657600080fd5b8235905067ffffffffffffffff8111156137ff57600080fd5b60208301915083600182028301111561381757600080fd5b9250929050565b60008135905061382d81614f89565b92915050565b60006020828403121561384557600080fd5b6000613853848285016136ad565b91505092915050565b6000806040838503121561386f57600080fd5b600061387d858286016136ad565b925050602061388e858286016136ad565b9150509250929050565b6000806000606084860312156138ad57600080fd5b60006138bb868287016136ad565b93505060206138cc868287016136ad565b92505060406138dd8682870161381e565b9150509250925092565b600080600080608085870312156138fd57600080fd5b600061390b878288016136ad565b945050602061391c878288016136ad565b935050604061392d8782880161381e565b925050606085013567ffffffffffffffff81111561394a57600080fd5b613956878288016137aa565b91505092959194509250565b6000806040838503121561397557600080fd5b6000613983858286016136ad565b925050602061399485828601613756565b9150509250929050565b600080604083850312156139b157600080fd5b60006139bf858286016136ad565b92505060206139d08582860161381e565b9150509250929050565b600080602083850312156139ed57600080fd5b600083013567ffffffffffffffff811115613a0757600080fd5b613a13858286016136c2565b92509250509250929050565b60008060208385031215613a3257600080fd5b600083013567ffffffffffffffff811115613a4c57600080fd5b613a588582860161370c565b92509250509250929050565b600060208284031215613a7657600080fd5b6000613a8484828501613756565b91505092915050565b600060208284031215613a9f57600080fd5b6000613aad8482850161376b565b91505092915050565b600060208284031215613ac857600080fd5b6000613ad684828501613780565b91505092915050565b600060208284031215613af157600080fd5b6000613aff84828501613795565b91505092915050565b60008060208385031215613b1b57600080fd5b600083013567ffffffffffffffff811115613b3557600080fd5b613b41858286016137d4565b92509250509250929050565b600060208284031215613b5f57600080fd5b6000613b6d8482850161381e565b91505092915050565b600080600060408486031215613b8b57600080fd5b6000613b998682870161381e565b935050602084013567ffffffffffffffff811115613bb657600080fd5b613bc28682870161370c565b92509250509250925092565b613bd781614cb9565b82525050565b613bee613be982614cb9565b614df4565b82525050565b613bfd81614ccb565b82525050565b613c0c81614cd7565b82525050565b613c23613c1e82614cd7565b614e06565b82525050565b6000613c3482614b61565b613c3e8185614b77565b9350613c4e818560208601614d46565b613c5781614f0f565b840191505092915050565b6000613c6d82614b6c565b613c778185614b88565b9350613c87818560208601614d46565b613c9081614f0f565b840191505092915050565b6000613ca682614b6c565b613cb08185614b99565b9350613cc0818560208601614d46565b80840191505092915050565b6000613cd9602b83614b88565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3f603283614b88565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613da5602383614b88565b91507f4d696e74656420746f6b656e73206d757374206265206c61726765722074686160008301527f6e203000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e0b602683614b88565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e71601c83614b88565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613eb1601b83614b88565b91507f576f756c64206578636565642050555243484153455f4c494d495400000000006000830152602082019050919050565b6000613ef1602483614b88565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f57601983614b88565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f97601483614b88565b91507f546f6b656e20646f6573206e6f742065786973740000000000000000000000006000830152602082019050919050565b6000613fd7601c83614b88565b91507f45544820616d6f756e74206973206e6f742073756666696369656e74000000006000830152602082019050919050565b6000614017602c83614b88565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061407d601b83614b88565b91507f4c696d6974206d757374206265206c6172676572207468616e203000000000006000830152602082019050919050565b60006140bd603883614b88565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614123602a83614b88565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614189602983614b88565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006141ef602083614b88565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061422f601683614b88565b91507f436f6e7472616374206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061426f602c83614b88565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006142d5602083614b88565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614315602483614b88565b91507f507572636861736520776f756c6420657863656564205075626c69632053757060008301527f706c792e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061437b602983614b88565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006143e1601e83614b88565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206769667400006000830152602082019050919050565b6000614421602183614b88565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614487602483614b88565b91507f576f756c642073757270617373206e756d626572206f6620616c6c6f6361746960008301527f6f6e732e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144ed603183614b88565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614553602c83614b88565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006145b9600e83614b88565b91507f496e76616c69642070726f6f662e0000000000000000000000000000000000006000830152602082019050919050565b60006145f9601b83614b88565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b61463581614d2d565b82525050565b60006146478284613bdd565b60148201915081905092915050565b60006146628285613c12565b6020820191506146728284613c12565b6020820191508190509392505050565b600061468e8285613c9b565b915061469a8284613c9b565b91508190509392505050565b60006020820190506146bb6000830184613bce565b92915050565b60006080820190506146d66000830187613bce565b6146e36020830186613bce565b6146f0604083018561462c565b81810360608301526147028184613c29565b905095945050505050565b60006020820190506147226000830184613bf4565b92915050565b600060208201905061473d6000830184613c03565b92915050565b6000602082019050818103600083015261475d8184613c62565b905092915050565b6000602082019050818103600083015261477e81613ccc565b9050919050565b6000602082019050818103600083015261479e81613d32565b9050919050565b600060208201905081810360008301526147be81613d98565b9050919050565b600060208201905081810360008301526147de81613dfe565b9050919050565b600060208201905081810360008301526147fe81613e64565b9050919050565b6000602082019050818103600083015261481e81613ea4565b9050919050565b6000602082019050818103600083015261483e81613ee4565b9050919050565b6000602082019050818103600083015261485e81613f4a565b9050919050565b6000602082019050818103600083015261487e81613f8a565b9050919050565b6000602082019050818103600083015261489e81613fca565b9050919050565b600060208201905081810360008301526148be8161400a565b9050919050565b600060208201905081810360008301526148de81614070565b9050919050565b600060208201905081810360008301526148fe816140b0565b9050919050565b6000602082019050818103600083015261491e81614116565b9050919050565b6000602082019050818103600083015261493e8161417c565b9050919050565b6000602082019050818103600083015261495e816141e2565b9050919050565b6000602082019050818103600083015261497e81614222565b9050919050565b6000602082019050818103600083015261499e81614262565b9050919050565b600060208201905081810360008301526149be816142c8565b9050919050565b600060208201905081810360008301526149de81614308565b9050919050565b600060208201905081810360008301526149fe8161436e565b9050919050565b60006020820190508181036000830152614a1e816143d4565b9050919050565b60006020820190508181036000830152614a3e81614414565b9050919050565b60006020820190508181036000830152614a5e8161447a565b9050919050565b60006020820190508181036000830152614a7e816144e0565b9050919050565b60006020820190508181036000830152614a9e81614546565b9050919050565b60006020820190508181036000830152614abe816145ac565b9050919050565b60006020820190508181036000830152614ade816145ec565b9050919050565b6000602082019050614afa600083018461462c565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614b2757614b26614ee0565b5b8060405250919050565b600067ffffffffffffffff821115614b4c57614b4b614ee0565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614baf82614d2d565b9150614bba83614d2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614bef57614bee614e53565b5b828201905092915050565b6000614c0582614d2d565b9150614c1083614d2d565b925082614c2057614c1f614e82565b5b828204905092915050565b6000614c3682614d2d565b9150614c4183614d2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c7a57614c79614e53565b5b828202905092915050565b6000614c9082614d2d565b9150614c9b83614d2d565b925082821015614cae57614cad614e53565b5b828203905092915050565b6000614cc482614d0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614d64578082015181840152602081019050614d49565b83811115614d73576000848401525b50505050565b60006002820490506001821680614d9157607f821691505b60208210811415614da557614da4614eb1565b5b50919050565b6000614db682614d2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614de957614de8614e53565b5b600182019050919050565b6000614dff82614e10565b9050919050565b6000819050919050565b6000614e1b82614f20565b9050919050565b6000614e2d82614d2d565b9150614e3883614d2d565b925082614e4857614e47614e82565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b614f3681614cb9565b8114614f4157600080fd5b50565b614f4d81614ccb565b8114614f5857600080fd5b50565b614f6481614cd7565b8114614f6f57600080fd5b50565b614f7b81614ce1565b8114614f8657600080fd5b50565b614f9281614d2d565b8114614f9d57600080fd5b5056fea264697066735822122055dd91d708d35d99d982de12031068b68480b0edde2cac9cf2b79606f465eec564736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000846796174204c75780000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004464c555800000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): Fyat Lux
Arg [1] : symbol (string): FLUX
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [3] : 46796174204c7578000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 464c555800000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
166:4076:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;536:39:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3693:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3860:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3398:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1087:107:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;431:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2664:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1534:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;579:28:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4724:330:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3048:87:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1210:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;475:56:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3139:132;;;;;;;;;;;;;:::i;:::-;;5120:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1717:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1198:110:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3372:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;902:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2052:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1464:87:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3466:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1312:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1790:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1598:92:12;;;;;;;;;;;;;:::i;:::-;;353:34:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;966:85:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3275:93:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2511:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4144:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;391:36:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5365:320:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3896:344:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;282:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;316:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1555:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;997:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;246:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3600:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4500:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1839:189:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;909:222:4;1011:4;1049:35;1034:50;;;:11;:50;;;;:90;;;;1088:36;1112:11;1088:23;:36::i;:::-;1034:90;1027:97;;909:222;;;:::o;536:39:5:-;;;;;;;;;;;;;:::o;3693:199::-;3763:4;3775:12;3817:10;3800:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;3790:39;;;;;;3775:54;;3842:45;3861:5;;3842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3868:12;;3882:4;3842:18;:45::i;:::-;3835:52;;;3693:199;;;;:::o;2349:98:3:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:15;:24;4062:7;4046:24;;;;;;;;;;;;;;;;;;;;;4039:31;;3860:217;;;:::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;3535:11;;:2;:11;;;;3527:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3632:5;3616:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;:::-;3641:16;:37::i;:::-;3616:62;3595:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;1087:107:5:-;1151:4;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1169:20:5::1;;;;;;;;;;;1162:27;;1087:107:::0;:::o;431:40::-;467:4;431:40;:::o;2664:380::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;425:2:5::1;467:4;512:19;;;;:::i;:::-;2734:13;:11;:13::i;:::-;:26;2726:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;425:2;2824;;:9;;2806:15;;:27;;;;:::i;:::-;:38;;2798:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;2890:9;2886:154;2909:2;;:9;;2905:1;:13;2886:154;;;2934:15;2970:1;2952:15;;:19;;;;:::i;:::-;2934:37;;2999:1;2980:15;;:20;;;;;;;:::i;:::-;;;;;;;;3008:25;3018:2;;3021:1;3018:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3025:7;3008:9;:25::i;:::-;2886:154;2920:3;;;;;:::i;:::-;;;;2886:154;;;;2664:380:::0;;:::o;1534:111:4:-;1595:7;1621:10;:17;;;;1614:24;;1534:111;:::o;579:28:5:-;;;;;;;;;;;;;:::o;4724:330:3:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;:::-;4724:330;;;:::o;3048:87:5:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3121:9:5::1;3110:8;;:20;;;;;;;;;;;;;;;;;;3048:87:::0;:::o;1210:253:4:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1430:12;:19;1443:5;1430:19;;;;;;;;;;;;;;;:26;1450:5;1430:26;;;;;;;;;;;;1423:33;;1210:253;;;;:::o;475:56:5:-;425:2;467:4;512:19;;;;:::i;:::-;475:56;:::o;3139:132::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3184:15:5::1;3202:21;3184:39;;3237:10;3229:28;;:37;3258:7;3229:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1248:1:12;3139:132:5:o:0;5120:179:3:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;:::-;5120:179;;;:::o;1717:230:4:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1923:10;1934:5;1923:17;;;;;;;;;;;;;;;;;;;;;;;;1916:24;;1717:230;;;:::o;1198:110:5:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1293:10:5::1;1270:20;;:33;;;;;;;;;;;;;;;;;;1198:110:::0;:::o;3372:90::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3454:3:5::1;;3438:13;:19;;;;;;;:::i;:::-;;3372:90:::0;;:::o;902:91::-;954:7;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;976:12:5::1;;969:19;;902:91:::0;:::o;2052:235:3:-;2124:7;2143:13;2159:7;:16;2167:7;2159:16;;;;;;;;;;;;;;;;;;;;;2143:32;;2210:1;2193:19;;:5;:19;;;;2185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2275:5;2268:12;;;2052:235;;;:::o;1464:87:5:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1538:8:5::1;1530:5;:16;;;;1464:87:::0;:::o;3466:130::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3576:15:5::1;;3552:21;:39;;;;;;;:::i;:::-;;3466:130:::0;;:::o;1312:148::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1394:1:5::1;1386:5;:9;1378:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1450:5;1433:14;:22;;;;1312:148:::0;:::o;1790:205:3:-;1862:7;1906:1;1889:19;;:5;:19;;;;1881:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1972:9;:16;1982:5;1972:16;;;;;;;;;;;;;;;;1965:23;;1790:205;;;:::o;1598:92:12:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1662:21:::1;1680:1;1662:9;:21::i;:::-;1598:92::o:0;353:34:5:-;;;;:::o;966:85:12:-;1012:7;1038:6;;;;;;;;;;;1031:13;;966:85;:::o;3275:93:5:-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3360:3:5::1;;3345:12;:18;;;;;;;:::i;:::-;;3275:93:::0;;:::o;2511:102:3:-;2567:13;2599:7;2592:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2511:102;:::o;4144:290::-;4258:12;:10;:12::i;:::-;4246:24;;:8;:24;;;;4238:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;4311:32;;;;;;;;;;;;;;;:42;4344:8;4311:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4408:8;4379:48;;4394:12;:10;:12::i;:::-;4379:48;;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;391:36:5:-;425:2;391:36;:::o;5365:320:3:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;3896:344:5:-;3969:13;3998:16;4006:7;3998;:16::i;:::-;3990:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;4046:29;4078:21;4046:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4144:1;4118:15;4112:29;:33;:123;;4222:13;4112:123;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4176:15;4193:18;:7;:16;:18::i;:::-;4159:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4112:123;4105:130;;;3896:344;;;:::o;282:30::-;;;;:::o;316:33::-;;;;:::o;1555:1105::-;1671:1;1654:14;:18;1646:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;1726:8;;;;;;;;;;;1718:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;425:2;467:4;512:19;;;;:::i;:::-;1775:13;:11;:13::i;:::-;:27;1767:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1866:14;;1848;:32;;1840:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1976:14;;1958;1926:17;:29;1944:10;1926:29;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:64;;1918:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;2041:20;;;;;;;;;;;2038:173;;;2070:12;2112:10;2095:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2085:39;;;;;;2070:54;;2140:45;2159:5;;2140:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2166:12;;2180:4;2140:18;:45::i;:::-;2132:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2038:173;;467:4;2225:17;;:29;2217:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2335:9;2317:14;2309:5;;:22;;;;:::i;:::-;:35;;2301:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2389:9;2384:271;2408:14;2404:1;:18;2384:271;;;467:4;2442:17;;:29;2438:211;;;2483:11;2527:1;2507:17;;425:2;2497:27;;;;:::i;:::-;:31;;;;:::i;:::-;2483:45;;2559:1;2538:17;;:22;;;;;;;:::i;:::-;;;;;;;;2603:1;2570:17;:29;2588:10;2570:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;2614:26;2624:10;2636:3;2614:9;:26::i;:::-;2438:211;;2424:3;;;;;:::i;:::-;;;;2384:271;;;;1555:1105;;;:::o;997:86::-;1189:12:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1071:7:5::1;1056:12;:22;;;;997:86:::0;:::o;246:32::-;;;;:::o;3600:89::-;3644:13;3672:12;3665:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3600:89;:::o;4500:162:3:-;4597:4;4620:18;:25;4639:5;4620:25;;;;;;;;;;;;;;;:35;4646:8;4620:35;;;;;;;;;;;;;;;;;;;;;;;;;4613:42;;4500:162;;;;:::o;1839:189:12:-;1189:12;:10;:12::i;:::-;1178:23;;:7;:5;:7::i;:::-;:23;;;1170:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1947:1:::1;1927:22;;:8;:22;;;;1919:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2002:19;2012:8;2002:9;:19::i;:::-;1839:189:::0;:::o;1431:300:3:-;1533:4;1583:25;1568:40;;;:11;:40;;;;:104;;;;1639:33;1624:48;;;:11;:48;;;;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;:::-;1568:156;1549:175;;1431:300;;;:::o;777:809:11:-;898:4;914:20;937:4;914:27;;957:9;952:515;976:5;:12;972:1;:16;952:515;;;1009:20;1032:5;1038:1;1032:8;;;;;;;;;;;;;;;;;;;;;;1009:31;;1075:12;1059;:28;1055:402;;1227:12;1241;1210:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1200:55;;;;;;1185:70;;1055:402;;;1414:12;1428;1397:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1387:55;;;;;;1372:70;;1055:402;952:515;990:3;;;;;:::i;:::-;;;;952:515;;;;1575:4;1559:12;:20;1552:27;;;777:809;;;;;:::o;7157:125:3:-;7222:4;7273:1;7245:30;;:7;:16;7253:7;7245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7238:37;;7157:125;;;:::o;587:96:1:-;640:7;666:10;659:17;;587:96;:::o;11008:171:3:-;11109:2;11082:15;:24;11098:7;11082:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11164:7;11160:2;11126:46;;11135:23;11150:7;11135:14;:23::i;:::-;11126:46;;;;;;;;;;;;11008:171;;:::o;8114:108::-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;:::-;8114:108;;:::o;7440:344::-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;7689:16;;:7;:16;;;:51;;;;7733:7;7709:31;;:20;7721:7;7709:11;:20::i;:::-;:31;;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7689:87;7681:96;;;7440:344;;;;:::o;10337:560::-;10491:4;10464:31;;:23;10479:7;10464:14;:23::i;:::-;:31;;;10456:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10573:1;10559:16;;:2;:16;;;;10551:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;10787:1;10768:9;:15;10778:4;10768:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10815:1;10798:9;:13;10808:2;10798:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10845:2;10826:7;:16;10834:7;10826:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10882:7;10878:2;10863:27;;10872:4;10863:27;;;;;;;;;;;;10337:560;;;:::o;2034:169:12:-;2089:16;2108:6;;;;;;;;;;;2089:25;;2133:8;2124:6;;:17;;;;;;;;;;;;;;;;;;2187:8;2156:40;;2177:8;2156:40;;;;;;;;;;;;2034:169;;:::o;6547:307:3:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6547:307;;;;:::o;275:703:13:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;8443:311:3:-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8443:311;;;:::o;2543:572:4:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;2758:1;2742:18;;:4;:18;;;2738:183;;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;2837:10;;:4;:10;;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;2833:88;2738:183;2948:1;2934:16;;:2;:16;;;2930:179;;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;3032:10;;:2;:10;;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;:::-;3028:81;2930:179;2543:572;;;:::o;11732:778:3:-;11882:4;11902:15;:2;:13;;;:15::i;:::-;11898:606;;;11953:2;11937:36;;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11933:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12193:1;12176:6;:13;:18;12172:266;;;12218:60;;;;;;;;;;:::i;:::-;;;;;;;;12172:266;12390:6;12384:13;12375:6;12371:2;12367:15;12360:38;11933:519;12069:41;;;12059:51;;;:6;:51;;;;12052:58;;;;;11898:606;12489:4;12482:11;;11732:778;;;;;;;:::o;9076:372::-;9169:1;9155:16;;:2;:16;;;;9147:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;9360:1;9343:9;:13;9353:2;9343:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9390:2;9371:7;:16;9379:7;9371:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9433:7;9429:2;9408:33;;9425:1;9408:33;;;;;;;;;;;;9076:372;;:::o;13066:122::-;;;;:::o;3821:161:4:-;3924:10;:17;;;;3897:15;:24;3913:7;3897:24;;;;;;;;;;;:44;;;;3951:10;3967:7;3951:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3821:161;:::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4861:51;;4922:18;4943:17;:26;4961:7;4943:26;;;;;;;;;;;;4922:47;;5087:14;5073:10;:28;5069:323;;5117:19;5139:12;:18;5152:4;5139:18;;;;;;;;;;;;;;;:34;5158:14;5139:34;;;;;;;;;;;;5117:56;;5221:11;5188:12;:18;5201:4;5188:18;;;;;;;;;;;;;;;:30;5207:10;5188:30;;;;;;;;;;;:44;;;;5337:10;5304:17;:30;5322:11;5304:30;;;;;;;;;;;:43;;;;5069:323;;5485:17;:26;5503:7;5485:26;;;;;;;;;;;5478:33;;;5528:12;:18;5541:4;5528:18;;;;;;;;;;;;;;;:34;5547:14;5528:34;;;;;;;;;;;5521:41;;;4599:970;;;;:::o;5857:1061::-;6106:22;6151:1;6131:10;:17;;;;:21;;;;:::i;:::-;6106:46;;6162:18;6183:15;:24;6199:7;6183:24;;;;;;;;;;;;6162:45;;6529:19;6551:10;6562:14;6551:26;;;;;;;;;;;;;;;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6723:10;6692:15;:28;6708:11;6692:28;;;;;;;;;;;:41;;;;6861:15;:24;6877:7;6861:24;;;;;;;;;;;6854:31;;;6895:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5857:1061;;;;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;3493:37;;3567:7;3540:12;:16;3553:2;3540:16;;;;;;;;;;;;;;;:24;3557:6;3540:24;;;;;;;;;;;:34;;;;3613:6;3584:17;:26;3602:7;3584:26;;;;;;;;;;;:35;;;;3409:217;;;:::o;718:377:0:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:14:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;517:367::-;;;650:3;643:4;635:6;631:17;627:27;617:2;;668:1;665;658:12;617:2;704:6;691:20;681:30;;734:18;726:6;723:30;720:2;;;766:1;763;756:12;720:2;803:4;795:6;791:17;779:29;;857:3;849:4;841:6;837:17;827:8;823:32;820:41;817:2;;;874:1;871;864:12;817:2;607:277;;;;;:::o;907:367::-;;;1040:3;1033:4;1025:6;1021:17;1017:27;1007:2;;1058:1;1055;1048:12;1007:2;1094:6;1081:20;1071:30;;1124:18;1116:6;1113:30;1110:2;;;1156:1;1153;1146:12;1110:2;1193:4;1185:6;1181:17;1169:29;;1247:3;1239:4;1231:6;1227:17;1217:8;1213:32;1210:41;1207:2;;;1264:1;1261;1254:12;1207:2;997:277;;;;;:::o;1280:133::-;;1361:6;1348:20;1339:29;;1377:30;1401:5;1377:30;:::i;:::-;1329:84;;;;:::o;1419:139::-;;1503:6;1490:20;1481:29;;1519:33;1546:5;1519:33;:::i;:::-;1471:87;;;;:::o;1564:137::-;;1647:6;1634:20;1625:29;;1663:32;1689:5;1663:32;:::i;:::-;1615:86;;;;:::o;1707:141::-;;1794:6;1788:13;1779:22;;1810:32;1836:5;1810:32;:::i;:::-;1769:79;;;;:::o;1867:271::-;;1971:3;1964:4;1956:6;1952:17;1948:27;1938:2;;1989:1;1986;1979:12;1938:2;2029:6;2016:20;2054:78;2128:3;2120:6;2113:4;2105:6;2101:17;2054:78;:::i;:::-;2045:87;;1928:210;;;;;:::o;2158:352::-;;;2276:3;2269:4;2261:6;2257:17;2253:27;2243:2;;2294:1;2291;2284:12;2243:2;2330:6;2317:20;2307:30;;2360:18;2352:6;2349:30;2346:2;;;2392:1;2389;2382:12;2346:2;2429:4;2421:6;2417:17;2405:29;;2483:3;2475:4;2467:6;2463:17;2453:8;2449:32;2446:41;2443:2;;;2500:1;2497;2490:12;2443:2;2233:277;;;;;:::o;2516:139::-;;2600:6;2587:20;2578:29;;2616:33;2643:5;2616:33;:::i;:::-;2568:87;;;;:::o;2661:262::-;;2769:2;2757:9;2748:7;2744:23;2740:32;2737:2;;;2785:1;2782;2775:12;2737:2;2828:1;2853:53;2898:7;2889:6;2878:9;2874:22;2853:53;:::i;:::-;2843:63;;2799:117;2727:196;;;;:::o;2929:407::-;;;3054:2;3042:9;3033:7;3029:23;3025:32;3022:2;;;3070:1;3067;3060:12;3022:2;3113:1;3138:53;3183:7;3174:6;3163:9;3159:22;3138:53;:::i;:::-;3128:63;;3084:117;3240:2;3266:53;3311:7;3302:6;3291:9;3287:22;3266:53;:::i;:::-;3256:63;;3211:118;3012:324;;;;;:::o;3342:552::-;;;;3484:2;3472:9;3463:7;3459:23;3455:32;3452:2;;;3500:1;3497;3490:12;3452:2;3543:1;3568:53;3613:7;3604:6;3593:9;3589:22;3568:53;:::i;:::-;3558:63;;3514:117;3670:2;3696:53;3741:7;3732:6;3721:9;3717:22;3696:53;:::i;:::-;3686:63;;3641:118;3798:2;3824:53;3869:7;3860:6;3849:9;3845:22;3824:53;:::i;:::-;3814:63;;3769:118;3442:452;;;;;:::o;3900:809::-;;;;;4068:3;4056:9;4047:7;4043:23;4039:33;4036:2;;;4085:1;4082;4075:12;4036:2;4128:1;4153:53;4198:7;4189:6;4178:9;4174:22;4153:53;:::i;:::-;4143:63;;4099:117;4255:2;4281:53;4326:7;4317:6;4306:9;4302:22;4281:53;:::i;:::-;4271:63;;4226:118;4383:2;4409:53;4454:7;4445:6;4434:9;4430:22;4409:53;:::i;:::-;4399:63;;4354:118;4539:2;4528:9;4524:18;4511:32;4570:18;4562:6;4559:30;4556:2;;;4602:1;4599;4592:12;4556:2;4630:62;4684:7;4675:6;4664:9;4660:22;4630:62;:::i;:::-;4620:72;;4482:220;4026:683;;;;;;;:::o;4715:401::-;;;4837:2;4825:9;4816:7;4812:23;4808:32;4805:2;;;4853:1;4850;4843:12;4805:2;4896:1;4921:53;4966:7;4957:6;4946:9;4942:22;4921:53;:::i;:::-;4911:63;;4867:117;5023:2;5049:50;5091:7;5082:6;5071:9;5067:22;5049:50;:::i;:::-;5039:60;;4994:115;4795:321;;;;;:::o;5122:407::-;;;5247:2;5235:9;5226:7;5222:23;5218:32;5215:2;;;5263:1;5260;5253:12;5215:2;5306:1;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5277:117;5433:2;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5404:118;5205:324;;;;;:::o;5535:425::-;;;5678:2;5666:9;5657:7;5653:23;5649:32;5646:2;;;5694:1;5691;5684:12;5646:2;5765:1;5754:9;5750:17;5737:31;5795:18;5787:6;5784:30;5781:2;;;5827:1;5824;5817:12;5781:2;5863:80;5935:7;5926:6;5915:9;5911:22;5863:80;:::i;:::-;5845:98;;;;5708:245;5636:324;;;;;:::o;5966:425::-;;;6109:2;6097:9;6088:7;6084:23;6080:32;6077:2;;;6125:1;6122;6115:12;6077:2;6196:1;6185:9;6181:17;6168:31;6226:18;6218:6;6215:30;6212:2;;;6258:1;6255;6248:12;6212:2;6294:80;6366:7;6357:6;6346:9;6342:22;6294:80;:::i;:::-;6276:98;;;;6139:245;6067:324;;;;;:::o;6397:256::-;;6502:2;6490:9;6481:7;6477:23;6473:32;6470:2;;;6518:1;6515;6508:12;6470:2;6561:1;6586:50;6628:7;6619:6;6608:9;6604:22;6586:50;:::i;:::-;6576:60;;6532:114;6460:193;;;;:::o;6659:262::-;;6767:2;6755:9;6746:7;6742:23;6738:32;6735:2;;;6783:1;6780;6773:12;6735:2;6826:1;6851:53;6896:7;6887:6;6876:9;6872:22;6851:53;:::i;:::-;6841:63;;6797:117;6725:196;;;;:::o;6927:260::-;;7034:2;7022:9;7013:7;7009:23;7005:32;7002:2;;;7050:1;7047;7040:12;7002:2;7093:1;7118:52;7162:7;7153:6;7142:9;7138:22;7118:52;:::i;:::-;7108:62;;7064:116;6992:195;;;;:::o;7193:282::-;;7311:2;7299:9;7290:7;7286:23;7282:32;7279:2;;;7327:1;7324;7317:12;7279:2;7370:1;7395:63;7450:7;7441:6;7430:9;7426:22;7395:63;:::i;:::-;7385:73;;7341:127;7269:206;;;;:::o;7481:395::-;;;7609:2;7597:9;7588:7;7584:23;7580:32;7577:2;;;7625:1;7622;7615:12;7577:2;7696:1;7685:9;7681:17;7668:31;7726:18;7718:6;7715:30;7712:2;;;7758:1;7755;7748:12;7712:2;7794:65;7851:7;7842:6;7831:9;7827:22;7794:65;:::i;:::-;7776:83;;;;7639:230;7567:309;;;;;:::o;7882:262::-;;7990:2;7978:9;7969:7;7965:23;7961:32;7958:2;;;8006:1;8003;7996:12;7958:2;8049:1;8074:53;8119:7;8110:6;8099:9;8095:22;8074:53;:::i;:::-;8064:63;;8020:117;7948:196;;;;:::o;8150:570::-;;;;8310:2;8298:9;8289:7;8285:23;8281:32;8278:2;;;8326:1;8323;8316:12;8278:2;8369:1;8394:53;8439:7;8430:6;8419:9;8415:22;8394:53;:::i;:::-;8384:63;;8340:117;8524:2;8513:9;8509:18;8496:32;8555:18;8547:6;8544:30;8541:2;;;8587:1;8584;8577:12;8541:2;8623:80;8695:7;8686:6;8675:9;8671:22;8623:80;:::i;:::-;8605:98;;;;8467:246;8268:452;;;;;:::o;8726:118::-;8813:24;8831:5;8813:24;:::i;:::-;8808:3;8801:37;8791:53;;:::o;8850:157::-;8955:45;8975:24;8993:5;8975:24;:::i;:::-;8955:45;:::i;:::-;8950:3;8943:58;8933:74;;:::o;9013:109::-;9094:21;9109:5;9094:21;:::i;:::-;9089:3;9082:34;9072:50;;:::o;9128:118::-;9215:24;9233:5;9215:24;:::i;:::-;9210:3;9203:37;9193:53;;:::o;9252:157::-;9357:45;9377:24;9395:5;9377:24;:::i;:::-;9357:45;:::i;:::-;9352:3;9345:58;9335:74;;:::o;9415:360::-;;9529:38;9561:5;9529:38;:::i;:::-;9583:70;9646:6;9641:3;9583:70;:::i;:::-;9576:77;;9662:52;9707:6;9702:3;9695:4;9688:5;9684:16;9662:52;:::i;:::-;9739:29;9761:6;9739:29;:::i;:::-;9734:3;9730:39;9723:46;;9505:270;;;;;:::o;9781:364::-;;9897:39;9930:5;9897:39;:::i;:::-;9952:71;10016:6;10011:3;9952:71;:::i;:::-;9945:78;;10032:52;10077:6;10072:3;10065:4;10058:5;10054:16;10032:52;:::i;:::-;10109:29;10131:6;10109:29;:::i;:::-;10104:3;10100:39;10093:46;;9873:272;;;;;:::o;10151:377::-;;10285:39;10318:5;10285:39;:::i;:::-;10340:89;10422:6;10417:3;10340:89;:::i;:::-;10333:96;;10438:52;10483:6;10478:3;10471:4;10464:5;10460:16;10438:52;:::i;:::-;10515:6;10510:3;10506:16;10499:23;;10261:267;;;;;:::o;10534:375::-;;10697:67;10761:2;10756:3;10697:67;:::i;:::-;10690:74;;10794:34;10790:1;10785:3;10781:11;10774:55;10860:13;10855:2;10850:3;10846:12;10839:35;10900:2;10895:3;10891:12;10884:19;;10680:229;;;:::o;10915:382::-;;11078:67;11142:2;11137:3;11078:67;:::i;:::-;11071:74;;11175:34;11171:1;11166:3;11162:11;11155:55;11241:20;11236:2;11231:3;11227:12;11220:42;11288:2;11283:3;11279:12;11272:19;;11061:236;;;:::o;11303:367::-;;11466:67;11530:2;11525:3;11466:67;:::i;:::-;11459:74;;11563:34;11559:1;11554:3;11550:11;11543:55;11629:5;11624:2;11619:3;11615:12;11608:27;11661:2;11656:3;11652:12;11645:19;;11449:221;;;:::o;11676:370::-;;11839:67;11903:2;11898:3;11839:67;:::i;:::-;11832:74;;11936:34;11932:1;11927:3;11923:11;11916:55;12002:8;11997:2;11992:3;11988:12;11981:30;12037:2;12032:3;12028:12;12021:19;;11822:224;;;:::o;12052:326::-;;12215:67;12279:2;12274:3;12215:67;:::i;:::-;12208:74;;12312:30;12308:1;12303:3;12299:11;12292:51;12369:2;12364:3;12360:12;12353:19;;12198:180;;;:::o;12384:325::-;;12547:67;12611:2;12606:3;12547:67;:::i;:::-;12540:74;;12644:29;12640:1;12635:3;12631:11;12624:50;12700:2;12695:3;12691:12;12684:19;;12530:179;;;:::o;12715:368::-;;12878:67;12942:2;12937:3;12878:67;:::i;:::-;12871:74;;12975:34;12971:1;12966:3;12962:11;12955:55;13041:6;13036:2;13031:3;13027:12;13020:28;13074:2;13069:3;13065:12;13058:19;;12861:222;;;:::o;13089:323::-;;13252:67;13316:2;13311:3;13252:67;:::i;:::-;13245:74;;13349:27;13345:1;13340:3;13336:11;13329:48;13403:2;13398:3;13394:12;13387:19;;13235:177;;;:::o;13418:318::-;;13581:67;13645:2;13640:3;13581:67;:::i;:::-;13574:74;;13678:22;13674:1;13669:3;13665:11;13658:43;13727:2;13722:3;13718:12;13711:19;;13564:172;;;:::o;13742:326::-;;13905:67;13969:2;13964:3;13905:67;:::i;:::-;13898:74;;14002:30;13998:1;13993:3;13989:11;13982:51;14059:2;14054:3;14050:12;14043:19;;13888:180;;;:::o;14074:376::-;;14237:67;14301:2;14296:3;14237:67;:::i;:::-;14230:74;;14334:34;14330:1;14325:3;14321:11;14314:55;14400:14;14395:2;14390:3;14386:12;14379:36;14441:2;14436:3;14432:12;14425:19;;14220:230;;;:::o;14456:325::-;;14619:67;14683:2;14678:3;14619:67;:::i;:::-;14612:74;;14716:29;14712:1;14707:3;14703:11;14696:50;14772:2;14767:3;14763:12;14756:19;;14602:179;;;:::o;14787:388::-;;14950:67;15014:2;15009:3;14950:67;:::i;:::-;14943:74;;15047:34;15043:1;15038:3;15034:11;15027:55;15113:26;15108:2;15103:3;15099:12;15092:48;15166:2;15161:3;15157:12;15150:19;;14933:242;;;:::o;15181:374::-;;15344:67;15408:2;15403:3;15344:67;:::i;:::-;15337:74;;15441:34;15437:1;15432:3;15428:11;15421:55;15507:12;15502:2;15497:3;15493:12;15486:34;15546:2;15541:3;15537:12;15530:19;;15327:228;;;:::o;15561:373::-;;15724:67;15788:2;15783:3;15724:67;:::i;:::-;15717:74;;15821:34;15817:1;15812:3;15808:11;15801:55;15887:11;15882:2;15877:3;15873:12;15866:33;15925:2;15920:3;15916:12;15909:19;;15707:227;;;:::o;15940:330::-;;16103:67;16167:2;16162:3;16103:67;:::i;:::-;16096:74;;16200:34;16196:1;16191:3;16187:11;16180:55;16261:2;16256:3;16252:12;16245:19;;16086:184;;;:::o;16276:320::-;;16439:67;16503:2;16498:3;16439:67;:::i;:::-;16432:74;;16536:24;16532:1;16527:3;16523:11;16516:45;16587:2;16582:3;16578:12;16571:19;;16422:174;;;:::o;16602:376::-;;16765:67;16829:2;16824:3;16765:67;:::i;:::-;16758:74;;16862:34;16858:1;16853:3;16849:11;16842:55;16928:14;16923:2;16918:3;16914:12;16907:36;16969:2;16964:3;16960:12;16953:19;;16748:230;;;:::o;16984:330::-;;17147:67;17211:2;17206:3;17147:67;:::i;:::-;17140:74;;17244:34;17240:1;17235:3;17231:11;17224:55;17305:2;17300:3;17296:12;17289:19;;17130:184;;;:::o;17320:368::-;;17483:67;17547:2;17542:3;17483:67;:::i;:::-;17476:74;;17580:34;17576:1;17571:3;17567:11;17560:55;17646:6;17641:2;17636:3;17632:12;17625:28;17679:2;17674:3;17670:12;17663:19;;17466:222;;;:::o;17694:373::-;;17857:67;17921:2;17916:3;17857:67;:::i;:::-;17850:74;;17954:34;17950:1;17945:3;17941:11;17934:55;18020:11;18015:2;18010:3;18006:12;17999:33;18058:2;18053:3;18049:12;18042:19;;17840:227;;;:::o;18073:328::-;;18236:67;18300:2;18295:3;18236:67;:::i;:::-;18229:74;;18333:32;18329:1;18324:3;18320:11;18313:53;18392:2;18387:3;18383:12;18376:19;;18219:182;;;:::o;18407:365::-;;18570:67;18634:2;18629:3;18570:67;:::i;:::-;18563:74;;18667:34;18663:1;18658:3;18654:11;18647:55;18733:3;18728:2;18723:3;18719:12;18712:25;18763:2;18758:3;18754:12;18747:19;;18553:219;;;:::o;18778:368::-;;18941:67;19005:2;19000:3;18941:67;:::i;:::-;18934:74;;19038:34;19034:1;19029:3;19025:11;19018:55;19104:6;19099:2;19094:3;19090:12;19083:28;19137:2;19132:3;19128:12;19121:19;;18924:222;;;:::o;19152:381::-;;19315:67;19379:2;19374:3;19315:67;:::i;:::-;19308:74;;19412:34;19408:1;19403:3;19399:11;19392:55;19478:19;19473:2;19468:3;19464:12;19457:41;19524:2;19519:3;19515:12;19508:19;;19298:235;;;:::o;19539:376::-;;19702:67;19766:2;19761:3;19702:67;:::i;:::-;19695:74;;19799:34;19795:1;19790:3;19786:11;19779:55;19865:14;19860:2;19855:3;19851:12;19844:36;19906:2;19901:3;19897:12;19890:19;;19685:230;;;:::o;19921:312::-;;20084:67;20148:2;20143:3;20084:67;:::i;:::-;20077:74;;20181:16;20177:1;20172:3;20168:11;20161:37;20224:2;20219:3;20215:12;20208:19;;20067:166;;;:::o;20239:325::-;;20402:67;20466:2;20461:3;20402:67;:::i;:::-;20395:74;;20499:29;20495:1;20490:3;20486:11;20479:50;20555:2;20550:3;20546:12;20539:19;;20385:179;;;:::o;20570:118::-;20657:24;20675:5;20657:24;:::i;:::-;20652:3;20645:37;20635:53;;:::o;20694:256::-;;20821:75;20892:3;20883:6;20821:75;:::i;:::-;20921:2;20916:3;20912:12;20905:19;;20941:3;20934:10;;20810:140;;;;:::o;20956:397::-;;21111:75;21182:3;21173:6;21111:75;:::i;:::-;21211:2;21206:3;21202:12;21195:19;;21224:75;21295:3;21286:6;21224:75;:::i;:::-;21324:2;21319:3;21315:12;21308:19;;21344:3;21337:10;;21100:253;;;;;:::o;21359:435::-;;21561:95;21652:3;21643:6;21561:95;:::i;:::-;21554:102;;21673:95;21764:3;21755:6;21673:95;:::i;:::-;21666:102;;21785:3;21778:10;;21543:251;;;;;:::o;21800:222::-;;21931:2;21920:9;21916:18;21908:26;;21944:71;22012:1;22001:9;21997:17;21988:6;21944:71;:::i;:::-;21898:124;;;;:::o;22028:640::-;;22261:3;22250:9;22246:19;22238:27;;22275:71;22343:1;22332:9;22328:17;22319:6;22275:71;:::i;:::-;22356:72;22424:2;22413:9;22409:18;22400:6;22356:72;:::i;:::-;22438;22506:2;22495:9;22491:18;22482:6;22438:72;:::i;:::-;22557:9;22551:4;22547:20;22542:2;22531:9;22527:18;22520:48;22585:76;22656:4;22647:6;22585:76;:::i;:::-;22577:84;;22228:440;;;;;;;:::o;22674:210::-;;22799:2;22788:9;22784:18;22776:26;;22812:65;22874:1;22863:9;22859:17;22850:6;22812:65;:::i;:::-;22766:118;;;;:::o;22890:222::-;;23021:2;23010:9;23006:18;22998:26;;23034:71;23102:1;23091:9;23087:17;23078:6;23034:71;:::i;:::-;22988:124;;;;:::o;23118:313::-;;23269:2;23258:9;23254:18;23246:26;;23318:9;23312:4;23308:20;23304:1;23293:9;23289:17;23282:47;23346:78;23419:4;23410:6;23346:78;:::i;:::-;23338:86;;23236:195;;;;:::o;23437:419::-;;23641:2;23630:9;23626:18;23618:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23718:131;23844:4;23718:131;:::i;:::-;23710:139;;23608:248;;;:::o;23862:419::-;;24066:2;24055:9;24051:18;24043:26;;24115:9;24109:4;24105:20;24101:1;24090:9;24086:17;24079:47;24143:131;24269:4;24143:131;:::i;:::-;24135:139;;24033:248;;;:::o;24287:419::-;;24491:2;24480:9;24476:18;24468:26;;24540:9;24534:4;24530:20;24526:1;24515:9;24511:17;24504:47;24568:131;24694:4;24568:131;:::i;:::-;24560:139;;24458:248;;;:::o;24712:419::-;;24916:2;24905:9;24901:18;24893:26;;24965:9;24959:4;24955:20;24951:1;24940:9;24936:17;24929:47;24993:131;25119:4;24993:131;:::i;:::-;24985:139;;24883:248;;;:::o;25137:419::-;;25341:2;25330:9;25326:18;25318:26;;25390:9;25384:4;25380:20;25376:1;25365:9;25361:17;25354:47;25418:131;25544:4;25418:131;:::i;:::-;25410:139;;25308:248;;;:::o;25562:419::-;;25766:2;25755:9;25751:18;25743:26;;25815:9;25809:4;25805:20;25801:1;25790:9;25786:17;25779:47;25843:131;25969:4;25843:131;:::i;:::-;25835:139;;25733:248;;;:::o;25987:419::-;;26191:2;26180:9;26176:18;26168:26;;26240:9;26234:4;26230:20;26226:1;26215:9;26211:17;26204:47;26268:131;26394:4;26268:131;:::i;:::-;26260:139;;26158:248;;;:::o;26412:419::-;;26616:2;26605:9;26601:18;26593:26;;26665:9;26659:4;26655:20;26651:1;26640:9;26636:17;26629:47;26693:131;26819:4;26693:131;:::i;:::-;26685:139;;26583:248;;;:::o;26837:419::-;;27041:2;27030:9;27026:18;27018:26;;27090:9;27084:4;27080:20;27076:1;27065:9;27061:17;27054:47;27118:131;27244:4;27118:131;:::i;:::-;27110:139;;27008:248;;;:::o;27262:419::-;;27466:2;27455:9;27451:18;27443:26;;27515:9;27509:4;27505:20;27501:1;27490:9;27486:17;27479:47;27543:131;27669:4;27543:131;:::i;:::-;27535:139;;27433:248;;;:::o;27687:419::-;;27891:2;27880:9;27876:18;27868:26;;27940:9;27934:4;27930:20;27926:1;27915:9;27911:17;27904:47;27968:131;28094:4;27968:131;:::i;:::-;27960:139;;27858:248;;;:::o;28112:419::-;;28316:2;28305:9;28301:18;28293:26;;28365:9;28359:4;28355:20;28351:1;28340:9;28336:17;28329:47;28393:131;28519:4;28393:131;:::i;:::-;28385:139;;28283:248;;;:::o;28537:419::-;;28741:2;28730:9;28726:18;28718:26;;28790:9;28784:4;28780:20;28776:1;28765:9;28761:17;28754:47;28818:131;28944:4;28818:131;:::i;:::-;28810:139;;28708:248;;;:::o;28962:419::-;;29166:2;29155:9;29151:18;29143:26;;29215:9;29209:4;29205:20;29201:1;29190:9;29186:17;29179:47;29243:131;29369:4;29243:131;:::i;:::-;29235:139;;29133:248;;;:::o;29387:419::-;;29591:2;29580:9;29576:18;29568:26;;29640:9;29634:4;29630:20;29626:1;29615:9;29611:17;29604:47;29668:131;29794:4;29668:131;:::i;:::-;29660:139;;29558:248;;;:::o;29812:419::-;;30016:2;30005:9;30001:18;29993:26;;30065:9;30059:4;30055:20;30051:1;30040:9;30036:17;30029:47;30093:131;30219:4;30093:131;:::i;:::-;30085:139;;29983:248;;;:::o;30237:419::-;;30441:2;30430:9;30426:18;30418:26;;30490:9;30484:4;30480:20;30476:1;30465:9;30461:17;30454:47;30518:131;30644:4;30518:131;:::i;:::-;30510:139;;30408:248;;;:::o;30662:419::-;;30866:2;30855:9;30851:18;30843:26;;30915:9;30909:4;30905:20;30901:1;30890:9;30886:17;30879:47;30943:131;31069:4;30943:131;:::i;:::-;30935:139;;30833:248;;;:::o;31087:419::-;;31291:2;31280:9;31276:18;31268:26;;31340:9;31334:4;31330:20;31326:1;31315:9;31311:17;31304:47;31368:131;31494:4;31368:131;:::i;:::-;31360:139;;31258:248;;;:::o;31512:419::-;;31716:2;31705:9;31701:18;31693:26;;31765:9;31759:4;31755:20;31751:1;31740:9;31736:17;31729:47;31793:131;31919:4;31793:131;:::i;:::-;31785:139;;31683:248;;;:::o;31937:419::-;;32141:2;32130:9;32126:18;32118:26;;32190:9;32184:4;32180:20;32176:1;32165:9;32161:17;32154:47;32218:131;32344:4;32218:131;:::i;:::-;32210:139;;32108:248;;;:::o;32362:419::-;;32566:2;32555:9;32551:18;32543:26;;32615:9;32609:4;32605:20;32601:1;32590:9;32586:17;32579:47;32643:131;32769:4;32643:131;:::i;:::-;32635:139;;32533:248;;;:::o;32787:419::-;;32991:2;32980:9;32976:18;32968:26;;33040:9;33034:4;33030:20;33026:1;33015:9;33011:17;33004:47;33068:131;33194:4;33068:131;:::i;:::-;33060:139;;32958:248;;;:::o;33212:419::-;;33416:2;33405:9;33401:18;33393:26;;33465:9;33459:4;33455:20;33451:1;33440:9;33436:17;33429:47;33493:131;33619:4;33493:131;:::i;:::-;33485:139;;33383:248;;;:::o;33637:419::-;;33841:2;33830:9;33826:18;33818:26;;33890:9;33884:4;33880:20;33876:1;33865:9;33861:17;33854:47;33918:131;34044:4;33918:131;:::i;:::-;33910:139;;33808:248;;;:::o;34062:419::-;;34266:2;34255:9;34251:18;34243:26;;34315:9;34309:4;34305:20;34301:1;34290:9;34286:17;34279:47;34343:131;34469:4;34343:131;:::i;:::-;34335:139;;34233:248;;;:::o;34487:419::-;;34691:2;34680:9;34676:18;34668:26;;34740:9;34734:4;34730:20;34726:1;34715:9;34711:17;34704:47;34768:131;34894:4;34768:131;:::i;:::-;34760:139;;34658:248;;;:::o;34912:419::-;;35116:2;35105:9;35101:18;35093:26;;35165:9;35159:4;35155:20;35151:1;35140:9;35136:17;35129:47;35193:131;35319:4;35193:131;:::i;:::-;35185:139;;35083:248;;;:::o;35337:222::-;;35468:2;35457:9;35453:18;35445:26;;35481:71;35549:1;35538:9;35534:17;35525:6;35481:71;:::i;:::-;35435:124;;;;:::o;35565:283::-;;35631:2;35625:9;35615:19;;35673:4;35665:6;35661:17;35780:6;35768:10;35765:22;35744:18;35732:10;35729:34;35726:62;35723:2;;;35791:18;;:::i;:::-;35723:2;35831:10;35827:2;35820:22;35605:243;;;;:::o;35854:331::-;;36005:18;35997:6;35994:30;35991:2;;;36027:18;;:::i;:::-;35991:2;36112:4;36108:9;36101:4;36093:6;36089:17;36085:33;36077:41;;36173:4;36167;36163:15;36155:23;;35920:265;;;:::o;36191:98::-;;36276:5;36270:12;36260:22;;36249:40;;;:::o;36295:99::-;;36381:5;36375:12;36365:22;;36354:40;;;:::o;36400:168::-;;36517:6;36512:3;36505:19;36557:4;36552:3;36548:14;36533:29;;36495:73;;;;:::o;36574:169::-;;36692:6;36687:3;36680:19;36732:4;36727:3;36723:14;36708:29;;36670:73;;;;:::o;36749:148::-;;36888:3;36873:18;;36863:34;;;;:::o;36903:305::-;;36962:20;36980:1;36962:20;:::i;:::-;36957:25;;36996:20;37014:1;36996:20;:::i;:::-;36991:25;;37150:1;37082:66;37078:74;37075:1;37072:81;37069:2;;;37156:18;;:::i;:::-;37069:2;37200:1;37197;37193:9;37186:16;;36947:261;;;;:::o;37214:185::-;;37271:20;37289:1;37271:20;:::i;:::-;37266:25;;37305:20;37323:1;37305:20;:::i;:::-;37300:25;;37344:1;37334:2;;37349:18;;:::i;:::-;37334:2;37391:1;37388;37384:9;37379:14;;37256:143;;;;:::o;37405:348::-;;37468:20;37486:1;37468:20;:::i;:::-;37463:25;;37502:20;37520:1;37502:20;:::i;:::-;37497:25;;37690:1;37622:66;37618:74;37615:1;37612:81;37607:1;37600:9;37593:17;37589:105;37586:2;;;37697:18;;:::i;:::-;37586:2;37745:1;37742;37738:9;37727:20;;37453:300;;;;:::o;37759:191::-;;37819:20;37837:1;37819:20;:::i;:::-;37814:25;;37853:20;37871:1;37853:20;:::i;:::-;37848:25;;37892:1;37889;37886:8;37883:2;;;37897:18;;:::i;:::-;37883:2;37942:1;37939;37935:9;37927:17;;37804:146;;;;:::o;37956:96::-;;38022:24;38040:5;38022:24;:::i;:::-;38011:35;;38001:51;;;:::o;38058:90::-;;38135:5;38128:13;38121:21;38110:32;;38100:48;;;:::o;38154:77::-;;38220:5;38209:16;;38199:32;;;:::o;38237:149::-;;38313:66;38306:5;38302:78;38291:89;;38281:105;;;:::o;38392:126::-;;38469:42;38462:5;38458:54;38447:65;;38437:81;;;:::o;38524:77::-;;38590:5;38579:16;;38569:32;;;:::o;38607:154::-;38691:6;38686:3;38681;38668:30;38753:1;38744:6;38739:3;38735:16;38728:27;38658:103;;;:::o;38767:307::-;38835:1;38845:113;38859:6;38856:1;38853:13;38845:113;;;38944:1;38939:3;38935:11;38929:18;38925:1;38920:3;38916:11;38909:39;38881:2;38878:1;38874:10;38869:15;;38845:113;;;38976:6;38973:1;38970:13;38967:2;;;39056:1;39047:6;39042:3;39038:16;39031:27;38967:2;38816:258;;;;:::o;39080:320::-;;39161:1;39155:4;39151:12;39141:22;;39208:1;39202:4;39198:12;39229:18;39219:2;;39285:4;39277:6;39273:17;39263:27;;39219:2;39347;39339:6;39336:14;39316:18;39313:38;39310:2;;;39366:18;;:::i;:::-;39310:2;39131:269;;;;:::o;39406:233::-;;39468:24;39486:5;39468:24;:::i;:::-;39459:33;;39514:66;39507:5;39504:77;39501:2;;;39584:18;;:::i;:::-;39501:2;39631:1;39624:5;39620:13;39613:20;;39449:190;;;:::o;39645:100::-;;39713:26;39733:5;39713:26;:::i;:::-;39702:37;;39692:53;;;:::o;39751:79::-;;39819:5;39808:16;;39798:32;;;:::o;39836:94::-;;39904:20;39918:5;39904:20;:::i;:::-;39893:31;;39883:47;;;:::o;39936:176::-;;39985:20;40003:1;39985:20;:::i;:::-;39980:25;;40019:20;40037:1;40019:20;:::i;:::-;40014:25;;40058:1;40048:2;;40063:18;;:::i;:::-;40048:2;40104:1;40101;40097:9;40092:14;;39970:142;;;;:::o;40118:180::-;40166:77;40163:1;40156:88;40263:4;40260:1;40253:15;40287:4;40284:1;40277:15;40304:180;40352:77;40349:1;40342:88;40449:4;40446:1;40439:15;40473:4;40470:1;40463:15;40490:180;40538:77;40535:1;40528:88;40635:4;40632:1;40625:15;40659:4;40656:1;40649:15;40676:180;40724:77;40721:1;40714:88;40821:4;40818:1;40811:15;40845:4;40842:1;40835:15;40862:102;;40954:2;40950:7;40945:2;40938:5;40934:14;40930:28;40920:38;;40910:54;;;:::o;40970:94::-;;41051:5;41047:2;41043:14;41022:35;;41012:52;;;:::o;41070:122::-;41143:24;41161:5;41143:24;:::i;:::-;41136:5;41133:35;41123:2;;41182:1;41179;41172:12;41123:2;41113:79;:::o;41198:116::-;41268:21;41283:5;41268:21;:::i;:::-;41261:5;41258:32;41248:2;;41304:1;41301;41294:12;41248:2;41238:76;:::o;41320:122::-;41393:24;41411:5;41393:24;:::i;:::-;41386:5;41383:35;41373:2;;41432:1;41429;41422:12;41373:2;41363:79;:::o;41448:120::-;41520:23;41537:5;41520:23;:::i;:::-;41513:5;41510:34;41500:2;;41558:1;41555;41548:12;41500:2;41490:78;:::o;41574:122::-;41647:24;41665:5;41647:24;:::i;:::-;41640:5;41637:35;41627:2;;41686:1;41683;41676:12;41627:2;41617:79;:::o
Swarm Source
ipfs://55dd91d708d35d99d982de12031068b68480b0edde2cac9cf2b79606f465eec5
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.