Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
647 GG
Holders
247
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 GGLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GORILLA_GARDEN
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-10 */ // SPDX-License-Identifier: MIT /* ###### ####### ######## #### ## ## ### ###### ### ######## ######## ######## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #### ## ## #### ## ## ######## ## ## ## ## ## ## #### ## ## ######## ## ## ###### ## ## ## ## ## ## ## ## ## ## ## ## ######### ## ## ######### ## ## ## ## ## ## #### ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ###### ####### ## ## #### ######## ######## ## ## ###### ## ## ## ## ######## ######## ## ## */ pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function toString(uint256 value) internal pure returns (string memory) { 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); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { function isContract(address account) internal view returns (bool) { return account.code.length > 0; } 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"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; function safeTransferFrom( address from, address to, uint256 tokenId ) external; function transferFrom( address from, address to, uint256 tokenId ) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override virtual { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity >=0.8.9 <0.9.0; contract GORILLA_GARDEN is ERC721A, Ownable, ReentrancyGuard, OperatorFilterer { using Strings for uint256; string public uriPrefix; string public notRevealedURI; string public uriSuffix = ".json"; uint256 public cost = 0.0039 ether; uint256 public maxSupply = 5555; uint256 public MaxperTx = 10; uint256 public nftPerAddressLimit = 10; uint256 public maxFree = 1; bool public paused = true; bool public revealed = false; mapping(address => uint256) public freeClaimed; mapping(address => uint256) public addressMintedBalance; constructor() ERC721A ( "Gorilla Garden", "GG" ) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) { setNotRevealedURI( "ipfs://QmZ2xRZBAPDRZqFEFE5YZdcovh9uGPrsXEZRZspTfYfbJG/hidden.json" ); } // ~~~~~~~~~~~~~~~~~~~~ URI's ~~~~~~~~~~~~~~~~~~~~ function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } // ~~~~~~~~~~~~~~~~~~~~ Modifiers ~~~~~~~~~~~~~~~~~~~~ modifier mintCompliance(uint256 _mintAmount) { require(!paused, "The contract is paused!"); require(_mintAmount > 0, "Mint amount can't be zero."); require(_mintAmount <= MaxperTx, "Max mint per transaction exceeded!"); require(addressMintedBalance[msg.sender] + _mintAmount <= nftPerAddressLimit, "Max mint amount per address exceeded!"); require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); _; } // ~~~~~~~~~~~~~~~~~~~~ Mint Functions ~~~~~~~~~~~~~~~~~~~~ // PUBLIC MINT function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(msg.value >= cost * _mintAmount, "Insufficient funds!"); addressMintedBalance[msg.sender] += _mintAmount; _safeMint(_msgSender(), _mintAmount); } // FREE MINT function mintfree() public { require(!paused, "The contract is paused!"); require(totalSupply() + 1 <= maxSupply, "Mint amount exceeds max supply!"); require(freeClaimed[msg.sender] + 1 <= maxFree, "Max free mint per address exceeded!"); freeClaimed[msg.sender] += 1; _safeMint(_msgSender(), 1); } // MINT for address function mintToAddress(uint256 _mintAmount, address _receiver) public onlyOwner { require(totalSupply() + _mintAmount <= maxSupply, "Mint amount exceeds max supply!"); _safeMint(_receiver, _mintAmount); } // MASS AIRDROP function massAirdrop(address[] calldata _wallets) external onlyOwner { for (uint256 i; i < _wallets.length; ++i) { require(totalSupply() + 1 <= maxSupply, "Max supply exceeded!"); _safeMint(_wallets[i], 1); } } // ~~~~~~~~~~~~~~~~~~~~ Checks ~~~~~~~~~~~~~~~~~~~~ // Check Wallet assets function tokensOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = _startTokenId(); uint256 ownedTokenIndex = 0; address latestOwnerAddress; while (ownedTokenIndex < ownerTokenCount && currentTokenId < _currentIndex) { TokenOwnership memory ownership = _ownerships[currentTokenId]; if (!ownership.burned) { if (ownership.addr != address(0)) { latestOwnerAddress = ownership.addr; } if (latestOwnerAddress == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } } currentTokenId++; } return ownedTokenIds; } // Start Token function _startTokenId() internal view virtual override returns (uint256) { return 1; } // TOKEN URI function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token."); if (revealed == false) { return notRevealedURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } // ~~~~~~~~~~~~~~~~~~~~ onlyOwner Functions ~~~~~~~~~~~~~~~~~~~~ // Set Cost function setCost(uint256 _cost) public onlyOwner { cost = _cost; } // Set Max Per Transaction function setMaxperTx(uint256 _maxMintperTx) public onlyOwner { MaxperTx = _maxMintperTx; } // Set Max Free Mint Per Wallet function setMaxFree(uint256 _maxFree) public onlyOwner { maxFree = _maxFree; } // Set Max Per Address Limit function setNftPerAddressLimit(uint256 _maxPerAddress) public onlyOwner { nftPerAddressLimit = _maxPerAddress; } // BaseURI function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } // NotRevealedURI function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedURI = _notRevealedURI; } function pause() public onlyOwner { if (paused == true) { paused = false; } else { paused = true; } } function reveal() public onlyOwner { if (revealed == true) { revealed = false; } else { revealed = true; } } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function withdraw() external onlyOwner nonReentrant { (bool success, ) = payable(owner()).call{value: address(this).balance}(""); require(success); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_wallets","type":"address[]"}],"name":"massAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintfree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFree","type":"uint256"}],"name":"setMaxFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintperTx","type":"uint256"}],"name":"setMaxperTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerAddress","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c9080519060200190620000519291906200057e565b50660ddb07829fc000600d556115b3600e55600a600f55600a60105560016011556001601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff021916908315150217905550348015620000b557600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020017f476f72696c6c612047617264656e0000000000000000000000000000000000008152506040518060400160405280600281526020017f47470000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001519291906200057e565b5080600390805190602001906200016a9291906200057e565b506200017b620003d260201b60201c565b6000819055505050620001a362000197620003db60201b60201c565b620003e360201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003a057801562000266576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022c92919062000673565b600060405180830381600087803b1580156200024757600080fd5b505af11580156200025c573d6000803e3d6000fd5b505050506200039f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000320576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002e692919062000673565b600060405180830381600087803b1580156200030157600080fd5b505af115801562000316573d6000803e3d6000fd5b505050506200039e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003699190620006a0565b600060405180830381600087803b1580156200038457600080fd5b505af115801562000399573d6000803e3d6000fd5b505050505b5b5b5050620003cc6040518060800160405280604181526020016200542060419139620004a960201b60201c565b620007a4565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004b9620003db60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004df6200055460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000538576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052f906200071e565b60405180910390fd5b80600b9080519060200190620005509291906200057e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200058c906200076f565b90600052602060002090601f016020900481019282620005b05760008555620005fc565b82601f10620005cb57805160ff1916838001178555620005fc565b82800160010185558215620005fc579182015b82811115620005fb578251825591602001919060010190620005de565b5b5090506200060b91906200060f565b5090565b5b808211156200062a57600081600090555060010162000610565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200065b826200062e565b9050919050565b6200066d816200064e565b82525050565b60006040820190506200068a600083018562000662565b62000699602083018462000662565b9392505050565b6000602082019050620006b7600083018462000662565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000706602083620006bd565b91506200071382620006ce565b602082019050919050565b600060208201905081810360008301526200073981620006f7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200078857607f821691505b6020821081036200079e576200079d62000740565b5b50919050565b614c6c80620007b46000396000f3fe6080604052600436106102675760003560e01c80636352211e11610144578063a475b5dd116100b6578063d5abeb011161007a578063d5abeb01146108d5578063d755bf9914610900578063e985e9c514610929578063f2c4ce1e14610966578063f2fde38b1461098f578063ff645691146109b857610267565b8063a475b5dd14610804578063b88d4fde1461081b578063ba7d2c7614610844578063c87b56dd1461086f578063d0eb26b0146108ac57610267565b80638456cb59116101085780638456cb59146107155780638462151c1461072c5780638da5cb5b1461076957806395d89b4114610794578063a0712d68146107bf578063a22cb465146107db57610267565b80636352211e1461063057806370a082311461066d578063715018a6146106aa57806372250380146106c15780637ec4a659146106ec57610267565b806341f43434116101dd57806351830227116101a1578063518302271461051e5780635503a0e8146105495780635c975abb146105745780635ef9ff371461059f57806361c0b6a0146105c857806362b99ad41461060557610267565b806341f434341461044d57806342842e0e1461047857806344a0d68a146104a1578063485a68a3146104ca578063512b658d146104f557610267565b806318160ddd1161022f57806318160ddd1461036557806318cae2691461039057806319cae2cb146103cd5780631c0bb4a3146103e457806323b872dd1461040d5780633ccfd60b1461043657610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806313faede61461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138d0565b6109e3565b6040516102a09190613918565b60405180910390f35b3480156102b557600080fd5b506102be610ac5565b6040516102cb91906139cc565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a24565b610b57565b6040516103089190613a92565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613ad9565b610bd3565b005b34801561034657600080fd5b5061034f610cd7565b60405161035c9190613b28565b60405180910390f35b34801561037157600080fd5b5061037a610cdd565b6040516103879190613b28565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613b43565b610cf4565b6040516103c49190613b28565b60405180910390f35b3480156103d957600080fd5b506103e2610d0c565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613bd5565b610eaf565b005b34801561041957600080fd5b50610434600480360381019061042f9190613c22565b610fd9565b005b34801561044257600080fd5b5061044b611028565b005b34801561045957600080fd5b50610462611179565b60405161046f9190613cd4565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613c22565b61118b565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613a24565b6111da565b005b3480156104d657600080fd5b506104df611260565b6040516104ec9190613b28565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613cef565b611266565b005b34801561052a57600080fd5b50610533611347565b6040516105409190613918565b60405180910390f35b34801561055557600080fd5b5061055e61135a565b60405161056b91906139cc565b60405180910390f35b34801561058057600080fd5b506105896113e8565b6040516105969190613918565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613a24565b6113fb565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613b43565b611481565b6040516105fc9190613b28565b60405180910390f35b34801561061157600080fd5b5061061a611499565b60405161062791906139cc565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613a24565b611527565b6040516106649190613a92565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613b43565b61153d565b6040516106a19190613b28565b60405180910390f35b3480156106b657600080fd5b506106bf61160c565b005b3480156106cd57600080fd5b506106d6611694565b6040516106e391906139cc565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613e5f565b611722565b005b34801561072157600080fd5b5061072a6117b8565b005b34801561073857600080fd5b50610753600480360381019061074e9190613b43565b61188d565b6040516107609190613f66565b60405180910390f35b34801561077557600080fd5b5061077e611aa0565b60405161078b9190613a92565b60405180910390f35b3480156107a057600080fd5b506107a9611aca565b6040516107b691906139cc565b60405180910390f35b6107d960048036038101906107d49190613a24565b611b5c565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613fb4565b611dd6565b005b34801561081057600080fd5b50610819611f4d565b005b34801561082757600080fd5b50610842600480360381019061083d9190614095565b612022565b005b34801561085057600080fd5b50610859612073565b6040516108669190613b28565b60405180910390f35b34801561087b57600080fd5b5061089660048036038101906108919190613a24565b612079565b6040516108a391906139cc565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce9190613a24565b6121d1565b005b3480156108e157600080fd5b506108ea612257565b6040516108f79190613b28565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613a24565b61225d565b005b34801561093557600080fd5b50610950600480360381019061094b9190614118565b6122e3565b60405161095d9190613918565b60405180910390f35b34801561097257600080fd5b5061098d60048036038101906109889190613e5f565b612377565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613b43565b61240d565b005b3480156109c457600080fd5b506109cd612504565b6040516109da9190613b28565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abe5750610abd8261250a565b5b9050919050565b606060028054610ad490614187565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090614187565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050905090565b6000610b6282612574565b610b98576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bde82611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c45576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c646125c2565b73ffffffffffffffffffffffffffffffffffffffff1614610cc757610c9081610c8b6125c2565b6122e3565b610cc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd28383836125ca565b505050565b600d5481565b6000610ce761267c565b6001546000540303905090565b60146020528060005260406000206000915090505481565b601260009054906101000a900460ff1615610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614204565b60405180910390fd5b600e546001610d69610cdd565b610d739190614253565b1115610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab906142f5565b60405180910390fd5b6011546001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e039190614253565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90614387565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e949190614253565b92505081905550610ead610ea66125c2565b6001612685565b565b610eb76125c2565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906143f3565b60405180910390fd5b60005b82829050811015610fd457600e546001610f46610cdd565b610f509190614253565b1115610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061445f565b60405180910390fd5b610fc3838383818110610fa757610fa661447f565b5b9050602002016020810190610fbc9190613b43565b6001612685565b80610fcd906144ae565b9050610f2e565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461101757611016336126a3565b5b6110228484846127a0565b50505050565b6110306125c2565b73ffffffffffffffffffffffffffffffffffffffff1661104e611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b906143f3565b60405180910390fd5b6002600954036110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614542565b60405180910390fd5b600260098190555060006110fb611aa0565b73ffffffffffffffffffffffffffffffffffffffff164760405161111e90614593565b60006040518083038185875af1925050503d806000811461115b576040519150601f19603f3d011682016040523d82523d6000602084013e611160565b606091505b505090508061116e57600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111c9576111c8336126a3565b5b6111d48484846127b0565b50505050565b6111e26125c2565b73ffffffffffffffffffffffffffffffffffffffff16611200611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d906143f3565b60405180910390fd5b80600d8190555050565b60115481565b61126e6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661128c611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906143f3565b60405180910390fd5b600e54826112ee610cdd565b6112f89190614253565b1115611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611330906142f5565b60405180910390fd5b6113438183612685565b5050565b601260019054906101000a900460ff1681565b600c805461136790614187565b80601f016020809104026020016040519081016040528092919081815260200182805461139390614187565b80156113e05780601f106113b5576101008083540402835291602001916113e0565b820191906000526020600020905b8154815290600101906020018083116113c357829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b6114036125c2565b73ffffffffffffffffffffffffffffffffffffffff16611421611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906143f3565b60405180910390fd5b80600f8190555050565b60136020528060005260406000206000915090505481565b600a80546114a690614187565b80601f01602080910402602001604051908101604052809291908181526020018280546114d290614187565b801561151f5780601f106114f45761010080835404028352916020019161151f565b820191906000526020600020905b81548152906001019060200180831161150257829003601f168201915b505050505081565b6000611532826127d0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116146125c2565b73ffffffffffffffffffffffffffffffffffffffff16611632611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f906143f3565b60405180910390fd5b6116926000612a5b565b565b600b80546116a190614187565b80601f01602080910402602001604051908101604052809291908181526020018280546116cd90614187565b801561171a5780601f106116ef5761010080835404028352916020019161171a565b820191906000526020600020905b8154815290600101906020018083116116fd57829003601f168201915b505050505081565b61172a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16611748611aa0565b73ffffffffffffffffffffffffffffffffffffffff161461179e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611795906143f3565b60405180910390fd5b80600a90805190602001906117b492919061377e565b5050565b6117c06125c2565b73ffffffffffffffffffffffffffffffffffffffff166117de611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b906143f3565b60405180910390fd5b60011515601260009054906101000a900460ff1615150361186f576000601260006101000a81548160ff02191690831515021790555061188b565b6001601260006101000a81548160ff0219169083151502179055505b565b6060600061189a8361153d565b905060008167ffffffffffffffff8111156118b8576118b7613d34565b5b6040519080825280602002602001820160405280156118e65781602001602082028036833780820191505090505b50905060006118f361267c565b90506000805b8482108015611909575060005483105b15611a93576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611a7f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611a1c57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7e5783858481518110611a6357611a6261447f565b5b6020026020010181815250508280611a7a906144ae565b9350505b5b8380611a8a906144ae565b945050506118f9565b8395505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611ad990614187565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0590614187565b8015611b525780601f10611b2757610100808354040283529160200191611b52565b820191906000526020600020905b815481529060010190602001808311611b3557829003601f168201915b5050505050905090565b80601260009054906101000a900460ff1615611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614204565b60405180910390fd5b60008111611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906145f4565b60405180910390fd5b600f54811115611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614686565b60405180910390fd5b60105481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c839190614253565b1115611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90614718565b60405180910390fd5b600e5481611cd0610cdd565b611cda9190614253565b1115611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d12906142f5565b60405180910390fd5b81600d54611d299190614738565b341015611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d62906147de565b60405180910390fd5b81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dba9190614253565b92505081905550611dd2611dcc6125c2565b83612685565b5050565b611dde6125c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e42576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611efc6125c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f419190613918565b60405180910390a35050565b611f556125c2565b73ffffffffffffffffffffffffffffffffffffffff16611f73611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906143f3565b60405180910390fd5b60011515601260019054906101000a900460ff16151503612004576000601260016101000a81548160ff021916908315150217905550612020565b6001601260016101000a81548160ff0219169083151502179055505b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146120605761205f336126a3565b5b61206c85858585612b21565b5050505050565b60105481565b606061208482612574565b6120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614870565b60405180910390fd5b60001515601260019054906101000a900460ff1615150361217057600b80546120eb90614187565b80601f016020809104026020016040519081016040528092919081815260200182805461211790614187565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b505050505090506121cc565b600061217a612b99565b9050600081511161219a57604051806020016040528060008152506121c8565b806121a484612c2b565b600c6040516020016121b893929190614960565b6040516020818303038152906040525b9150505b919050565b6121d96125c2565b73ffffffffffffffffffffffffffffffffffffffff166121f7611aa0565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143f3565b60405180910390fd5b8060108190555050565b600e5481565b6122656125c2565b73ffffffffffffffffffffffffffffffffffffffff16612283611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d0906143f3565b60405180910390fd5b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61237f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661239d611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea906143f3565b60405180910390fd5b80600b908051906020019061240992919061377e565b5050565b6124156125c2565b73ffffffffffffffffffffffffffffffffffffffff16612433611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612480906143f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614a03565b60405180910390fd5b61250181612a5b565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161257f61267c565b1115801561258e575060005482105b80156125bb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61269f828260405180602001604052806000815250612d8b565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561279d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161271a929190614a23565b602060405180830381865afa158015612737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275b9190614a61565b61279c57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127939190613a92565b60405180910390fd5b5b50565b6127ab83838361314b565b505050565b6127cb83838360405180602001604052806000815250612022565b505050565b6127d8613804565b6000829050806127e661267c565b11612a2457600054811015612a23576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612a2157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612905578092505050612a56565b5b600115612a2057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1b578092505050612a56565b612906565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b2c84848461314b565b612b4b8373ffffffffffffffffffffffffffffffffffffffff166135ff565b15612b9357612b5c84848484613622565b612b92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612ba890614187565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd490614187565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b5050505050905090565b606060008203612c72576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d86565b600082905060005b60008214612ca4578080612c8d906144ae565b915050600a82612c9d9190614abd565b9150612c7a565b60008167ffffffffffffffff811115612cc057612cbf613d34565b5b6040519080825280601f01601f191660200182016040528015612cf25781602001600182028036833780820191505090505b5090505b60008514612d7f57600182612d0b9190614aee565b9150600a85612d1a9190614b22565b6030612d269190614253565b60f81b818381518110612d3c57612d3b61447f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d789190614abd565b9450612cf6565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612df7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612e31576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e3e6000858386613772565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612fff8673ffffffffffffffffffffffffffffffffffffffff166135ff565b156130c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130746000878480600101955087613622565b6130aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106130055782600054146130bf57600080fd5b61312f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106130c5575b8160008190555050506131456000858386613778565b50505050565b6000613156826127d0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131c1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166131e26125c2565b73ffffffffffffffffffffffffffffffffffffffff16148061321157506132108561320b6125c2565b6122e3565b5b80613256575061321f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661323e84610b57565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061328f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132f5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133028585856001613772565b61330e600084876125ca565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361358d57600054821461358c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135f88585856001613778565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136486125c2565b8786866040518563ffffffff1660e01b815260040161366a9493929190614ba8565b6020604051808303816000875af19250505080156136a657506040513d601f19601f820116820180604052508101906136a39190614c09565b60015b61371f573d80600081146136d6576040519150601f19603f3d011682016040523d82523d6000602084013e6136db565b606091505b506000815103613717576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b82805461378a90614187565b90600052602060002090601f0160209004810192826137ac57600085556137f3565b82601f106137c557805160ff19168380011785556137f3565b828001600101855582156137f3579182015b828111156137f25782518255916020019190600101906137d7565b5b5090506138009190613847565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613860576000816000905550600101613848565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138ad81613878565b81146138b857600080fd5b50565b6000813590506138ca816138a4565b92915050565b6000602082840312156138e6576138e561386e565b5b60006138f4848285016138bb565b91505092915050565b60008115159050919050565b613912816138fd565b82525050565b600060208201905061392d6000830184613909565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396d578082015181840152602081019050613952565b8381111561397c576000848401525b50505050565b6000601f19601f8301169050919050565b600061399e82613933565b6139a8818561393e565b93506139b881856020860161394f565b6139c181613982565b840191505092915050565b600060208201905081810360008301526139e68184613993565b905092915050565b6000819050919050565b613a01816139ee565b8114613a0c57600080fd5b50565b600081359050613a1e816139f8565b92915050565b600060208284031215613a3a57613a3961386e565b5b6000613a4884828501613a0f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7c82613a51565b9050919050565b613a8c81613a71565b82525050565b6000602082019050613aa76000830184613a83565b92915050565b613ab681613a71565b8114613ac157600080fd5b50565b600081359050613ad381613aad565b92915050565b60008060408385031215613af057613aef61386e565b5b6000613afe85828601613ac4565b9250506020613b0f85828601613a0f565b9150509250929050565b613b22816139ee565b82525050565b6000602082019050613b3d6000830184613b19565b92915050565b600060208284031215613b5957613b5861386e565b5b6000613b6784828501613ac4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b9557613b94613b70565b5b8235905067ffffffffffffffff811115613bb257613bb1613b75565b5b602083019150836020820283011115613bce57613bcd613b7a565b5b9250929050565b60008060208385031215613bec57613beb61386e565b5b600083013567ffffffffffffffff811115613c0a57613c09613873565b5b613c1685828601613b7f565b92509250509250929050565b600080600060608486031215613c3b57613c3a61386e565b5b6000613c4986828701613ac4565b9350506020613c5a86828701613ac4565b9250506040613c6b86828701613a0f565b9150509250925092565b6000819050919050565b6000613c9a613c95613c9084613a51565b613c75565b613a51565b9050919050565b6000613cac82613c7f565b9050919050565b6000613cbe82613ca1565b9050919050565b613cce81613cb3565b82525050565b6000602082019050613ce96000830184613cc5565b92915050565b60008060408385031215613d0657613d0561386e565b5b6000613d1485828601613a0f565b9250506020613d2585828601613ac4565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6c82613982565b810181811067ffffffffffffffff82111715613d8b57613d8a613d34565b5b80604052505050565b6000613d9e613864565b9050613daa8282613d63565b919050565b600067ffffffffffffffff821115613dca57613dc9613d34565b5b613dd382613982565b9050602081019050919050565b82818337600083830152505050565b6000613e02613dfd84613daf565b613d94565b905082815260208101848484011115613e1e57613e1d613d2f565b5b613e29848285613de0565b509392505050565b600082601f830112613e4657613e45613b70565b5b8135613e56848260208601613def565b91505092915050565b600060208284031215613e7557613e7461386e565b5b600082013567ffffffffffffffff811115613e9357613e92613873565b5b613e9f84828501613e31565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613edd816139ee565b82525050565b6000613eef8383613ed4565b60208301905092915050565b6000602082019050919050565b6000613f1382613ea8565b613f1d8185613eb3565b9350613f2883613ec4565b8060005b83811015613f59578151613f408882613ee3565b9750613f4b83613efb565b925050600181019050613f2c565b5085935050505092915050565b60006020820190508181036000830152613f808184613f08565b905092915050565b613f91816138fd565b8114613f9c57600080fd5b50565b600081359050613fae81613f88565b92915050565b60008060408385031215613fcb57613fca61386e565b5b6000613fd985828601613ac4565b9250506020613fea85828601613f9f565b9150509250929050565b600067ffffffffffffffff82111561400f5761400e613d34565b5b61401882613982565b9050602081019050919050565b600061403861403384613ff4565b613d94565b90508281526020810184848401111561405457614053613d2f565b5b61405f848285613de0565b509392505050565b600082601f83011261407c5761407b613b70565b5b813561408c848260208601614025565b91505092915050565b600080600080608085870312156140af576140ae61386e565b5b60006140bd87828801613ac4565b94505060206140ce87828801613ac4565b93505060406140df87828801613a0f565b925050606085013567ffffffffffffffff811115614100576140ff613873565b5b61410c87828801614067565b91505092959194509250565b6000806040838503121561412f5761412e61386e565b5b600061413d85828601613ac4565b925050602061414e85828601613ac4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419f57607f821691505b6020821081036141b2576141b1614158565b5b50919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006141ee60178361393e565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061425e826139ee565b9150614269836139ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561429e5761429d614224565b5b828201905092915050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b60006142df601f8361393e565b91506142ea826142a9565b602082019050919050565b6000602082019050818103600083015261430e816142d2565b9050919050565b7f4d61782066726565206d696e742070657220616464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b600061437160238361393e565b915061437c82614315565b604082019050919050565b600060208201905081810360008301526143a081614364565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143dd60208361393e565b91506143e8826143a7565b602082019050919050565b6000602082019050818103600083015261440c816143d0565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061444960148361393e565b915061445482614413565b602082019050919050565b600060208201905081810360008301526144788161443c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144b9826139ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144eb576144ea614224565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061452c601f8361393e565b9150614537826144f6565b602082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600081905092915050565b50565b600061457d600083614562565b91506145888261456d565b600082019050919050565b600061459e82614570565b9150819050919050565b7f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000600082015250565b60006145de601a8361393e565b91506145e9826145a8565b602082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b600061467060228361393e565b915061467b82614614565b604082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f4d6178206d696e7420616d6f756e74207065722061646472657373206578636560008201527f6564656421000000000000000000000000000000000000000000000000000000602082015250565b600061470260258361393e565b915061470d826146a6565b604082019050919050565b60006020820190508181036000830152614731816146f5565b9050919050565b6000614743826139ee565b915061474e836139ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561478757614786614224565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006147c860138361393e565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b600061485a60308361393e565b9150614865826147fe565b604082019050919050565b600060208201905081810360008301526148898161484d565b9050919050565b600081905092915050565b60006148a682613933565b6148b08185614890565b93506148c081856020860161394f565b80840191505092915050565b60008190508160005260206000209050919050565b600081546148ee81614187565b6148f88186614890565b94506001821660008114614913576001811461492457614957565b60ff19831686528186019350614957565b61492d856148cc565b60005b8381101561494f57815481890152600182019150602081019050614930565b838801955050505b50505092915050565b600061496c828661489b565b9150614978828561489b565b915061498482846148e1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149ed60268361393e565b91506149f882614991565b604082019050919050565b60006020820190508181036000830152614a1c816149e0565b9050919050565b6000604082019050614a386000830185613a83565b614a456020830184613a83565b9392505050565b600081519050614a5b81613f88565b92915050565b600060208284031215614a7757614a7661386e565b5b6000614a8584828501614a4c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac8826139ee565b9150614ad3836139ee565b925082614ae357614ae2614a8e565b5b828204905092915050565b6000614af9826139ee565b9150614b04836139ee565b925082821015614b1757614b16614224565b5b828203905092915050565b6000614b2d826139ee565b9150614b38836139ee565b925082614b4857614b47614a8e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b7a82614b53565b614b848185614b5e565b9350614b9481856020860161394f565b614b9d81613982565b840191505092915050565b6000608082019050614bbd6000830187613a83565b614bca6020830186613a83565b614bd76040830185613b19565b8181036060830152614be98184614b6f565b905095945050505050565b600081519050614c03816138a4565b92915050565b600060208284031215614c1f57614c1e61386e565b5b6000614c2d84828501614bf4565b9150509291505056fea2646970667358221220c0893bf11e41355f7e2e63e691170f2f31647379ed9a3930347770d377b673c264736f6c634300080d0033697066733a2f2f516d5a3278525a42415044525a714645464535595a64636f766839754750727358455a525a737054665966624a472f68696464656e2e6a736f6e
Deployed Bytecode
0x6080604052600436106102675760003560e01c80636352211e11610144578063a475b5dd116100b6578063d5abeb011161007a578063d5abeb01146108d5578063d755bf9914610900578063e985e9c514610929578063f2c4ce1e14610966578063f2fde38b1461098f578063ff645691146109b857610267565b8063a475b5dd14610804578063b88d4fde1461081b578063ba7d2c7614610844578063c87b56dd1461086f578063d0eb26b0146108ac57610267565b80638456cb59116101085780638456cb59146107155780638462151c1461072c5780638da5cb5b1461076957806395d89b4114610794578063a0712d68146107bf578063a22cb465146107db57610267565b80636352211e1461063057806370a082311461066d578063715018a6146106aa57806372250380146106c15780637ec4a659146106ec57610267565b806341f43434116101dd57806351830227116101a1578063518302271461051e5780635503a0e8146105495780635c975abb146105745780635ef9ff371461059f57806361c0b6a0146105c857806362b99ad41461060557610267565b806341f434341461044d57806342842e0e1461047857806344a0d68a146104a1578063485a68a3146104ca578063512b658d146104f557610267565b806318160ddd1161022f57806318160ddd1461036557806318cae2691461039057806319cae2cb146103cd5780631c0bb4a3146103e457806323b872dd1461040d5780633ccfd60b1461043657610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b31461031157806313faede61461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e91906138d0565b6109e3565b6040516102a09190613918565b60405180910390f35b3480156102b557600080fd5b506102be610ac5565b6040516102cb91906139cc565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f69190613a24565b610b57565b6040516103089190613a92565b60405180910390f35b34801561031d57600080fd5b5061033860048036038101906103339190613ad9565b610bd3565b005b34801561034657600080fd5b5061034f610cd7565b60405161035c9190613b28565b60405180910390f35b34801561037157600080fd5b5061037a610cdd565b6040516103879190613b28565b60405180910390f35b34801561039c57600080fd5b506103b760048036038101906103b29190613b43565b610cf4565b6040516103c49190613b28565b60405180910390f35b3480156103d957600080fd5b506103e2610d0c565b005b3480156103f057600080fd5b5061040b60048036038101906104069190613bd5565b610eaf565b005b34801561041957600080fd5b50610434600480360381019061042f9190613c22565b610fd9565b005b34801561044257600080fd5b5061044b611028565b005b34801561045957600080fd5b50610462611179565b60405161046f9190613cd4565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613c22565b61118b565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613a24565b6111da565b005b3480156104d657600080fd5b506104df611260565b6040516104ec9190613b28565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613cef565b611266565b005b34801561052a57600080fd5b50610533611347565b6040516105409190613918565b60405180910390f35b34801561055557600080fd5b5061055e61135a565b60405161056b91906139cc565b60405180910390f35b34801561058057600080fd5b506105896113e8565b6040516105969190613918565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613a24565b6113fb565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613b43565b611481565b6040516105fc9190613b28565b60405180910390f35b34801561061157600080fd5b5061061a611499565b60405161062791906139cc565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613a24565b611527565b6040516106649190613a92565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613b43565b61153d565b6040516106a19190613b28565b60405180910390f35b3480156106b657600080fd5b506106bf61160c565b005b3480156106cd57600080fd5b506106d6611694565b6040516106e391906139cc565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190613e5f565b611722565b005b34801561072157600080fd5b5061072a6117b8565b005b34801561073857600080fd5b50610753600480360381019061074e9190613b43565b61188d565b6040516107609190613f66565b60405180910390f35b34801561077557600080fd5b5061077e611aa0565b60405161078b9190613a92565b60405180910390f35b3480156107a057600080fd5b506107a9611aca565b6040516107b691906139cc565b60405180910390f35b6107d960048036038101906107d49190613a24565b611b5c565b005b3480156107e757600080fd5b5061080260048036038101906107fd9190613fb4565b611dd6565b005b34801561081057600080fd5b50610819611f4d565b005b34801561082757600080fd5b50610842600480360381019061083d9190614095565b612022565b005b34801561085057600080fd5b50610859612073565b6040516108669190613b28565b60405180910390f35b34801561087b57600080fd5b5061089660048036038101906108919190613a24565b612079565b6040516108a391906139cc565b60405180910390f35b3480156108b857600080fd5b506108d360048036038101906108ce9190613a24565b6121d1565b005b3480156108e157600080fd5b506108ea612257565b6040516108f79190613b28565b60405180910390f35b34801561090c57600080fd5b5061092760048036038101906109229190613a24565b61225d565b005b34801561093557600080fd5b50610950600480360381019061094b9190614118565b6122e3565b60405161095d9190613918565b60405180910390f35b34801561097257600080fd5b5061098d60048036038101906109889190613e5f565b612377565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613b43565b61240d565b005b3480156109c457600080fd5b506109cd612504565b6040516109da9190613b28565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aae57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610abe5750610abd8261250a565b5b9050919050565b606060028054610ad490614187565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090614187565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b5050505050905090565b6000610b6282612574565b610b98576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bde82611527565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c45576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c646125c2565b73ffffffffffffffffffffffffffffffffffffffff1614610cc757610c9081610c8b6125c2565b6122e3565b610cc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610cd28383836125ca565b505050565b600d5481565b6000610ce761267c565b6001546000540303905090565b60146020528060005260406000206000915090505481565b601260009054906101000a900460ff1615610d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5390614204565b60405180910390fd5b600e546001610d69610cdd565b610d739190614253565b1115610db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dab906142f5565b60405180910390fd5b6011546001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610e039190614253565b1115610e44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3b90614387565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610e949190614253565b92505081905550610ead610ea66125c2565b6001612685565b565b610eb76125c2565b73ffffffffffffffffffffffffffffffffffffffff16610ed5611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614610f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f22906143f3565b60405180910390fd5b60005b82829050811015610fd457600e546001610f46610cdd565b610f509190614253565b1115610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061445f565b60405180910390fd5b610fc3838383818110610fa757610fa661447f565b5b9050602002016020810190610fbc9190613b43565b6001612685565b80610fcd906144ae565b9050610f2e565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461101757611016336126a3565b5b6110228484846127a0565b50505050565b6110306125c2565b73ffffffffffffffffffffffffffffffffffffffff1661104e611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109b906143f3565b60405180910390fd5b6002600954036110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e090614542565b60405180910390fd5b600260098190555060006110fb611aa0565b73ffffffffffffffffffffffffffffffffffffffff164760405161111e90614593565b60006040518083038185875af1925050503d806000811461115b576040519150601f19603f3d011682016040523d82523d6000602084013e611160565b606091505b505090508061116e57600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146111c9576111c8336126a3565b5b6111d48484846127b0565b50505050565b6111e26125c2565b73ffffffffffffffffffffffffffffffffffffffff16611200611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124d906143f3565b60405180910390fd5b80600d8190555050565b60115481565b61126e6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661128c611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d9906143f3565b60405180910390fd5b600e54826112ee610cdd565b6112f89190614253565b1115611339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611330906142f5565b60405180910390fd5b6113438183612685565b5050565b601260019054906101000a900460ff1681565b600c805461136790614187565b80601f016020809104026020016040519081016040528092919081815260200182805461139390614187565b80156113e05780601f106113b5576101008083540402835291602001916113e0565b820191906000526020600020905b8154815290600101906020018083116113c357829003601f168201915b505050505081565b601260009054906101000a900460ff1681565b6114036125c2565b73ffffffffffffffffffffffffffffffffffffffff16611421611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906143f3565b60405180910390fd5b80600f8190555050565b60136020528060005260406000206000915090505481565b600a80546114a690614187565b80601f01602080910402602001604051908101604052809291908181526020018280546114d290614187565b801561151f5780601f106114f45761010080835404028352916020019161151f565b820191906000526020600020905b81548152906001019060200180831161150257829003601f168201915b505050505081565b6000611532826127d0565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115a4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116146125c2565b73ffffffffffffffffffffffffffffffffffffffff16611632611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167f906143f3565b60405180910390fd5b6116926000612a5b565b565b600b80546116a190614187565b80601f01602080910402602001604051908101604052809291908181526020018280546116cd90614187565b801561171a5780601f106116ef5761010080835404028352916020019161171a565b820191906000526020600020905b8154815290600101906020018083116116fd57829003601f168201915b505050505081565b61172a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16611748611aa0565b73ffffffffffffffffffffffffffffffffffffffff161461179e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611795906143f3565b60405180910390fd5b80600a90805190602001906117b492919061377e565b5050565b6117c06125c2565b73ffffffffffffffffffffffffffffffffffffffff166117de611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b906143f3565b60405180910390fd5b60011515601260009054906101000a900460ff1615150361186f576000601260006101000a81548160ff02191690831515021790555061188b565b6001601260006101000a81548160ff0219169083151502179055505b565b6060600061189a8361153d565b905060008167ffffffffffffffff8111156118b8576118b7613d34565b5b6040519080825280602002602001820160405280156118e65781602001602082028036833780820191505090505b50905060006118f361267c565b90506000805b8482108015611909575060005483105b15611a93576000600460008581526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611a7f57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611a1c57806000015191505b8773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a7e5783858481518110611a6357611a6261447f565b5b6020026020010181815250508280611a7a906144ae565b9350505b5b8380611a8a906144ae565b945050506118f9565b8395505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054611ad990614187565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0590614187565b8015611b525780601f10611b2757610100808354040283529160200191611b52565b820191906000526020600020905b815481529060010190602001808311611b3557829003601f168201915b5050505050905090565b80601260009054906101000a900460ff1615611bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba490614204565b60405180910390fd5b60008111611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906145f4565b60405180910390fd5b600f54811115611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c90614686565b60405180910390fd5b60105481601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c839190614253565b1115611cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbb90614718565b60405180910390fd5b600e5481611cd0610cdd565b611cda9190614253565b1115611d1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d12906142f5565b60405180910390fd5b81600d54611d299190614738565b341015611d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d62906147de565b60405180910390fd5b81601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dba9190614253565b92505081905550611dd2611dcc6125c2565b83612685565b5050565b611dde6125c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611e42576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611e4f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611efc6125c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f419190613918565b60405180910390a35050565b611f556125c2565b73ffffffffffffffffffffffffffffffffffffffff16611f73611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc0906143f3565b60405180910390fd5b60011515601260019054906101000a900460ff16151503612004576000601260016101000a81548160ff021916908315150217905550612020565b6001601260016101000a81548160ff0219169083151502179055505b565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146120605761205f336126a3565b5b61206c85858585612b21565b5050505050565b60105481565b606061208482612574565b6120c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ba90614870565b60405180910390fd5b60001515601260019054906101000a900460ff1615150361217057600b80546120eb90614187565b80601f016020809104026020016040519081016040528092919081815260200182805461211790614187565b80156121645780601f1061213957610100808354040283529160200191612164565b820191906000526020600020905b81548152906001019060200180831161214757829003601f168201915b505050505090506121cc565b600061217a612b99565b9050600081511161219a57604051806020016040528060008152506121c8565b806121a484612c2b565b600c6040516020016121b893929190614960565b6040516020818303038152906040525b9150505b919050565b6121d96125c2565b73ffffffffffffffffffffffffffffffffffffffff166121f7611aa0565b73ffffffffffffffffffffffffffffffffffffffff161461224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906143f3565b60405180910390fd5b8060108190555050565b600e5481565b6122656125c2565b73ffffffffffffffffffffffffffffffffffffffff16612283611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146122d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d0906143f3565b60405180910390fd5b8060118190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61237f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661239d611aa0565b73ffffffffffffffffffffffffffffffffffffffff16146123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea906143f3565b60405180910390fd5b80600b908051906020019061240992919061377e565b5050565b6124156125c2565b73ffffffffffffffffffffffffffffffffffffffff16612433611aa0565b73ffffffffffffffffffffffffffffffffffffffff1614612489576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612480906143f3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614a03565b60405180910390fd5b61250181612a5b565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161257f61267c565b1115801561258e575060005482105b80156125bb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b61269f828260405180602001604052806000815250612d8b565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561279d576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161271a929190614a23565b602060405180830381865afa158015612737573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275b9190614a61565b61279c57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016127939190613a92565b60405180910390fd5b5b50565b6127ab83838361314b565b505050565b6127cb83838360405180602001604052806000815250612022565b505050565b6127d8613804565b6000829050806127e661267c565b11612a2457600054811015612a23576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612a2157600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612905578092505050612a56565b5b600115612a2057818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612a1b578092505050612a56565b612906565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b2c84848461314b565b612b4b8373ffffffffffffffffffffffffffffffffffffffff166135ff565b15612b9357612b5c84848484613622565b612b92576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612ba890614187565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd490614187565b8015612c215780601f10612bf657610100808354040283529160200191612c21565b820191906000526020600020905b815481529060010190602001808311612c0457829003601f168201915b5050505050905090565b606060008203612c72576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d86565b600082905060005b60008214612ca4578080612c8d906144ae565b915050600a82612c9d9190614abd565b9150612c7a565b60008167ffffffffffffffff811115612cc057612cbf613d34565b5b6040519080825280601f01601f191660200182016040528015612cf25781602001600182028036833780820191505090505b5090505b60008514612d7f57600182612d0b9190614aee565b9150600a85612d1a9190614b22565b6030612d269190614253565b60f81b818381518110612d3c57612d3b61447f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d789190614abd565b9450612cf6565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612df7576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612e31576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e3e6000858386613772565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612fff8673ffffffffffffffffffffffffffffffffffffffff166135ff565b156130c4575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130746000878480600101955087613622565b6130aa576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106130055782600054146130bf57600080fd5b61312f565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106130c5575b8160008190555050506131456000858386613778565b50505050565b6000613156826127d0565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131c1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166131e26125c2565b73ffffffffffffffffffffffffffffffffffffffff16148061321157506132108561320b6125c2565b6122e3565b5b80613256575061321f6125c2565b73ffffffffffffffffffffffffffffffffffffffff1661323e84610b57565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061328f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036132f5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133028585856001613772565b61330e600084876125ca565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361358d57600054821461358c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135f88585856001613778565b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136486125c2565b8786866040518563ffffffff1660e01b815260040161366a9493929190614ba8565b6020604051808303816000875af19250505080156136a657506040513d601f19601f820116820180604052508101906136a39190614c09565b60015b61371f573d80600081146136d6576040519150601f19603f3d011682016040523d82523d6000602084013e6136db565b606091505b506000815103613717576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b82805461378a90614187565b90600052602060002090601f0160209004810192826137ac57600085556137f3565b82601f106137c557805160ff19168380011785556137f3565b828001600101855582156137f3579182015b828111156137f25782518255916020019190600101906137d7565b5b5090506138009190613847565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115613860576000816000905550600101613848565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138ad81613878565b81146138b857600080fd5b50565b6000813590506138ca816138a4565b92915050565b6000602082840312156138e6576138e561386e565b5b60006138f4848285016138bb565b91505092915050565b60008115159050919050565b613912816138fd565b82525050565b600060208201905061392d6000830184613909565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561396d578082015181840152602081019050613952565b8381111561397c576000848401525b50505050565b6000601f19601f8301169050919050565b600061399e82613933565b6139a8818561393e565b93506139b881856020860161394f565b6139c181613982565b840191505092915050565b600060208201905081810360008301526139e68184613993565b905092915050565b6000819050919050565b613a01816139ee565b8114613a0c57600080fd5b50565b600081359050613a1e816139f8565b92915050565b600060208284031215613a3a57613a3961386e565b5b6000613a4884828501613a0f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7c82613a51565b9050919050565b613a8c81613a71565b82525050565b6000602082019050613aa76000830184613a83565b92915050565b613ab681613a71565b8114613ac157600080fd5b50565b600081359050613ad381613aad565b92915050565b60008060408385031215613af057613aef61386e565b5b6000613afe85828601613ac4565b9250506020613b0f85828601613a0f565b9150509250929050565b613b22816139ee565b82525050565b6000602082019050613b3d6000830184613b19565b92915050565b600060208284031215613b5957613b5861386e565b5b6000613b6784828501613ac4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613b9557613b94613b70565b5b8235905067ffffffffffffffff811115613bb257613bb1613b75565b5b602083019150836020820283011115613bce57613bcd613b7a565b5b9250929050565b60008060208385031215613bec57613beb61386e565b5b600083013567ffffffffffffffff811115613c0a57613c09613873565b5b613c1685828601613b7f565b92509250509250929050565b600080600060608486031215613c3b57613c3a61386e565b5b6000613c4986828701613ac4565b9350506020613c5a86828701613ac4565b9250506040613c6b86828701613a0f565b9150509250925092565b6000819050919050565b6000613c9a613c95613c9084613a51565b613c75565b613a51565b9050919050565b6000613cac82613c7f565b9050919050565b6000613cbe82613ca1565b9050919050565b613cce81613cb3565b82525050565b6000602082019050613ce96000830184613cc5565b92915050565b60008060408385031215613d0657613d0561386e565b5b6000613d1485828601613a0f565b9250506020613d2585828601613ac4565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d6c82613982565b810181811067ffffffffffffffff82111715613d8b57613d8a613d34565b5b80604052505050565b6000613d9e613864565b9050613daa8282613d63565b919050565b600067ffffffffffffffff821115613dca57613dc9613d34565b5b613dd382613982565b9050602081019050919050565b82818337600083830152505050565b6000613e02613dfd84613daf565b613d94565b905082815260208101848484011115613e1e57613e1d613d2f565b5b613e29848285613de0565b509392505050565b600082601f830112613e4657613e45613b70565b5b8135613e56848260208601613def565b91505092915050565b600060208284031215613e7557613e7461386e565b5b600082013567ffffffffffffffff811115613e9357613e92613873565b5b613e9f84828501613e31565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613edd816139ee565b82525050565b6000613eef8383613ed4565b60208301905092915050565b6000602082019050919050565b6000613f1382613ea8565b613f1d8185613eb3565b9350613f2883613ec4565b8060005b83811015613f59578151613f408882613ee3565b9750613f4b83613efb565b925050600181019050613f2c565b5085935050505092915050565b60006020820190508181036000830152613f808184613f08565b905092915050565b613f91816138fd565b8114613f9c57600080fd5b50565b600081359050613fae81613f88565b92915050565b60008060408385031215613fcb57613fca61386e565b5b6000613fd985828601613ac4565b9250506020613fea85828601613f9f565b9150509250929050565b600067ffffffffffffffff82111561400f5761400e613d34565b5b61401882613982565b9050602081019050919050565b600061403861403384613ff4565b613d94565b90508281526020810184848401111561405457614053613d2f565b5b61405f848285613de0565b509392505050565b600082601f83011261407c5761407b613b70565b5b813561408c848260208601614025565b91505092915050565b600080600080608085870312156140af576140ae61386e565b5b60006140bd87828801613ac4565b94505060206140ce87828801613ac4565b93505060406140df87828801613a0f565b925050606085013567ffffffffffffffff811115614100576140ff613873565b5b61410c87828801614067565b91505092959194509250565b6000806040838503121561412f5761412e61386e565b5b600061413d85828601613ac4565b925050602061414e85828601613ac4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419f57607f821691505b6020821081036141b2576141b1614158565b5b50919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b60006141ee60178361393e565b91506141f9826141b8565b602082019050919050565b6000602082019050818103600083015261421d816141e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061425e826139ee565b9150614269836139ee565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561429e5761429d614224565b5b828201905092915050565b7f4d696e7420616d6f756e742065786365656473206d617820737570706c792100600082015250565b60006142df601f8361393e565b91506142ea826142a9565b602082019050919050565b6000602082019050818103600083015261430e816142d2565b9050919050565b7f4d61782066726565206d696e742070657220616464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b600061437160238361393e565b915061437c82614315565b604082019050919050565b600060208201905081810360008301526143a081614364565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006143dd60208361393e565b91506143e8826143a7565b602082019050919050565b6000602082019050818103600083015261440c816143d0565b9050919050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b600061444960148361393e565b915061445482614413565b602082019050919050565b600060208201905081810360008301526144788161443c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006144b9826139ee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144eb576144ea614224565b5b600182019050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061452c601f8361393e565b9150614537826144f6565b602082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600081905092915050565b50565b600061457d600083614562565b91506145888261456d565b600082019050919050565b600061459e82614570565b9150819050919050565b7f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000600082015250565b60006145de601a8361393e565b91506145e9826145a8565b602082019050919050565b6000602082019050818103600083015261460d816145d1565b9050919050565b7f4d6178206d696e7420706572207472616e73616374696f6e206578636565646560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b600061467060228361393e565b915061467b82614614565b604082019050919050565b6000602082019050818103600083015261469f81614663565b9050919050565b7f4d6178206d696e7420616d6f756e74207065722061646472657373206578636560008201527f6564656421000000000000000000000000000000000000000000000000000000602082015250565b600061470260258361393e565b915061470d826146a6565b604082019050919050565b60006020820190508181036000830152614731816146f5565b9050919050565b6000614743826139ee565b915061474e836139ee565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561478757614786614224565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b60006147c860138361393e565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e2e00000000000000000000000000000000602082015250565b600061485a60308361393e565b9150614865826147fe565b604082019050919050565b600060208201905081810360008301526148898161484d565b9050919050565b600081905092915050565b60006148a682613933565b6148b08185614890565b93506148c081856020860161394f565b80840191505092915050565b60008190508160005260206000209050919050565b600081546148ee81614187565b6148f88186614890565b94506001821660008114614913576001811461492457614957565b60ff19831686528186019350614957565b61492d856148cc565b60005b8381101561494f57815481890152600182019150602081019050614930565b838801955050505b50505092915050565b600061496c828661489b565b9150614978828561489b565b915061498482846148e1565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006149ed60268361393e565b91506149f882614991565b604082019050919050565b60006020820190508181036000830152614a1c816149e0565b9050919050565b6000604082019050614a386000830185613a83565b614a456020830184613a83565b9392505050565b600081519050614a5b81613f88565b92915050565b600060208284031215614a7757614a7661386e565b5b6000614a8584828501614a4c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ac8826139ee565b9150614ad3836139ee565b925082614ae357614ae2614a8e565b5b828204905092915050565b6000614af9826139ee565b9150614b04836139ee565b925082821015614b1757614b16614224565b5b828203905092915050565b6000614b2d826139ee565b9150614b38836139ee565b925082614b4857614b47614a8e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614b7a82614b53565b614b848185614b5e565b9350614b9481856020860161394f565b614b9d81613982565b840191505092915050565b6000608082019050614bbd6000830187613a83565b614bca6020830186613a83565b614bd76040830185613b19565b8181036060830152614be98184614b6f565b905095945050505050565b600081519050614c03816138a4565b92915050565b600060208284031215614c1f57614c1e61386e565b5b6000614c2d84828501614bf4565b9150509291505056fea2646970667358221220c0893bf11e41355f7e2e63e691170f2f31647379ed9a3930347770d377b673c264736f6c634300080d0033
Deployed Bytecode Sourcemap
42455:6003:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25372:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28487:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29999:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29553:380;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42676:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24612:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42980:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44325:327;;;;;;;;;;;;;:::i;:::-;;44925:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47751:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48293:162;;;;;;;;;;;;;:::i;:::-;;3722:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47918:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46732:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42831:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44681:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42894:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42634:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42864:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46844:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42929:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42573:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28295:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25741:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9759:103;;;;;;;;;;;;;:::i;:::-;;42601:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47251:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47504:114;;;;;;;;;;;;;:::i;:::-;;45249:827;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9108:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28656:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44046:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30275:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47624:121;;;;;;;;;;;;;:::i;:::-;;48093:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42788:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46217:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47111:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42717:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46985:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30633:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47378:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10017:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42755:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25372:305;25474:4;25526:25;25511:40;;;:11;:40;;;;:105;;;;25583:33;25568:48;;;:11;:48;;;;25511:105;:158;;;;25633:36;25657:11;25633:23;:36::i;:::-;25511:158;25491:178;;25372:305;;;:::o;28487:100::-;28541:13;28574:5;28567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28487:100;:::o;29999:204::-;30067:7;30092:16;30100:7;30092;:16::i;:::-;30087:64;;30117:34;;;;;;;;;;;;;;30087:64;30171:15;:24;30187:7;30171:24;;;;;;;;;;;;;;;;;;;;;30164:31;;29999:204;;;:::o;29553:380::-;29634:13;29650:24;29666:7;29650:15;:24::i;:::-;29634:40;;29695:5;29689:11;;:2;:11;;;29685:48;;29709:24;;;;;;;;;;;;;;29685:48;29766:5;29750:21;;:12;:10;:12::i;:::-;:21;;;29746:139;;29777:37;29794:5;29801:12;:10;:12::i;:::-;29777:16;:37::i;:::-;29773:112;;29838:35;;;;;;;;;;;;;;29773:112;29746:139;29897:28;29906:2;29910:7;29919:5;29897:8;:28::i;:::-;29623:310;29553:380;;:::o;42676:34::-;;;;:::o;24612:312::-;24665:7;24890:15;:13;:15::i;:::-;24875:12;;24859:13;;:28;:46;24852:53;;24612:312;:::o;42980:55::-;;;;;;;;;;;;;;;;;:::o;44325:327::-;44368:6;;;;;;;;;;;44367:7;44359:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;44438:9;;44433:1;44417:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;44409:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44529:7;;44524:1;44498:11;:23;44510:10;44498:23;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:38;;44490:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;44612:1;44585:11;:23;44597:10;44585:23;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;44620:26;44630:12;:10;:12::i;:::-;44644:1;44620:9;:26::i;:::-;44325:327::o;44925:237::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45006:9:::1;45001:156;45021:8;;:15;;45017:1;:19;45001:156;;;45081:9;;45076:1;45060:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;45052:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45124:25;45134:8;;45143:1;45134:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;45147:1;45124:9;:25::i;:::-;45038:3;;;;:::i;:::-;;;45001:156;;;;44925:237:::0;;:::o;47751:161::-;47852:4;5071:10;5063:18;;:4;:18;;;5059:83;;5098:32;5119:10;5098:20;:32::i;:::-;5059:83;47869:37:::1;47888:4;47894:2;47898:7;47869:18;:37::i;:::-;47751:161:::0;;;;:::o;48293:162::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5952:1:::1;6172:7;;:19:::0;6164:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5952:1;6305:7;:18;;;;48353:12:::2;48379:7;:5;:7::i;:::-;48371:21;;48400;48371:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48352:74;;;48441:7;48433:16;;;::::0;::::2;;48345:110;5908:1:::1;6350:7;:22;;;;48293:162::o:0;3722:143::-;3822:42;3722:143;:::o;47918:169::-;48023:4;5071:10;5063:18;;:4;:18;;;5059:83;;5098:32;5119:10;5098:20;:32::i;:::-;5059:83;48040:41:::1;48063:4;48069:2;48073:7;48040:22;:41::i;:::-;47918:169:::0;;;;:::o;46732:74::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46795:5:::1;46788:4;:12;;;;46732:74:::0;:::o;42831:26::-;;;;:::o;44681:217::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44807:9:::1;;44792:11;44776:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;44768:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;44859:33;44869:9;44880:11;44859:9;:33::i;:::-;44681:217:::0;;:::o;42894:28::-;;;;;;;;;;;;;:::o;42634:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42864:25::-;;;;;;;;;;;;;:::o;46844:98::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46923:13:::1;46912:8;:24;;;;46844:98:::0;:::o;42929:46::-;;;;;;;;;;;;;;;;;:::o;42573:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28295:125::-;28359:7;28386:21;28399:7;28386:12;:21::i;:::-;:26;;;28379:33;;28295:125;;;:::o;25741:206::-;25805:7;25846:1;25829:19;;:5;:19;;;25825:60;;25857:28;;;;;;;;;;;;;;25825:60;25911:12;:19;25924:5;25911:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25903:36;;25896:43;;25741:206;;;:::o;9759:103::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9824:30:::1;9851:1;9824:18;:30::i;:::-;9759:103::o:0;42601:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47251:100::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47335:10:::1;47323:9;:22;;;;;;;;;;;;:::i;:::-;;47251:100:::0;:::o;47504:114::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47559:4:::1;47549:14;;:6;;;;;;;;;;;:14;;::::0;47545:68:::1;;47576:5;47567:6;;:14;;;;;;;;;;;;;;;;;;47545:68;;;47606:4;47597:6;;:13;;;;;;;;;;;;;;;;;;47545:68;47504:114::o:0;45249:827::-;45309:16;45334:23;45360:17;45370:6;45360:9;:17::i;:::-;45334:43;;45384:30;45431:15;45417:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45384:63;;45454:22;45479:15;:13;:15::i;:::-;45454:40;;45501:23;45535:26;45570:474;45595:15;45577;:33;:67;;;;;45631:13;;45614:14;:30;45577:67;45570:474;;;45655:31;45689:11;:27;45701:14;45689:27;;;;;;;;;;;45655:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45732:9;:16;;;45727:285;;45791:1;45765:28;;:9;:14;;;:28;;;45761:94;;45829:9;:14;;;45808:35;;45761:94;45893:6;45871:28;;:18;:28;;;45867:136;;45947:14;45914:13;45928:15;45914:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;45974:17;;;;;:::i;:::-;;;;45867:136;45727:285;46020:16;;;;;:::i;:::-;;;;45646:398;45570:474;;;46057:13;46050:20;;;;;;;45249:827;;;:::o;9108:87::-;9154:7;9181:6;;;;;;;;;;;9174:13;;9108:87;:::o;28656:104::-;28712:13;28745:7;28738:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28656:104;:::o;44046:257::-;44111:11;43557:6;;;;;;;;;;;43556:7;43548:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;43620:1;43606:11;:15;43598:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;43682:8;;43667:11;:23;;43659:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;43794:18;;43779:11;43744:20;:32;43765:10;43744:32;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:68;;43736:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43900:9;;43885:11;43869:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;43861:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;44159:11:::1;44152:4;;:18;;;;:::i;:::-;44139:9;:31;;44131:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;44243:11;44207:20;:32;44228:10;44207:32;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;44261:36;44271:12;:10;:12::i;:::-;44285:11;44261:9;:36::i;:::-;44046:257:::0;;:::o;30275:287::-;30386:12;:10;:12::i;:::-;30374:24;;:8;:24;;;30370:54;;30407:17;;;;;;;;;;;;;;30370:54;30482:8;30437:18;:32;30456:12;:10;:12::i;:::-;30437:32;;;;;;;;;;;;;;;:42;30470:8;30437:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30535:8;30506:48;;30521:12;:10;:12::i;:::-;30506:48;;;30545:8;30506:48;;;;;;:::i;:::-;;;;;;;;30275:287;;:::o;47624:121::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47682:4:::1;47670:16;;:8;;;;;;;;;;;:16;;::::0;47666:74:::1;;47701:5;47690:8;;:16;;;;;;;;;;;;;;;;;;47666:74;;;47733:4;47722:8;;:15;;;;;;;;;;;;;;;;;;47666:74;47624:121::o:0;48093:194::-;48217:4;5071:10;5063:18;;:4;:18;;;5059:83;;5098:32;5119:10;5098:20;:32::i;:::-;5059:83;48234:47:::1;48257:4;48263:2;48267:7;48276:4;48234:22;:47::i;:::-;48093:194:::0;;;;;:::o;42788:38::-;;;;:::o;46217:428::-;46291:13;46321:17;46329:8;46321:7;:17::i;:::-;46313:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46419:5;46407:17;;:8;;;;;;;;;;;:17;;;46403:49;;46435:14;46428:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46403:49;46460:28;46491:10;:8;:10::i;:::-;46460:41;;46546:1;46521:14;46515:28;:32;:122;;;;;;;;;;;;;;;;;46579:14;46595:19;:8;:17;:19::i;:::-;46616:9;46562:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46515:122;46508:129;;;46217:428;;;;:::o;47111:120::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47211:14:::1;47190:18;:35;;;;47111:120:::0;:::o;42717:31::-;;;;:::o;46985:86::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47057:8:::1;47047:7;:18;;;;46985:86:::0;:::o;30633:164::-;30730:4;30754:18;:25;30773:5;30754:25;;;;;;;;;;;;;;;:35;30780:8;30754:35;;;;;;;;;;;;;;;;;;;;;;;;;30747:42;;30633:164;;;;:::o;47378:120::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47477:15:::1;47460:14;:32;;;;;;;;;;;;:::i;:::-;;47378:120:::0;:::o;10017:201::-;9339:12;:10;:12::i;:::-;9328:23;;:7;:5;:7::i;:::-;:23;;;9320:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10126:1:::1;10106:22;;:8;:22;;::::0;10098:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;10182:28;10201:8;10182:18;:28::i;:::-;10017:201:::0;:::o;42755:28::-;;;;:::o;16600:157::-;16685:4;16724:25;16709:40;;;:11;:40;;;;16702:47;;16600:157;;;:::o;31986:174::-;32043:4;32086:7;32067:15;:13;:15::i;:::-;:26;;:53;;;;;32107:13;;32097:7;:23;32067:53;:85;;;;;32125:11;:20;32137:7;32125:20;;;;;;;;;;;:27;;;;;;;;;;;;32124:28;32067:85;32060:92;;31986:174;;;:::o;8398:98::-;8451:7;8478:10;8471:17;;8398:98;:::o;41208:196::-;41350:2;41323:15;:24;41339:7;41323:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41388:7;41384:2;41368:28;;41377:5;41368:28;;;;;;;;;;;;41208:196;;;:::o;46100:95::-;46165:7;46188:1;46181:8;;46100:95;:::o;32244:104::-;32313:27;32323:2;32327:8;32313:27;;;;;;;;;;;;:9;:27::i;:::-;32244:104;;:::o;5301:419::-;5540:1;3822:42;5492:45;;;:49;5488:225;;;3822:42;5563;;;5614:4;5621:8;5563:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5558:144;;5677:8;5658:28;;;;;;;;;;;:::i;:::-;;;;;;;;5558:144;5488:225;5301:419;:::o;30864:170::-;30998:28;31008:4;31014:2;31018:7;30998:9;:28::i;:::-;30864:170;;;:::o;31105:185::-;31243:39;31260:4;31266:2;31270:7;31243:39;;;;;;;;;;;;:16;:39::i;:::-;31105:185;;;:::o;27122:1111::-;27184:21;;:::i;:::-;27218:12;27233:7;27218:22;;27301:4;27282:15;:13;:15::i;:::-;:23;27278:888;;27318:13;;27311:4;:20;27307:859;;;27352:31;27386:11;:17;27398:4;27386:17;;;;;;;;;;;27352:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27427:9;:16;;;27422:729;;27498:1;27472:28;;:9;:14;;;:28;;;27468:101;;27536:9;27529:16;;;;;;27468:101;27871:261;27878:4;27871:261;;;27911:6;;;;;;;;27956:11;:17;27968:4;27956:17;;;;;;;;;;;27944:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28030:1;28004:28;;:9;:14;;;:28;;;28000:109;;28072:9;28065:16;;;;;;28000:109;27871:261;;;27422:729;27333:833;27307:859;27278:888;28194:31;;;;;;;;;;;;;;27122:1111;;;;:::o;10378:191::-;10452:16;10471:6;;;;;;;;;;;10452:25;;10497:8;10488:6;;:17;;;;;;;;;;;;;;;;;;10552:8;10521:40;;10542:8;10521:40;;;;;;;;;;;;10441:128;10378:191;:::o;31361:370::-;31528:28;31538:4;31544:2;31548:7;31528:9;:28::i;:::-;31571:15;:2;:13;;;:15::i;:::-;31567:157;;;31592:56;31623:4;31629:2;31633:7;31642:5;31592:30;:56::i;:::-;31588:136;;31672:40;;;;;;;;;;;;;;31588:136;31567:157;31361:370;;;;:::o;43328:104::-;43388:13;43417:9;43410:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43328:104;:::o;6656:534::-;6712:13;6753:1;6744:5;:10;6740:53;;6771:10;;;;;;;;;;;;;;;;;;;;;6740:53;6803:12;6818:5;6803:20;;6834:14;6859:78;6874:1;6866:4;:9;6859:78;;6892:8;;;;;:::i;:::-;;;;6923:2;6915:10;;;;;:::i;:::-;;;6859:78;;;6947:19;6979:6;6969:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6947:39;;6997:154;7013:1;7004:5;:10;6997:154;;7041:1;7031:11;;;;;:::i;:::-;;;7108:2;7100:5;:10;;;;:::i;:::-;7087:2;:24;;;;:::i;:::-;7074:39;;7057:6;7064;7057:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7137:2;7128:11;;;;;:::i;:::-;;;6997:154;;;7175:6;7161:21;;;;;6656:534;;;;:::o;32721:1749::-;32844:20;32867:13;;32844:36;;32909:1;32895:16;;:2;:16;;;32891:48;;32920:19;;;;;;;;;;;;;;32891:48;32966:1;32954:8;:13;32950:44;;32976:18;;;;;;;;;;;;;;32950:44;33007:61;33037:1;33041:2;33045:12;33059:8;33007:21;:61::i;:::-;33380:8;33345:12;:16;33358:2;33345:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33444:8;33404:12;:16;33417:2;33404:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33503:2;33470:11;:25;33482:12;33470:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33570:15;33520:11;:25;33532:12;33520:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33603:20;33626:12;33603:35;;33653:11;33682:8;33667:12;:23;33653:37;;33711:15;:2;:13;;;:15::i;:::-;33707:631;;;33747:313;33803:12;33799:2;33778:38;;33795:1;33778:38;;;;;;;;;;;;33844:69;33883:1;33887:2;33891:14;;;;;;33907:5;33844:30;:69::i;:::-;33839:174;;33949:40;;;;;;;;;;;;;;33839:174;34055:3;34040:12;:18;33747:313;;34141:12;34124:13;;:29;34120:43;;34155:8;;;34120:43;33707:631;;;34204:119;34260:14;;;;;;34256:2;34235:40;;34252:1;34235:40;;;;;;;;;;;;34318:3;34303:12;:18;34204:119;;33707:631;34368:12;34352:13;:28;;;;33320:1072;;34402:60;34431:1;34435:2;34439:12;34453:8;34402:20;:60::i;:::-;32833:1637;32721:1749;;;:::o;36156:2130::-;36271:35;36309:21;36322:7;36309:12;:21::i;:::-;36271:59;;36369:4;36347:26;;:13;:18;;;:26;;;36343:67;;36382:28;;;;;;;;;;;;;;36343:67;36423:22;36465:4;36449:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;36486:36;36503:4;36509:12;:10;:12::i;:::-;36486:16;:36::i;:::-;36449:73;:126;;;;36563:12;:10;:12::i;:::-;36539:36;;:20;36551:7;36539:11;:20::i;:::-;:36;;;36449:126;36423:153;;36594:17;36589:66;;36620:35;;;;;;;;;;;;;;36589:66;36684:1;36670:16;;:2;:16;;;36666:52;;36695:23;;;;;;;;;;;;;;36666:52;36731:43;36753:4;36759:2;36763:7;36772:1;36731:21;:43::i;:::-;36839:35;36856:1;36860:7;36869:4;36839:8;:35::i;:::-;37200:1;37170:12;:18;37183:4;37170:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37244:1;37216:12;:16;37229:2;37216:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37262:31;37296:11;:20;37308:7;37296:20;;;;;;;;;;;37262:54;;37347:2;37331:8;:13;;;:18;;;;;;;;;;;;;;;;;;37397:15;37364:8;:23;;;:49;;;;;;;;;;;;;;;;;;37665:19;37697:1;37687:7;:11;37665:33;;37713:31;37747:11;:24;37759:11;37747:24;;;;;;;;;;;37713:58;;37815:1;37790:27;;:8;:13;;;;;;;;;;;;:27;;;37786:384;;38000:13;;37985:11;:28;37981:174;;38054:4;38038:8;:13;;;:20;;;;;;;;;;;;;;;;;;38107:13;:28;;;38081:8;:23;;;:54;;;;;;;;;;;;;;;;;;37981:174;37786:384;37145:1036;;;38217:7;38213:2;38198:27;;38207:4;38198:27;;;;;;;;;;;;38236:42;38257:4;38263:2;38267:7;38276:1;38236:20;:42::i;:::-;36260:2026;;36156:2130;;;:::o;10830:115::-;10890:4;10936:1;10914:7;:19;;;:23;10907:30;;10830:115;;;:::o;41412:667::-;41575:4;41612:2;41596:36;;;41633:12;:10;:12::i;:::-;41647:4;41653:7;41662:5;41596:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41592:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41847:1;41830:6;:13;:18;41826:235;;41876:40;;;;;;;;;;;;;;41826:235;42019:6;42013:13;42004:6;42000:2;41996:15;41989:38;41592:480;41725:45;;;41715:55;;;:6;:55;;;;41708:62;;;41412:667;;;;;;:::o;42088:159::-;;;;;:::o;42255:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:117::-;5734:1;5731;5724:12;5748:117;5857:1;5854;5847:12;5871:117;5980:1;5977;5970:12;6011:568;6084:8;6094:6;6144:3;6137:4;6129:6;6125:17;6121:27;6111:122;;6152:79;;:::i;:::-;6111:122;6265:6;6252:20;6242:30;;6295:18;6287:6;6284:30;6281:117;;;6317:79;;:::i;:::-;6281:117;6431:4;6423:6;6419:17;6407:29;;6485:3;6477:4;6469:6;6465:17;6455:8;6451:32;6448:41;6445:128;;;6492:79;;:::i;:::-;6445:128;6011:568;;;;;:::o;6585:559::-;6671:6;6679;6728:2;6716:9;6707:7;6703:23;6699:32;6696:119;;;6734:79;;:::i;:::-;6696:119;6882:1;6871:9;6867:17;6854:31;6912:18;6904:6;6901:30;6898:117;;;6934:79;;:::i;:::-;6898:117;7047:80;7119:7;7110:6;7099:9;7095:22;7047:80;:::i;:::-;7029:98;;;;6825:312;6585:559;;;;;:::o;7150:619::-;7227:6;7235;7243;7292:2;7280:9;7271:7;7267:23;7263:32;7260:119;;;7298:79;;:::i;:::-;7260:119;7418:1;7443:53;7488:7;7479:6;7468:9;7464:22;7443:53;:::i;:::-;7433:63;;7389:117;7545:2;7571:53;7616:7;7607:6;7596:9;7592:22;7571:53;:::i;:::-;7561:63;;7516:118;7673:2;7699:53;7744:7;7735:6;7724:9;7720:22;7699:53;:::i;:::-;7689:63;;7644:118;7150:619;;;;;:::o;7775:60::-;7803:3;7824:5;7817:12;;7775:60;;;:::o;7841:142::-;7891:9;7924:53;7942:34;7951:24;7969:5;7951:24;:::i;:::-;7942:34;:::i;:::-;7924:53;:::i;:::-;7911:66;;7841:142;;;:::o;7989:126::-;8039:9;8072:37;8103:5;8072:37;:::i;:::-;8059:50;;7989:126;;;:::o;8121:157::-;8202:9;8235:37;8266:5;8235:37;:::i;:::-;8222:50;;8121:157;;;:::o;8284:193::-;8402:68;8464:5;8402:68;:::i;:::-;8397:3;8390:81;8284:193;;:::o;8483:284::-;8607:4;8645:2;8634:9;8630:18;8622:26;;8658:102;8757:1;8746:9;8742:17;8733:6;8658:102;:::i;:::-;8483:284;;;;:::o;8773:474::-;8841:6;8849;8898:2;8886:9;8877:7;8873:23;8869:32;8866:119;;;8904:79;;:::i;:::-;8866:119;9024:1;9049:53;9094:7;9085:6;9074:9;9070:22;9049:53;:::i;:::-;9039:63;;8995:117;9151:2;9177:53;9222:7;9213:6;9202:9;9198:22;9177:53;:::i;:::-;9167:63;;9122:118;8773:474;;;;;:::o;9253:117::-;9362:1;9359;9352:12;9376:180;9424:77;9421:1;9414:88;9521:4;9518:1;9511:15;9545:4;9542:1;9535:15;9562:281;9645:27;9667:4;9645:27;:::i;:::-;9637:6;9633:40;9775:6;9763:10;9760:22;9739:18;9727:10;9724:34;9721:62;9718:88;;;9786:18;;:::i;:::-;9718:88;9826:10;9822:2;9815:22;9605:238;9562:281;;:::o;9849:129::-;9883:6;9910:20;;:::i;:::-;9900:30;;9939:33;9967:4;9959:6;9939:33;:::i;:::-;9849:129;;;:::o;9984:308::-;10046:4;10136:18;10128:6;10125:30;10122:56;;;10158:18;;:::i;:::-;10122:56;10196:29;10218:6;10196:29;:::i;:::-;10188:37;;10280:4;10274;10270:15;10262:23;;9984:308;;;:::o;10298:154::-;10382:6;10377:3;10372;10359:30;10444:1;10435:6;10430:3;10426:16;10419:27;10298:154;;;:::o;10458:412::-;10536:5;10561:66;10577:49;10619:6;10577:49;:::i;:::-;10561:66;:::i;:::-;10552:75;;10650:6;10643:5;10636:21;10688:4;10681:5;10677:16;10726:3;10717:6;10712:3;10708:16;10705:25;10702:112;;;10733:79;;:::i;:::-;10702:112;10823:41;10857:6;10852:3;10847;10823:41;:::i;:::-;10542:328;10458:412;;;;;:::o;10890:340::-;10946:5;10995:3;10988:4;10980:6;10976:17;10972:27;10962:122;;11003:79;;:::i;:::-;10962:122;11120:6;11107:20;11145:79;11220:3;11212:6;11205:4;11197:6;11193:17;11145:79;:::i;:::-;11136:88;;10952:278;10890:340;;;;:::o;11236:509::-;11305:6;11354:2;11342:9;11333:7;11329:23;11325:32;11322:119;;;11360:79;;:::i;:::-;11322:119;11508:1;11497:9;11493:17;11480:31;11538:18;11530:6;11527:30;11524:117;;;11560:79;;:::i;:::-;11524:117;11665:63;11720:7;11711:6;11700:9;11696:22;11665:63;:::i;:::-;11655:73;;11451:287;11236:509;;;;:::o;11751:114::-;11818:6;11852:5;11846:12;11836:22;;11751:114;;;:::o;11871:184::-;11970:11;12004:6;11999:3;11992:19;12044:4;12039:3;12035:14;12020:29;;11871:184;;;;:::o;12061:132::-;12128:4;12151:3;12143:11;;12181:4;12176:3;12172:14;12164:22;;12061:132;;;:::o;12199:108::-;12276:24;12294:5;12276:24;:::i;:::-;12271:3;12264:37;12199:108;;:::o;12313:179::-;12382:10;12403:46;12445:3;12437:6;12403:46;:::i;:::-;12481:4;12476:3;12472:14;12458:28;;12313:179;;;;:::o;12498:113::-;12568:4;12600;12595:3;12591:14;12583:22;;12498:113;;;:::o;12647:732::-;12766:3;12795:54;12843:5;12795:54;:::i;:::-;12865:86;12944:6;12939:3;12865:86;:::i;:::-;12858:93;;12975:56;13025:5;12975:56;:::i;:::-;13054:7;13085:1;13070:284;13095:6;13092:1;13089:13;13070:284;;;13171:6;13165:13;13198:63;13257:3;13242:13;13198:63;:::i;:::-;13191:70;;13284:60;13337:6;13284:60;:::i;:::-;13274:70;;13130:224;13117:1;13114;13110:9;13105:14;;13070:284;;;13074:14;13370:3;13363:10;;12771:608;;;12647:732;;;;:::o;13385:373::-;13528:4;13566:2;13555:9;13551:18;13543:26;;13615:9;13609:4;13605:20;13601:1;13590:9;13586:17;13579:47;13643:108;13746:4;13737:6;13643:108;:::i;:::-;13635:116;;13385:373;;;;:::o;13764:116::-;13834:21;13849:5;13834:21;:::i;:::-;13827:5;13824:32;13814:60;;13870:1;13867;13860:12;13814:60;13764:116;:::o;13886:133::-;13929:5;13967:6;13954:20;13945:29;;13983:30;14007:5;13983:30;:::i;:::-;13886:133;;;;:::o;14025:468::-;14090:6;14098;14147:2;14135:9;14126:7;14122:23;14118:32;14115:119;;;14153:79;;:::i;:::-;14115:119;14273:1;14298:53;14343:7;14334:6;14323:9;14319:22;14298:53;:::i;:::-;14288:63;;14244:117;14400:2;14426:50;14468:7;14459:6;14448:9;14444:22;14426:50;:::i;:::-;14416:60;;14371:115;14025:468;;;;;:::o;14499:307::-;14560:4;14650:18;14642:6;14639:30;14636:56;;;14672:18;;:::i;:::-;14636:56;14710:29;14732:6;14710:29;:::i;:::-;14702:37;;14794:4;14788;14784:15;14776:23;;14499:307;;;:::o;14812:410::-;14889:5;14914:65;14930:48;14971:6;14930:48;:::i;:::-;14914:65;:::i;:::-;14905:74;;15002:6;14995:5;14988:21;15040:4;15033:5;15029:16;15078:3;15069:6;15064:3;15060:16;15057:25;15054:112;;;15085:79;;:::i;:::-;15054:112;15175:41;15209:6;15204:3;15199;15175:41;:::i;:::-;14895:327;14812:410;;;;;:::o;15241:338::-;15296:5;15345:3;15338:4;15330:6;15326:17;15322:27;15312:122;;15353:79;;:::i;:::-;15312:122;15470:6;15457:20;15495:78;15569:3;15561:6;15554:4;15546:6;15542:17;15495:78;:::i;:::-;15486:87;;15302:277;15241:338;;;;:::o;15585:943::-;15680:6;15688;15696;15704;15753:3;15741:9;15732:7;15728:23;15724:33;15721:120;;;15760:79;;:::i;:::-;15721:120;15880:1;15905:53;15950:7;15941:6;15930:9;15926:22;15905:53;:::i;:::-;15895:63;;15851:117;16007:2;16033:53;16078:7;16069:6;16058:9;16054:22;16033:53;:::i;:::-;16023:63;;15978:118;16135:2;16161:53;16206:7;16197:6;16186:9;16182:22;16161:53;:::i;:::-;16151:63;;16106:118;16291:2;16280:9;16276:18;16263:32;16322:18;16314:6;16311:30;16308:117;;;16344:79;;:::i;:::-;16308:117;16449:62;16503:7;16494:6;16483:9;16479:22;16449:62;:::i;:::-;16439:72;;16234:287;15585:943;;;;;;;:::o;16534:474::-;16602:6;16610;16659:2;16647:9;16638:7;16634:23;16630:32;16627:119;;;16665:79;;:::i;:::-;16627:119;16785:1;16810:53;16855:7;16846:6;16835:9;16831:22;16810:53;:::i;:::-;16800:63;;16756:117;16912:2;16938:53;16983:7;16974:6;16963:9;16959:22;16938:53;:::i;:::-;16928:63;;16883:118;16534:474;;;;;:::o;17014:180::-;17062:77;17059:1;17052:88;17159:4;17156:1;17149:15;17183:4;17180:1;17173:15;17200:320;17244:6;17281:1;17275:4;17271:12;17261:22;;17328:1;17322:4;17318:12;17349:18;17339:81;;17405:4;17397:6;17393:17;17383:27;;17339:81;17467:2;17459:6;17456:14;17436:18;17433:38;17430:84;;17486:18;;:::i;:::-;17430:84;17251:269;17200:320;;;:::o;17526:173::-;17666:25;17662:1;17654:6;17650:14;17643:49;17526:173;:::o;17705:366::-;17847:3;17868:67;17932:2;17927:3;17868:67;:::i;:::-;17861:74;;17944:93;18033:3;17944:93;:::i;:::-;18062:2;18057:3;18053:12;18046:19;;17705:366;;;:::o;18077:419::-;18243:4;18281:2;18270:9;18266:18;18258:26;;18330:9;18324:4;18320:20;18316:1;18305:9;18301:17;18294:47;18358:131;18484:4;18358:131;:::i;:::-;18350:139;;18077:419;;;:::o;18502:180::-;18550:77;18547:1;18540:88;18647:4;18644:1;18637:15;18671:4;18668:1;18661:15;18688:305;18728:3;18747:20;18765:1;18747:20;:::i;:::-;18742:25;;18781:20;18799:1;18781:20;:::i;:::-;18776:25;;18935:1;18867:66;18863:74;18860:1;18857:81;18854:107;;;18941:18;;:::i;:::-;18854:107;18985:1;18982;18978:9;18971:16;;18688:305;;;;:::o;18999:181::-;19139:33;19135:1;19127:6;19123:14;19116:57;18999:181;:::o;19186:366::-;19328:3;19349:67;19413:2;19408:3;19349:67;:::i;:::-;19342:74;;19425:93;19514:3;19425:93;:::i;:::-;19543:2;19538:3;19534:12;19527:19;;19186:366;;;:::o;19558:419::-;19724:4;19762:2;19751:9;19747:18;19739:26;;19811:9;19805:4;19801:20;19797:1;19786:9;19782:17;19775:47;19839:131;19965:4;19839:131;:::i;:::-;19831:139;;19558:419;;;:::o;19983:222::-;20123:34;20119:1;20111:6;20107:14;20100:58;20192:5;20187:2;20179:6;20175:15;20168:30;19983:222;:::o;20211:366::-;20353:3;20374:67;20438:2;20433:3;20374:67;:::i;:::-;20367:74;;20450:93;20539:3;20450:93;:::i;:::-;20568:2;20563:3;20559:12;20552:19;;20211:366;;;:::o;20583:419::-;20749:4;20787:2;20776:9;20772:18;20764:26;;20836:9;20830:4;20826:20;20822:1;20811:9;20807:17;20800:47;20864:131;20990:4;20864:131;:::i;:::-;20856:139;;20583:419;;;:::o;21008:182::-;21148:34;21144:1;21136:6;21132:14;21125:58;21008:182;:::o;21196:366::-;21338:3;21359:67;21423:2;21418:3;21359:67;:::i;:::-;21352:74;;21435:93;21524:3;21435:93;:::i;:::-;21553:2;21548:3;21544:12;21537:19;;21196:366;;;:::o;21568:419::-;21734:4;21772:2;21761:9;21757:18;21749:26;;21821:9;21815:4;21811:20;21807:1;21796:9;21792:17;21785:47;21849:131;21975:4;21849:131;:::i;:::-;21841:139;;21568:419;;;:::o;21993:170::-;22133:22;22129:1;22121:6;22117:14;22110:46;21993:170;:::o;22169:366::-;22311:3;22332:67;22396:2;22391:3;22332:67;:::i;:::-;22325:74;;22408:93;22497:3;22408:93;:::i;:::-;22526:2;22521:3;22517:12;22510:19;;22169:366;;;:::o;22541:419::-;22707:4;22745:2;22734:9;22730:18;22722:26;;22794:9;22788:4;22784:20;22780:1;22769:9;22765:17;22758:47;22822:131;22948:4;22822:131;:::i;:::-;22814:139;;22541:419;;;:::o;22966:180::-;23014:77;23011:1;23004:88;23111:4;23108:1;23101:15;23135:4;23132:1;23125:15;23152:233;23191:3;23214:24;23232:5;23214:24;:::i;:::-;23205:33;;23260:66;23253:5;23250:77;23247:103;;23330:18;;:::i;:::-;23247:103;23377:1;23370:5;23366:13;23359:20;;23152:233;;;:::o;23391:181::-;23531:33;23527:1;23519:6;23515:14;23508:57;23391:181;:::o;23578:366::-;23720:3;23741:67;23805:2;23800:3;23741:67;:::i;:::-;23734:74;;23817:93;23906:3;23817:93;:::i;:::-;23935:2;23930:3;23926:12;23919:19;;23578:366;;;:::o;23950:419::-;24116:4;24154:2;24143:9;24139:18;24131:26;;24203:9;24197:4;24193:20;24189:1;24178:9;24174:17;24167:47;24231:131;24357:4;24231:131;:::i;:::-;24223:139;;23950:419;;;:::o;24375:147::-;24476:11;24513:3;24498:18;;24375:147;;;;:::o;24528:114::-;;:::o;24648:398::-;24807:3;24828:83;24909:1;24904:3;24828:83;:::i;:::-;24821:90;;24920:93;25009:3;24920:93;:::i;:::-;25038:1;25033:3;25029:11;25022:18;;24648:398;;;:::o;25052:379::-;25236:3;25258:147;25401:3;25258:147;:::i;:::-;25251:154;;25422:3;25415:10;;25052:379;;;:::o;25437:176::-;25577:28;25573:1;25565:6;25561:14;25554:52;25437:176;:::o;25619:366::-;25761:3;25782:67;25846:2;25841:3;25782:67;:::i;:::-;25775:74;;25858:93;25947:3;25858:93;:::i;:::-;25976:2;25971:3;25967:12;25960:19;;25619:366;;;:::o;25991:419::-;26157:4;26195:2;26184:9;26180:18;26172:26;;26244:9;26238:4;26234:20;26230:1;26219:9;26215:17;26208:47;26272:131;26398:4;26272:131;:::i;:::-;26264:139;;25991:419;;;:::o;26416:221::-;26556:34;26552:1;26544:6;26540:14;26533:58;26625:4;26620:2;26612:6;26608:15;26601:29;26416:221;:::o;26643:366::-;26785:3;26806:67;26870:2;26865:3;26806:67;:::i;:::-;26799:74;;26882:93;26971:3;26882:93;:::i;:::-;27000:2;26995:3;26991:12;26984:19;;26643:366;;;:::o;27015:419::-;27181:4;27219:2;27208:9;27204:18;27196:26;;27268:9;27262:4;27258:20;27254:1;27243:9;27239:17;27232:47;27296:131;27422:4;27296:131;:::i;:::-;27288:139;;27015:419;;;:::o;27440:224::-;27580:34;27576:1;27568:6;27564:14;27557:58;27649:7;27644:2;27636:6;27632:15;27625:32;27440:224;:::o;27670:366::-;27812:3;27833:67;27897:2;27892:3;27833:67;:::i;:::-;27826:74;;27909:93;27998:3;27909:93;:::i;:::-;28027:2;28022:3;28018:12;28011:19;;27670:366;;;:::o;28042:419::-;28208:4;28246:2;28235:9;28231:18;28223:26;;28295:9;28289:4;28285:20;28281:1;28270:9;28266:17;28259:47;28323:131;28449:4;28323:131;:::i;:::-;28315:139;;28042:419;;;:::o;28467:348::-;28507:7;28530:20;28548:1;28530:20;:::i;:::-;28525:25;;28564:20;28582:1;28564:20;:::i;:::-;28559:25;;28752:1;28684:66;28680:74;28677:1;28674:81;28669:1;28662:9;28655:17;28651:105;28648:131;;;28759:18;;:::i;:::-;28648:131;28807:1;28804;28800:9;28789:20;;28467:348;;;;:::o;28821:169::-;28961:21;28957:1;28949:6;28945:14;28938:45;28821:169;:::o;28996:366::-;29138:3;29159:67;29223:2;29218:3;29159:67;:::i;:::-;29152:74;;29235:93;29324:3;29235:93;:::i;:::-;29353:2;29348:3;29344:12;29337:19;;28996:366;;;:::o;29368:419::-;29534:4;29572:2;29561:9;29557:18;29549:26;;29621:9;29615:4;29611:20;29607:1;29596:9;29592:17;29585:47;29649:131;29775:4;29649:131;:::i;:::-;29641:139;;29368:419;;;:::o;29793:235::-;29933:34;29929:1;29921:6;29917:14;29910:58;30002:18;29997:2;29989:6;29985:15;29978:43;29793:235;:::o;30034:366::-;30176:3;30197:67;30261:2;30256:3;30197:67;:::i;:::-;30190:74;;30273:93;30362:3;30273:93;:::i;:::-;30391:2;30386:3;30382:12;30375:19;;30034:366;;;:::o;30406:419::-;30572:4;30610:2;30599:9;30595:18;30587:26;;30659:9;30653:4;30649:20;30645:1;30634:9;30630:17;30623:47;30687:131;30813:4;30687:131;:::i;:::-;30679:139;;30406:419;;;:::o;30831:148::-;30933:11;30970:3;30955:18;;30831:148;;;;:::o;30985:377::-;31091:3;31119:39;31152:5;31119:39;:::i;:::-;31174:89;31256:6;31251:3;31174:89;:::i;:::-;31167:96;;31272:52;31317:6;31312:3;31305:4;31298:5;31294:16;31272:52;:::i;:::-;31349:6;31344:3;31340:16;31333:23;;31095:267;30985:377;;;;:::o;31368:141::-;31417:4;31440:3;31432:11;;31463:3;31460:1;31453:14;31497:4;31494:1;31484:18;31476:26;;31368:141;;;:::o;31539:845::-;31642:3;31679:5;31673:12;31708:36;31734:9;31708:36;:::i;:::-;31760:89;31842:6;31837:3;31760:89;:::i;:::-;31753:96;;31880:1;31869:9;31865:17;31896:1;31891:137;;;;32042:1;32037:341;;;;31858:520;;31891:137;31975:4;31971:9;31960;31956:25;31951:3;31944:38;32011:6;32006:3;32002:16;31995:23;;31891:137;;32037:341;32104:38;32136:5;32104:38;:::i;:::-;32164:1;32178:154;32192:6;32189:1;32186:13;32178:154;;;32266:7;32260:14;32256:1;32251:3;32247:11;32240:35;32316:1;32307:7;32303:15;32292:26;;32214:4;32211:1;32207:12;32202:17;;32178:154;;;32361:6;32356:3;32352:16;32345:23;;32044:334;;31858:520;;31646:738;;31539:845;;;;:::o;32390:589::-;32615:3;32637:95;32728:3;32719:6;32637:95;:::i;:::-;32630:102;;32749:95;32840:3;32831:6;32749:95;:::i;:::-;32742:102;;32861:92;32949:3;32940:6;32861:92;:::i;:::-;32854:99;;32970:3;32963:10;;32390:589;;;;;;:::o;32985:225::-;33125:34;33121:1;33113:6;33109:14;33102:58;33194:8;33189:2;33181:6;33177:15;33170:33;32985:225;:::o;33216:366::-;33358:3;33379:67;33443:2;33438:3;33379:67;:::i;:::-;33372:74;;33455:93;33544:3;33455:93;:::i;:::-;33573:2;33568:3;33564:12;33557:19;;33216:366;;;:::o;33588:419::-;33754:4;33792:2;33781:9;33777:18;33769:26;;33841:9;33835:4;33831:20;33827:1;33816:9;33812:17;33805:47;33869:131;33995:4;33869:131;:::i;:::-;33861:139;;33588:419;;;:::o;34013:332::-;34134:4;34172:2;34161:9;34157:18;34149:26;;34185:71;34253:1;34242:9;34238:17;34229:6;34185:71;:::i;:::-;34266:72;34334:2;34323:9;34319:18;34310:6;34266:72;:::i;:::-;34013:332;;;;;:::o;34351:137::-;34405:5;34436:6;34430:13;34421:22;;34452:30;34476:5;34452:30;:::i;:::-;34351:137;;;;:::o;34494:345::-;34561:6;34610:2;34598:9;34589:7;34585:23;34581:32;34578:119;;;34616:79;;:::i;:::-;34578:119;34736:1;34761:61;34814:7;34805:6;34794:9;34790:22;34761:61;:::i;:::-;34751:71;;34707:125;34494:345;;;;:::o;34845:180::-;34893:77;34890:1;34883:88;34990:4;34987:1;34980:15;35014:4;35011:1;35004:15;35031:185;35071:1;35088:20;35106:1;35088:20;:::i;:::-;35083:25;;35122:20;35140:1;35122:20;:::i;:::-;35117:25;;35161:1;35151:35;;35166:18;;:::i;:::-;35151:35;35208:1;35205;35201:9;35196:14;;35031:185;;;;:::o;35222:191::-;35262:4;35282:20;35300:1;35282:20;:::i;:::-;35277:25;;35316:20;35334:1;35316:20;:::i;:::-;35311:25;;35355:1;35352;35349:8;35346:34;;;35360:18;;:::i;:::-;35346:34;35405:1;35402;35398:9;35390:17;;35222:191;;;;:::o;35419:176::-;35451:1;35468:20;35486:1;35468:20;:::i;:::-;35463:25;;35502:20;35520:1;35502:20;:::i;:::-;35497:25;;35541:1;35531:35;;35546:18;;:::i;:::-;35531:35;35587:1;35584;35580:9;35575:14;;35419:176;;;;:::o;35601:98::-;35652:6;35686:5;35680:12;35670:22;;35601:98;;;:::o;35705:168::-;35788:11;35822:6;35817:3;35810:19;35862:4;35857:3;35853:14;35838:29;;35705:168;;;;:::o;35879:360::-;35965:3;35993:38;36025:5;35993:38;:::i;:::-;36047:70;36110:6;36105:3;36047:70;:::i;:::-;36040:77;;36126:52;36171:6;36166:3;36159:4;36152:5;36148:16;36126:52;:::i;:::-;36203:29;36225:6;36203:29;:::i;:::-;36198:3;36194:39;36187:46;;35969:270;35879:360;;;;:::o;36245:640::-;36440:4;36478:3;36467:9;36463:19;36455:27;;36492:71;36560:1;36549:9;36545:17;36536:6;36492:71;:::i;:::-;36573:72;36641:2;36630:9;36626:18;36617:6;36573:72;:::i;:::-;36655;36723:2;36712:9;36708:18;36699:6;36655:72;:::i;:::-;36774:9;36768:4;36764:20;36759:2;36748:9;36744:18;36737:48;36802:76;36873:4;36864:6;36802:76;:::i;:::-;36794:84;;36245:640;;;;;;;:::o;36891:141::-;36947:5;36978:6;36972:13;36963:22;;36994:32;37020:5;36994:32;:::i;:::-;36891:141;;;;:::o;37038:349::-;37107:6;37156:2;37144:9;37135:7;37131:23;37127:32;37124:119;;;37162:79;;:::i;:::-;37124:119;37282:1;37307:63;37362:7;37353:6;37342:9;37338:22;37307:63;:::i;:::-;37297:73;;37253:127;37038:349;;;;:::o
Swarm Source
ipfs://c0893bf11e41355f7e2e63e691170f2f31647379ed9a3930347770d377b673c2
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.