More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,507 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21244613 | 4 days ago | IN | 0 ETH | 0.00068794 | ||||
Set Approval For... | 21236430 | 5 days ago | IN | 0 ETH | 0.00159069 | ||||
Set Approval For... | 20886616 | 54 days ago | IN | 0 ETH | 0.00050248 | ||||
Set Approval For... | 20593738 | 95 days ago | IN | 0 ETH | 0.00013496 | ||||
Set Approval For... | 20587793 | 95 days ago | IN | 0 ETH | 0.00006141 | ||||
Set Approval For... | 20587730 | 95 days ago | IN | 0 ETH | 0.00004637 | ||||
Safe Transfer Fr... | 20587730 | 95 days ago | IN | 0 ETH | 0.00003081 | ||||
Safe Transfer Fr... | 20587730 | 95 days ago | IN | 0 ETH | 0.00006601 | ||||
Set Approval For... | 20440181 | 116 days ago | IN | 0 ETH | 0.00014162 | ||||
Set Approval For... | 20068629 | 168 days ago | IN | 0 ETH | 0.00051209 | ||||
Set Approval For... | 20011051 | 176 days ago | IN | 0 ETH | 0.00022002 | ||||
Transfer From | 19874951 | 195 days ago | IN | 0 ETH | 0.0002171 | ||||
Transfer From | 19874943 | 195 days ago | IN | 0 ETH | 0.00021445 | ||||
Transfer From | 19874917 | 195 days ago | IN | 0 ETH | 0.00037328 | ||||
Set Approval For... | 19747844 | 213 days ago | IN | 0 ETH | 0.00027979 | ||||
Set Approval For... | 19739238 | 214 days ago | IN | 0 ETH | 0.00017334 | ||||
Set Approval For... | 19739236 | 214 days ago | IN | 0 ETH | 0.0003274 | ||||
Set Approval For... | 19619127 | 231 days ago | IN | 0 ETH | 0.00219445 | ||||
Set Approval For... | 19554138 | 240 days ago | IN | 0 ETH | 0.00103104 | ||||
Set Approval For... | 19519624 | 245 days ago | IN | 0 ETH | 0.00254618 | ||||
Set Approval For... | 19507075 | 246 days ago | IN | 0 ETH | 0.00100191 | ||||
Set Approval For... | 19507060 | 246 days ago | IN | 0 ETH | 0.00104205 | ||||
Transfer From | 19506837 | 247 days ago | IN | 0 ETH | 0.00116451 | ||||
Set Approval For... | 19506606 | 247 days ago | IN | 0 ETH | 0.000889 | ||||
Set Approval For... | 19486077 | 249 days ago | IN | 0 ETH | 0.00116006 |
Loading...
Loading
Contract Name:
nft
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-01 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/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); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/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: contracts/creepies.sol pragma solidity >=0.8.2; // to enable certain compiler features //import '@openzeppelin/contracts/token/ERC721/ERC721.sol'; contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; //Mapping para atribuirle un URI para cada token mapping(uint256 => string) internal id_to_URI; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {} /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } contract nft is ERC721, Ownable { using Strings for uint256; //amount of tokens that have been minted so far, in total and in presale uint256 private numberOfTokensPresale1; uint256 private numberOfTokensPresale2; uint256 private numberOfTokensWhitelist; uint256 private numberOfTotalTokens; //declares the maximum amount of tokens that can be minted, total and in presale uint256 private maxTokensPresale1 = 70; uint256 private maxTokensPresale2 = 930; uint256 private maxTokensWhitelist = 2600; uint256 private maxTotalTokens; //initial part of the URI for the metadata string private _currentBaseURI; //cost of mints depending on state of sale uint private mintCostPresale2 = 0.1 ether; uint private mintCostWhitelistSale = 0.2 ether; uint private mintCostPublicSale = 0.25 ether; //maximum amount of mints allowed per person uint256 private maxMintPresale1 = 1; uint256 private maxMintRest = 10; //the amount of reserved mints that have currently been executed by creator and by marketing wallet uint private _reservedMintsMarketing = 0; uint private _reservedMintsTeam = 0; //the maximum amount of reserved mints allowed for creator and marketing wallet uint private maxReservedMintsMarketing = 999; uint private maxReservedMintsTeam = 400; //dummy address that we use to sign the mint transaction to make sure it is valid address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c; //marks the timestamp of when the respective sales open uint256 internal presale1LaunchTime; uint256 internal presale2LaunchTime; uint256 internal whitelistLaunchTime; uint256 internal publicSaleLaunchTime; //amount of mints that each address has executed mapping(address => uint256) public mintsPerAddress; //current state os sale enum State {NoSale, Presale1, Presale2, WhitelistSale, PublicSale} //declaring initial values for variables constructor() ERC721('Digits Club', 'DC') { numberOfTotalTokens = 0; maxTotalTokens = 9999; _currentBaseURI = "ipfs://Qmf1fg9b6LkrFehZYNeNjPRNCQdqW6AMg59BeR8HfB7LBB/"; } //in case somebody accidentaly sends funds or transaction to contract receive() payable external {} fallback() payable external { revert(); } //visualize baseURI function _baseURI() internal view virtual override returns (string memory) { return _currentBaseURI; } //change baseURI in case needed for IPFS function changeBaseURI(string memory baseURI_) public onlyOwner { _currentBaseURI = baseURI_; } //gets the tokenID of NFT to be minted function tokenId() internal view returns(uint256) { uint currentId = totalSupply(); bool exists = true; while (exists) { currentId += 1; exists = _exists(currentId); } return currentId; } function openPresale1() public onlyOwner { require(saleState() == State.NoSale, 'Current State has to be No Sale!'); presale1LaunchTime = block.timestamp; } function openPresale2() public onlyOwner { require(saleState() == State.Presale1, 'Current State has to be Presale1!'); presale2LaunchTime = block.timestamp; } function openWhitelist() public onlyOwner { require(saleState() == State.Presale2, 'Current State has to be Presale2!'); whitelistLaunchTime = block.timestamp; } function openPublicSale() public onlyOwner { require(saleState() == State.WhitelistSale, 'Current State has to be Whitelist Sale!'); publicSaleLaunchTime = block.timestamp; } modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) { require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' ); _; } /* * @dev Verifies if message was signed by owner to give access to _add for this contract. * Assumes Geth signature prefix. * @param _add Address of agent with access * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. * @return Validity of access message for a given address. */ function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) { bytes32 hash = keccak256(abi.encodePacked(address(this), _add)); return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s); } function presale1Mint(uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { State saleState_ = saleState(); require(saleState_ == State.Presale1, "Sale in not open!"); require(numberOfTokensPresale1 < maxTokensPresale1, "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] == 0, "Maximum Mints per Address exceeded!"); uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; } //mint a @param number of NFTs in presale function presale2Mint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { State saleState_ = saleState(); require(saleState_ == State.Presale2, "Sale in not open!"); require(numberOfTokensPresale2 + number <= maxTokensPresale2, "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMint(), "Maximum Mints per Address exceeded!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.1 ether each NFT)"); for (uint256 i = 0; i < number; i++) { uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; } } //mint a @param number of NFTs in presale function whitelistMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { State saleState_ = saleState(); require(saleState_ == State.WhitelistSale, "Sale in not open!"); require(numberOfTokensWhitelist + number <= maxTokensWhitelist, "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMint(), "Maximum Mints per Address exceeded!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.2 ether each NFT)"); for (uint256 i = 0; i < number; i++) { uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; } } //mint a @param number of NFTs in presale function publicSaleMint(uint256 number) public payable { State saleState_ = saleState(); require(saleState_ == State.PublicSale, "Sale in not open!"); require(numberOfTotalTokens + number <= maxTotalTokens - (maxReservedMintsMarketing + maxReservedMintsTeam - _reservedMintsMarketing - _reservedMintsTeam), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxMint(), "Maximum Mints per Address exceeded!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.25 ether each NFT)"); for (uint256 i = 0; i < number; i++) { uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; } } function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) { require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : ""; } //reserved mints for giveaways/team/marketing function reservedMintMarketing(uint256 number) public onlyOwner { require(_reservedMintsMarketing + number <= maxReservedMintsMarketing, "Not enough Reserved NFT left to mint.."); for (uint256 i = 0; i < number; i++) { uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; _reservedMintsMarketing += 1; } } //reserved mints for giveaways/team/marketing function reservedMintTeam(uint256 number) public onlyOwner { require(_reservedMintsTeam + number <= maxReservedMintsTeam, "Not enough Reserved NFT left to mint.."); for (uint256 i = 0; i < number; i++) { uint256 tid = tokenId(); _safeMint(msg.sender, tid); mintsPerAddress[msg.sender] += 1; numberOfTotalTokens += 1; _reservedMintsTeam += 1; } } //burn the tokens that have not been sold yet function burnTokens() public onlyOwner { maxTotalTokens = numberOfTotalTokens; } //se the current account balance function accountBalance() public onlyOwner view returns(uint) { return address(this).balance; } //retrieve all funds recieved from minting function withdraw() public onlyOwner { uint256 balance = accountBalance(); require(balance > 0, 'No Funds to withdraw, Balance is 0'); _withdraw(payable(owner()), accountBalance()); //to avoid dust eth } //send the percentage of funds to a shareholder´s wallet function _withdraw(address payable account, uint256 amount) internal { (bool sent, ) = account.call{value: amount}(""); require(sent, "Failed to send Ether"); } //change the dummy account used for signing transactions function changeDummy(address _dummy) public onlyOwner { dummy = _dummy; } //see the total amount of tokens that have been minted function totalSupply() public view returns(uint) { return numberOfTotalTokens; } //to see the total amount of reserved team mints left function reservedMintsMarketingLeft() public view returns(uint) { return maxReservedMintsMarketing - _reservedMintsMarketing; } //to see the total amount of reserved giveaway mints left function reservedMintsTeamLeft() public view returns(uint) { return maxReservedMintsTeam - _reservedMintsTeam; } //see current state of sale //see the current state of the sale function saleState() public view returns(State){ if (presale1LaunchTime == 0) { return State.NoSale; } else if (presale2LaunchTime == 0) { return State.Presale1; } else if (whitelistLaunchTime == 0) { return State.Presale2; } else if (publicSaleLaunchTime == 0) { return State.WhitelistSale; } else { return State.PublicSale; } } //gets the cost of current mint function mintCost() public view returns(uint) { State saleState_ = saleState(); if (saleState_ == State.NoSale || saleState_ == State.Presale1) { return 0; } else if (saleState_ == State.Presale2) { return mintCostPresale2; } else if (saleState_ == State.WhitelistSale) { return mintCostWhitelistSale; } else { return mintCostPublicSale; } } //shows total amount of tokens that could be minted function maxTokens() public view returns(uint) { return maxTotalTokens; } //see what the current ma mint is function maxMint() public view returns(uint) { State saleState_ = saleState(); if (saleState_ == State.NoSale || saleState_ == State.Presale1) { return maxMintPresale1; } else { return maxMintRest; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","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":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","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":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPresale1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presale1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presale2Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"reservedMintMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"reservedMintTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsMarketingLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedMintsTeamLeft","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[],"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":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526046600c556103a2600d55610a28600e5567016345785d8a00006011556702c68af0bb1400006012556703782dace9d900006013556001601455600a601555600060165560006017556103e76018556101906019557380e4929c869102140e69550bbecc20bed61b080c601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000bb57600080fd5b506040518060400160405280600b81526020017f44696769747320436c75620000000000000000000000000000000000000000008152506040518060400160405280600281526020017f444300000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200014092919062000293565b5080600190805190602001906200015992919062000293565b5050506200017c62000170620001c560201b60201c565b620001cd60201b60201c565b6000600b8190555061270f600f8190555060405180606001604052806036815260200162005a8b6036913960109080519060200190620001be92919062000293565b50620003a8565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002a19062000343565b90600052602060002090601f016020900481019282620002c5576000855562000311565b82601f10620002e057805160ff191683800117855562000311565b8280016001018555821562000311579182015b8281111562000310578251825591602001919060010190620002f3565b5b50905062000320919062000324565b5090565b5b808211156200033f57600081600090555060010162000325565b5090565b600060028204905060018216806200035c57607f821691505b6020821081141562000373576200037262000379565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6156d380620003b86000396000f3fe60806040526004361061023e5760003560e01c8063603f4d521161012e578063b3ab66b0116100ab578063dffdc03a1161006f578063dffdc03a146107de578063e831574214610809578063e985e9c514610834578063edb2160114610871578063f2fde38b1461088d57610245565b8063b3ab66b01461071a578063b585209b14610736578063b88d4fde1461074d578063bdb4b84814610776578063c87b56dd146107a157610245565b80637c55b8e6116100f25780637c55b8e6146106595780638da5cb5b1461067057806395d89b411461069b578063a22cb465146106c6578063b0a1c1c4146106ef57610245565b8063603f4d52146105725780636352211e1461059d57806370a08231146105da578063715018a6146106175780637501f7411461062e57610245565b806323b872dd116101bc5780633c2fd13a116101805780633c2fd13a146104c75780633ccfd60b146104f257806342842e0e14610509578063442fdb4e1461053257806353c28ecf1461055b57610245565b806323b872dd146103df57806325094ca4146104085780633023eba614610424578063326241141461046157806339a0c6f91461049e57610245565b8063081812fc11610203578063081812fc1461030e578063083bbe7f1461034b57806308e207b814610362578063095ea7b31461038b57806318160ddd146103b457610245565b8062a1990e1461024a5780630191a6571461026657806301ffc9a71461028f57806306fdde03146102cc57806308003f78146102f757610245565b3661024557005b600080fd5b610264600480360381019061025f9190613c3c565b6108b6565b005b34801561027257600080fd5b5061028d60048036038101906102889190613942565b610b63565b005b34801561029b57600080fd5b506102b660048036038101906102b19190613b6c565b610c23565b6040516102c391906143a1565b60405180910390f35b3480156102d857600080fd5b506102e1610d05565b6040516102ee919061441c565b60405180910390f35b34801561030357600080fd5b5061030c610d97565b005b34801561031a57600080fd5b5061033560048036038101906103309190613c0f565b610e1e565b604051610342919061433a565b60405180910390f35b34801561035757600080fd5b50610360610ea3565b005b34801561036e57600080fd5b5061038960048036038101906103849190613c0f565b610f96565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613ac5565b611128565b005b3480156103c057600080fd5b506103c9611240565b6040516103d691906147fe565b60405180910390f35b3480156103eb57600080fd5b50610406600480360381019061040191906139af565b61124a565b005b610422600480360381019061041d9190613ca3565b6112aa565b005b34801561043057600080fd5b5061044b60048036038101906104469190613942565b6114c4565b60405161045891906147fe565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190613b05565b6114dc565b60405161049591906143a1565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190613bc6565b6115da565b005b3480156104d357600080fd5b506104dc611670565b6040516104e991906147fe565b60405180910390f35b3480156104fe57600080fd5b50610507611687565b005b34801561051557600080fd5b50610530600480360381019061052b91906139af565b61176d565b005b34801561053e57600080fd5b5061055960048036038101906105549190613c0f565b61178d565b005b34801561056757600080fd5b5061057061191f565b005b34801561057e57600080fd5b50610587611a12565b6040516105949190614401565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613c0f565b611a6b565b6040516105d1919061433a565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190613942565b611b1d565b60405161060e91906147fe565b60405180910390f35b34801561062357600080fd5b5061062c611bd5565b005b34801561063a57600080fd5b50610643611c5d565b60405161065091906147fe565b60405180910390f35b34801561066557600080fd5b5061066e611cdb565b005b34801561067c57600080fd5b50610685611dce565b604051610692919061433a565b60405180910390f35b3480156106a757600080fd5b506106b0611df8565b6040516106bd919061441c565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613a85565b611e8a565b005b3480156106fb57600080fd5b5061070461200b565b60405161071191906147fe565b60405180910390f35b610734600480360381019061072f9190613c0f565b61208f565b005b34801561074257600080fd5b5061074b61231b565b005b34801561075957600080fd5b50610774600480360381019061076f9190613a02565b61240e565b005b34801561078257600080fd5b5061078b612470565b60405161079891906147fe565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c39190613c0f565b61255d565b6040516107d5919061441c565b60405180910390f35b3480156107ea57600080fd5b506107f3612604565b60405161080091906147fe565b60405180910390f35b34801561081557600080fd5b5061081e61261b565b60405161082b91906147fe565b60405180910390f35b34801561084057600080fd5b5061085b6004803603810190610856919061396f565b612625565b60405161086891906143a1565b60405180910390f35b61088b60048036038101906108869190613c3c565b6126b9565b005b34801561089957600080fd5b506108b460048036038101906108af9190613942565b612966565b005b8282826108c5338484846114dc565b610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb9061469e565b60405180910390fd5b600061090e611a12565b90506003600481111561092457610923614c5e565b5b81600481111561093757610936614c5e565b5b14610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061443e565b60405180910390fd5b600e5488600a5461098891906148ee565b11156109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c09061453e565b60405180910390fd5b6109d1611c5d565b88601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a1c91906148ee565b1115610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a549061455e565b60405180910390fd5b87610a66612470565b610a709190614975565b341015610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061479e565b60405180910390fd5b60005b88811015610b58576000610ac7612a5e565b9050610ad33382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b2391906148ee565b925050819055506001600b6000828254610b3d91906148ee565b92505081905550508080610b5090614b58565b915050610ab5565b505050505050505050565b610b6b612abd565b73ffffffffffffffffffffffffffffffffffffffff16610b89611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906146be565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfe5750610cfd82612ac5565b5b9050919050565b606060008054610d1490614af5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090614af5565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050905090565b610d9f612abd565b73ffffffffffffffffffffffffffffffffffffffff16610dbd611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906146be565b60405180910390fd5b600b54600f81905550565b6000610e2982612b2f565b610e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5f9061467e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610eab612abd565b73ffffffffffffffffffffffffffffffffffffffff16610ec9611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f16906146be565b60405180910390fd5b60026004811115610f3357610f32614c5e565b5b610f3b611a12565b6004811115610f4d57610f4c614c5e565b5b14610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849061457e565b60405180910390fd5b42601d81905550565b610f9e612abd565b73ffffffffffffffffffffffffffffffffffffffff16610fbc611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906146be565b60405180910390fd5b6018548160165461102391906148ee565b1115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061465e565b60405180910390fd5b60005b81811015611124576000611079612a5e565b90506110853382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d591906148ee565b925050819055506001600b60008282546110ef91906148ee565b9250508190555060016016600082825461110991906148ee565b9250508190555050808061111c90614b58565b915050611067565b5050565b600061113382611a6b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b9061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111c3612abd565b73ffffffffffffffffffffffffffffffffffffffff1614806111f257506111f1816111ec612abd565b612625565b5b611231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611228906145be565b60405180910390fd5b61123b8383612b9b565b505050565b6000600b54905090565b61125b611255612abd565b82612c54565b61129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061477e565b60405180910390fd5b6112a5838383612d32565b505050565b8282826112b9338484846114dc565b6112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef9061469e565b60405180910390fd5b6000611302611a12565b90506001600481111561131857611317614c5e565b5b81600481111561132b5761132a614c5e565b5b1461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113629061443e565b60405180910390fd5b600c54600854106113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061453e565b60405180910390fd5b6000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142a9061455e565b60405180910390fd5b600061143d612a5e565b90506114493382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149991906148ee565b925050819055506001600b60008282546114b391906148ee565b925050819055505050505050505050565b601f6020528060005260406000206000915090505481565b60008030866040516020016114f29291906142a4565b60405160208183030381529060405280519060200120905060018160405160200161151d91906142ff565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161155394939291906143bc565b6020604051602081039080840390855afa158015611575573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6115e2612abd565b73ffffffffffffffffffffffffffffffffffffffff16611600611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906146be565b60405180910390fd5b806010908051906020019061166c92919061372c565b5050565b600060165460185461168291906149cf565b905090565b61168f612abd565b73ffffffffffffffffffffffffffffffffffffffff166116ad611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906146be565b60405180910390fd5b600061170d61200b565b905060008111611752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611749906147be565b60405180910390fd5b61176a61175d611dce565b61176561200b565b612f8e565b50565b6117888383836040518060200160405280600081525061240e565b505050565b611795612abd565b73ffffffffffffffffffffffffffffffffffffffff166117b3611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611800906146be565b60405180910390fd5b6019548160175461181a91906148ee565b111561185b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118529061465e565b60405180910390fd5b60005b8181101561191b576000611870612a5e565b905061187c3382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cc91906148ee565b925050819055506001600b60008282546118e691906148ee565b9250508190555060016017600082825461190091906148ee565b9250508190555050808061191390614b58565b91505061185e565b5050565b611927612abd565b73ffffffffffffffffffffffffffffffffffffffff16611945611dce565b73ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906146be565b60405180910390fd5b600060048111156119af576119ae614c5e565b5b6119b7611a12565b60048111156119c9576119c8614c5e565b5b14611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906147de565b60405180910390fd5b42601b81905550565b600080601b541415611a275760009050611a68565b6000601c541415611a3b5760019050611a68565b6000601d541415611a4f5760029050611a68565b6000601e541415611a635760039050611a68565b600490505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b9061461e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906145fe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bdd612abd565b73ffffffffffffffffffffffffffffffffffffffff16611bfb611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906146be565b60405180910390fd5b611c5b600061303f565b565b600080611c68611a12565b905060006004811115611c7e57611c7d614c5e565b5b816004811115611c9157611c90614c5e565b5b1480611cc1575060016004811115611cac57611cab614c5e565b5b816004811115611cbf57611cbe614c5e565b5b145b15611cd157601454915050611cd8565b6015549150505b90565b611ce3612abd565b73ffffffffffffffffffffffffffffffffffffffff16611d01611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e906146be565b60405180910390fd5b60016004811115611d6b57611d6a614c5e565b5b611d73611a12565b6004811115611d8557611d84614c5e565b5b14611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906144be565b60405180910390fd5b42601c81905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e0790614af5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3390614af5565b8015611e805780601f10611e5557610100808354040283529160200191611e80565b820191906000526020600020905b815481529060010190602001808311611e6357829003601f168201915b5050505050905090565b611e92612abd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef79061451e565b60405180910390fd5b8060056000611f0d612abd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fba612abd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fff91906143a1565b60405180910390a35050565b6000612015612abd565b73ffffffffffffffffffffffffffffffffffffffff16612033611dce565b73ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612080906146be565b60405180910390fd5b47905090565b6000612099611a12565b90506004808111156120ae576120ad614c5e565b5b8160048111156120c1576120c0614c5e565b5b14612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061443e565b60405180910390fd5b60175460165460195460185461211791906148ee565b61212191906149cf565b61212b91906149cf565b600f5461213891906149cf565b82600b5461214691906148ee565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e9061453e565b60405180910390fd5b61218f611c5d565b82601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121da91906148ee565b111561221b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122129061455e565b60405180910390fd5b81612224612470565b61222e9190614975565b341015612270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612267906145de565b60405180910390fd5b60005b82811015612316576000612285612a5e565b90506122913382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e191906148ee565b925050819055506001600b60008282546122fb91906148ee565b9250508190555050808061230e90614b58565b915050612273565b505050565b612323612abd565b73ffffffffffffffffffffffffffffffffffffffff16612341611dce565b73ffffffffffffffffffffffffffffffffffffffff1614612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e906146be565b60405180910390fd5b600360048111156123ab576123aa614c5e565b5b6123b3611a12565b60048111156123c5576123c4614c5e565b5b14612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061475e565b60405180910390fd5b42601e81905550565b61241f612419612abd565b83612c54565b61245e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124559061477e565b60405180910390fd5b61246a84848484613105565b50505050565b60008061247b611a12565b90506000600481111561249157612490614c5e565b5b8160048111156124a4576124a3614c5e565b5b14806124d45750600160048111156124bf576124be614c5e565b5b8160048111156124d2576124d1614c5e565b5b145b156124e357600091505061255a565b600260048111156124f7576124f6614c5e565b5b81600481111561250a57612509614c5e565b5b141561251b5760115491505061255a565b6003600481111561252f5761252e614c5e565b5b81600481111561254257612541614c5e565b5b14156125535760125491505061255a565b6013549150505b90565b606061256882612b2f565b6125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e906146fe565b60405180910390fd5b60006125b1613161565b905060008151116125d157604051806020016040528060008152506125fc565b806125db846131f3565b6040516020016125ec9291906142d0565b6040516020818303038152906040525b915050919050565b600060175460195461261691906149cf565b905090565b6000600f54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8282826126c8338484846114dc565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061469e565b60405180910390fd5b6000612711611a12565b90506002600481111561272757612726614c5e565b5b81600481111561273a57612739614c5e565b5b1461277a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127719061443e565b60405180910390fd5b600d548860095461278b91906148ee565b11156127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c39061453e565b60405180910390fd5b6127d4611c5d565b88601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281f91906148ee565b1115612860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128579061455e565b60405180910390fd5b87612869612470565b6128739190614975565b3410156128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ac9061471e565b60405180910390fd5b60005b8881101561295b5760006128ca612a5e565b90506128d63382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292691906148ee565b925050819055506001600b600082825461294091906148ee565b9250508190555050808061295390614b58565b9150506128b8565b505050505050505050565b61296e612abd565b73ffffffffffffffffffffffffffffffffffffffff1661298c611dce565b73ffffffffffffffffffffffffffffffffffffffff16146129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d9906146be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a499061447e565b60405180910390fd5b612a5b8161303f565b50565b600080612a69611240565b90506000600190505b8015612a9757600182612a8591906148ee565b9150612a9082612b2f565b9050612a72565b819250505090565b612ab9828260405180602001604052806000815250613354565b5050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c0e83611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c5f82612b2f565b612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c959061459e565b60405180910390fd5b6000612ca983611a6b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d1857508373ffffffffffffffffffffffffffffffffffffffff16612d0084610e1e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d295750612d288185612625565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d5282611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f906146de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f906144fe565b60405180910390fd5b612e238383836133af565b612e2e600082612b9b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906149cf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed591906148ee565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612fb490614325565b60006040518083038185875af1925050503d8060008114612ff1576040519150601f19603f3d011682016040523d82523d6000602084013e612ff6565b606091505b505090508061303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906144de565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613110848484612d32565b61311c848484846133b4565b61315b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131529061445e565b60405180910390fd5b50505050565b60606010805461317090614af5565b80601f016020809104026020016040519081016040528092919081815260200182805461319c90614af5565b80156131e95780601f106131be576101008083540402835291602001916131e9565b820191906000526020600020905b8154815290600101906020018083116131cc57829003601f168201915b5050505050905090565b6060600082141561323b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061334f565b600082905060005b6000821461326d57808061325690614b58565b915050600a826132669190614944565b9150613243565b60008167ffffffffffffffff81111561328957613288614ceb565b5b6040519080825280601f01601f1916602001820160405280156132bb5781602001600182028036833780820191505090505b5090505b60008514613348576001826132d491906149cf565b9150600a856132e39190614bcf565b60306132ef91906148ee565b60f81b81838151811061330557613304614cbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133419190614944565b94506132bf565b8093505050505b919050565b61335e838361354b565b61336b60008484846133b4565b6133aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a19061445e565b60405180910390fd5b505050565b505050565b60006133d58473ffffffffffffffffffffffffffffffffffffffff16613719565b1561353e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133fe612abd565b8786866040518563ffffffff1660e01b81526004016134209493929190614355565b602060405180830381600087803b15801561343a57600080fd5b505af192505050801561346b57506040513d601f19601f820116820180604052508101906134689190613b99565b60015b6134ee573d806000811461349b576040519150601f19603f3d011682016040523d82523d6000602084013e6134a0565b606091505b506000815114156134e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dd9061445e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613543565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b29061463e565b60405180910390fd5b6135c481612b2f565b15613604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fb9061449e565b60405180910390fd5b613610600083836133af565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461366091906148ee565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461373890614af5565b90600052602060002090601f01602090048101928261375a57600085556137a1565b82601f1061377357805160ff19168380011785556137a1565b828001600101855582156137a1579182015b828111156137a0578251825591602001919060010190613785565b5b5090506137ae91906137b2565b5090565b5b808211156137cb5760008160009055506001016137b3565b5090565b60006137e26137dd8461483e565b614819565b9050828152602081018484840111156137fe576137fd614d1f565b5b613809848285614ab3565b509392505050565b600061382461381f8461486f565b614819565b9050828152602081018484840111156138405761383f614d1f565b5b61384b848285614ab3565b509392505050565b60008135905061386281615613565b92915050565b6000813590506138778161562a565b92915050565b60008135905061388c81615641565b92915050565b6000813590506138a181615658565b92915050565b6000815190506138b681615658565b92915050565b600082601f8301126138d1576138d0614d1a565b5b81356138e18482602086016137cf565b91505092915050565b600082601f8301126138ff576138fe614d1a565b5b813561390f848260208601613811565b91505092915050565b6000813590506139278161566f565b92915050565b60008135905061393c81615686565b92915050565b60006020828403121561395857613957614d29565b5b600061396684828501613853565b91505092915050565b6000806040838503121561398657613985614d29565b5b600061399485828601613853565b92505060206139a585828601613853565b9150509250929050565b6000806000606084860312156139c8576139c7614d29565b5b60006139d686828701613853565b93505060206139e786828701613853565b92505060406139f886828701613918565b9150509250925092565b60008060008060808587031215613a1c57613a1b614d29565b5b6000613a2a87828801613853565b9450506020613a3b87828801613853565b9350506040613a4c87828801613918565b925050606085013567ffffffffffffffff811115613a6d57613a6c614d24565b5b613a79878288016138bc565b91505092959194509250565b60008060408385031215613a9c57613a9b614d29565b5b6000613aaa85828601613853565b9250506020613abb85828601613868565b9150509250929050565b60008060408385031215613adc57613adb614d29565b5b6000613aea85828601613853565b9250506020613afb85828601613918565b9150509250929050565b60008060008060808587031215613b1f57613b1e614d29565b5b6000613b2d87828801613853565b9450506020613b3e8782880161392d565b9350506040613b4f8782880161387d565b9250506060613b608782880161387d565b91505092959194509250565b600060208284031215613b8257613b81614d29565b5b6000613b9084828501613892565b91505092915050565b600060208284031215613baf57613bae614d29565b5b6000613bbd848285016138a7565b91505092915050565b600060208284031215613bdc57613bdb614d29565b5b600082013567ffffffffffffffff811115613bfa57613bf9614d24565b5b613c06848285016138ea565b91505092915050565b600060208284031215613c2557613c24614d29565b5b6000613c3384828501613918565b91505092915050565b60008060008060808587031215613c5657613c55614d29565b5b6000613c6487828801613918565b9450506020613c758782880161392d565b9350506040613c868782880161387d565b9250506060613c978782880161387d565b91505092959194509250565b600080600060608486031215613cbc57613cbb614d29565b5b6000613cca8682870161392d565b9350506020613cdb8682870161387d565b9250506040613cec8682870161387d565b9150509250925092565b613cff81614a03565b82525050565b613d16613d1182614a03565b614ba1565b82525050565b613d2581614a15565b82525050565b613d3481614a21565b82525050565b613d4b613d4682614a21565b614bb3565b82525050565b6000613d5c826148a0565b613d6681856148b6565b9350613d76818560208601614ac2565b613d7f81614d2e565b840191505092915050565b613d9381614aa1565b82525050565b6000613da4826148ab565b613dae81856148d2565b9350613dbe818560208601614ac2565b613dc781614d2e565b840191505092915050565b6000613ddd826148ab565b613de781856148e3565b9350613df7818560208601614ac2565b80840191505092915050565b6000613e106011836148d2565b9150613e1b82614d4c565b602082019050919050565b6000613e33601c836148e3565b9150613e3e82614d75565b601c82019050919050565b6000613e566032836148d2565b9150613e6182614d9e565b604082019050919050565b6000613e796026836148d2565b9150613e8482614ded565b604082019050919050565b6000613e9c601c836148d2565b9150613ea782614e3c565b602082019050919050565b6000613ebf6021836148d2565b9150613eca82614e65565b604082019050919050565b6000613ee26014836148d2565b9150613eed82614eb4565b602082019050919050565b6000613f056024836148d2565b9150613f1082614edd565b604082019050919050565b6000613f286019836148d2565b9150613f3382614f2c565b602082019050919050565b6000613f4b601e836148d2565b9150613f5682614f55565b602082019050919050565b6000613f6e6023836148d2565b9150613f7982614f7e565b604082019050919050565b6000613f916021836148d2565b9150613f9c82614fcd565b604082019050919050565b6000613fb4602c836148d2565b9150613fbf8261501c565b604082019050919050565b6000613fd76038836148d2565b9150613fe28261506b565b604082019050919050565b6000613ffa604d836148d2565b9150614005826150ba565b606082019050919050565b600061401d602a836148d2565b91506140288261512f565b604082019050919050565b60006140406029836148d2565b915061404b8261517e565b604082019050919050565b60006140636020836148d2565b915061406e826151cd565b602082019050919050565b60006140866026836148d2565b9150614091826151f6565b604082019050919050565b60006140a9602c836148d2565b91506140b482615245565b604082019050919050565b60006140cc6005836148e3565b91506140d782615294565b600582019050919050565b60006140ef6011836148d2565b91506140fa826152bd565b602082019050919050565b60006141126020836148d2565b915061411d826152e6565b602082019050919050565b60006141356029836148d2565b91506141408261530f565b604082019050919050565b6000614158602f836148d2565b91506141638261535e565b604082019050919050565b600061417b604c836148d2565b9150614186826153ad565b606082019050919050565b600061419e6021836148d2565b91506141a982615422565b604082019050919050565b60006141c16027836148d2565b91506141cc82615471565b604082019050919050565b60006141e46000836148c7565b91506141ef826154c0565b600082019050919050565b60006142076031836148d2565b9150614212826154c3565b604082019050919050565b600061422a604c836148d2565b915061423582615512565b606082019050919050565b600061424d6022836148d2565b915061425882615587565b604082019050919050565b60006142706020836148d2565b915061427b826155d6565b602082019050919050565b61428f81614a8a565b82525050565b61429e81614a94565b82525050565b60006142b08285613d05565b6014820191506142c08284613d05565b6014820191508190509392505050565b60006142dc8285613dd2565b91506142e88284613dd2565b91506142f3826140bf565b91508190509392505050565b600061430a82613e26565b91506143168284613d3a565b60208201915081905092915050565b6000614330826141d7565b9150819050919050565b600060208201905061434f6000830184613cf6565b92915050565b600060808201905061436a6000830187613cf6565b6143776020830186613cf6565b6143846040830185614286565b81810360608301526143968184613d51565b905095945050505050565b60006020820190506143b66000830184613d1c565b92915050565b60006080820190506143d16000830187613d2b565b6143de6020830186614295565b6143eb6040830185613d2b565b6143f86060830184613d2b565b95945050505050565b60006020820190506144166000830184613d8a565b92915050565b600060208201905081810360008301526144368184613d99565b905092915050565b6000602082019050818103600083015261445781613e03565b9050919050565b6000602082019050818103600083015261447781613e49565b9050919050565b6000602082019050818103600083015261449781613e6c565b9050919050565b600060208201905081810360008301526144b781613e8f565b9050919050565b600060208201905081810360008301526144d781613eb2565b9050919050565b600060208201905081810360008301526144f781613ed5565b9050919050565b6000602082019050818103600083015261451781613ef8565b9050919050565b6000602082019050818103600083015261453781613f1b565b9050919050565b6000602082019050818103600083015261455781613f3e565b9050919050565b6000602082019050818103600083015261457781613f61565b9050919050565b6000602082019050818103600083015261459781613f84565b9050919050565b600060208201905081810360008301526145b781613fa7565b9050919050565b600060208201905081810360008301526145d781613fca565b9050919050565b600060208201905081810360008301526145f781613fed565b9050919050565b6000602082019050818103600083015261461781614010565b9050919050565b6000602082019050818103600083015261463781614033565b9050919050565b6000602082019050818103600083015261465781614056565b9050919050565b6000602082019050818103600083015261467781614079565b9050919050565b600060208201905081810360008301526146978161409c565b9050919050565b600060208201905081810360008301526146b7816140e2565b9050919050565b600060208201905081810360008301526146d781614105565b9050919050565b600060208201905081810360008301526146f781614128565b9050919050565b600060208201905081810360008301526147178161414b565b9050919050565b600060208201905081810360008301526147378161416e565b9050919050565b6000602082019050818103600083015261475781614191565b9050919050565b60006020820190508181036000830152614777816141b4565b9050919050565b60006020820190508181036000830152614797816141fa565b9050919050565b600060208201905081810360008301526147b78161421d565b9050919050565b600060208201905081810360008301526147d781614240565b9050919050565b600060208201905081810360008301526147f781614263565b9050919050565b60006020820190506148136000830184614286565b92915050565b6000614823614834565b905061482f8282614b27565b919050565b6000604051905090565b600067ffffffffffffffff82111561485957614858614ceb565b5b61486282614d2e565b9050602081019050919050565b600067ffffffffffffffff82111561488a57614889614ceb565b5b61489382614d2e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f982614a8a565b915061490483614a8a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493957614938614c00565b5b828201905092915050565b600061494f82614a8a565b915061495a83614a8a565b92508261496a57614969614c2f565b5b828204905092915050565b600061498082614a8a565b915061498b83614a8a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c4576149c3614c00565b5b828202905092915050565b60006149da82614a8a565b91506149e583614a8a565b9250828210156149f8576149f7614c00565b5b828203905092915050565b6000614a0e82614a6a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614a65826155ff565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614aac82614a57565b9050919050565b82818337600083830152505050565b60005b83811015614ae0578082015181840152602081019050614ac5565b83811115614aef576000848401525b50505050565b60006002820490506001821680614b0d57607f821691505b60208210811415614b2157614b20614c8d565b5b50919050565b614b3082614d2e565b810181811067ffffffffffffffff82111715614b4f57614b4e614ceb565b5b80604052505050565b6000614b6382614a8a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9657614b95614c00565b5b600182019050919050565b6000614bac82614bbd565b9050919050565b6000819050919050565b6000614bc882614d3f565b9050919050565b6000614bda82614a8a565b9150614be583614a8a565b925082614bf557614bf4614c2f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f53616c6520696e206e6f74206f70656e21000000000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43757272656e742053746174652068617320746f2062652050726573616c653160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4d6178696d756d204d696e74732070657220416464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f2062652050726573616c653260008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e323520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f756768205265736572766564204e4654206c65667420746f2060008201527f6d696e742e2e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e312065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f2062652057686974656c697360008201527f742053616c652100000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f206265204e6f2053616c6521600082015250565b600581106156105761560f614c5e565b5b50565b61561c81614a03565b811461562757600080fd5b50565b61563381614a15565b811461563e57600080fd5b50565b61564a81614a21565b811461565557600080fd5b50565b61566181614a2b565b811461566c57600080fd5b50565b61567881614a8a565b811461568357600080fd5b50565b61568f81614a94565b811461569a57600080fd5b5056fea26469706673582212204153a9a1415440b5c35c120c7beb466a9779dc38e525e309b5b94fd524da826464736f6c63430008070033697066733a2f2f516d663166673962364c6b724665685a594e654e6a50524e435164715736414d67353942655238486642374c42422f
Deployed Bytecode
0x60806040526004361061023e5760003560e01c8063603f4d521161012e578063b3ab66b0116100ab578063dffdc03a1161006f578063dffdc03a146107de578063e831574214610809578063e985e9c514610834578063edb2160114610871578063f2fde38b1461088d57610245565b8063b3ab66b01461071a578063b585209b14610736578063b88d4fde1461074d578063bdb4b84814610776578063c87b56dd146107a157610245565b80637c55b8e6116100f25780637c55b8e6146106595780638da5cb5b1461067057806395d89b411461069b578063a22cb465146106c6578063b0a1c1c4146106ef57610245565b8063603f4d52146105725780636352211e1461059d57806370a08231146105da578063715018a6146106175780637501f7411461062e57610245565b806323b872dd116101bc5780633c2fd13a116101805780633c2fd13a146104c75780633ccfd60b146104f257806342842e0e14610509578063442fdb4e1461053257806353c28ecf1461055b57610245565b806323b872dd146103df57806325094ca4146104085780633023eba614610424578063326241141461046157806339a0c6f91461049e57610245565b8063081812fc11610203578063081812fc1461030e578063083bbe7f1461034b57806308e207b814610362578063095ea7b31461038b57806318160ddd146103b457610245565b8062a1990e1461024a5780630191a6571461026657806301ffc9a71461028f57806306fdde03146102cc57806308003f78146102f757610245565b3661024557005b600080fd5b610264600480360381019061025f9190613c3c565b6108b6565b005b34801561027257600080fd5b5061028d60048036038101906102889190613942565b610b63565b005b34801561029b57600080fd5b506102b660048036038101906102b19190613b6c565b610c23565b6040516102c391906143a1565b60405180910390f35b3480156102d857600080fd5b506102e1610d05565b6040516102ee919061441c565b60405180910390f35b34801561030357600080fd5b5061030c610d97565b005b34801561031a57600080fd5b5061033560048036038101906103309190613c0f565b610e1e565b604051610342919061433a565b60405180910390f35b34801561035757600080fd5b50610360610ea3565b005b34801561036e57600080fd5b5061038960048036038101906103849190613c0f565b610f96565b005b34801561039757600080fd5b506103b260048036038101906103ad9190613ac5565b611128565b005b3480156103c057600080fd5b506103c9611240565b6040516103d691906147fe565b60405180910390f35b3480156103eb57600080fd5b50610406600480360381019061040191906139af565b61124a565b005b610422600480360381019061041d9190613ca3565b6112aa565b005b34801561043057600080fd5b5061044b60048036038101906104469190613942565b6114c4565b60405161045891906147fe565b60405180910390f35b34801561046d57600080fd5b5061048860048036038101906104839190613b05565b6114dc565b60405161049591906143a1565b60405180910390f35b3480156104aa57600080fd5b506104c560048036038101906104c09190613bc6565b6115da565b005b3480156104d357600080fd5b506104dc611670565b6040516104e991906147fe565b60405180910390f35b3480156104fe57600080fd5b50610507611687565b005b34801561051557600080fd5b50610530600480360381019061052b91906139af565b61176d565b005b34801561053e57600080fd5b5061055960048036038101906105549190613c0f565b61178d565b005b34801561056757600080fd5b5061057061191f565b005b34801561057e57600080fd5b50610587611a12565b6040516105949190614401565b60405180910390f35b3480156105a957600080fd5b506105c460048036038101906105bf9190613c0f565b611a6b565b6040516105d1919061433a565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc9190613942565b611b1d565b60405161060e91906147fe565b60405180910390f35b34801561062357600080fd5b5061062c611bd5565b005b34801561063a57600080fd5b50610643611c5d565b60405161065091906147fe565b60405180910390f35b34801561066557600080fd5b5061066e611cdb565b005b34801561067c57600080fd5b50610685611dce565b604051610692919061433a565b60405180910390f35b3480156106a757600080fd5b506106b0611df8565b6040516106bd919061441c565b60405180910390f35b3480156106d257600080fd5b506106ed60048036038101906106e89190613a85565b611e8a565b005b3480156106fb57600080fd5b5061070461200b565b60405161071191906147fe565b60405180910390f35b610734600480360381019061072f9190613c0f565b61208f565b005b34801561074257600080fd5b5061074b61231b565b005b34801561075957600080fd5b50610774600480360381019061076f9190613a02565b61240e565b005b34801561078257600080fd5b5061078b612470565b60405161079891906147fe565b60405180910390f35b3480156107ad57600080fd5b506107c860048036038101906107c39190613c0f565b61255d565b6040516107d5919061441c565b60405180910390f35b3480156107ea57600080fd5b506107f3612604565b60405161080091906147fe565b60405180910390f35b34801561081557600080fd5b5061081e61261b565b60405161082b91906147fe565b60405180910390f35b34801561084057600080fd5b5061085b6004803603810190610856919061396f565b612625565b60405161086891906143a1565b60405180910390f35b61088b60048036038101906108869190613c3c565b6126b9565b005b34801561089957600080fd5b506108b460048036038101906108af9190613942565b612966565b005b8282826108c5338484846114dc565b610904576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb9061469e565b60405180910390fd5b600061090e611a12565b90506003600481111561092457610923614c5e565b5b81600481111561093757610936614c5e565b5b14610977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096e9061443e565b60405180910390fd5b600e5488600a5461098891906148ee565b11156109c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c09061453e565b60405180910390fd5b6109d1611c5d565b88601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a1c91906148ee565b1115610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a549061455e565b60405180910390fd5b87610a66612470565b610a709190614975565b341015610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa99061479e565b60405180910390fd5b60005b88811015610b58576000610ac7612a5e565b9050610ad33382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b2391906148ee565b925050819055506001600b6000828254610b3d91906148ee565b92505081905550508080610b5090614b58565b915050610ab5565b505050505050505050565b610b6b612abd565b73ffffffffffffffffffffffffffffffffffffffff16610b89611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd6906146be565b60405180910390fd5b80601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cfe5750610cfd82612ac5565b5b9050919050565b606060008054610d1490614af5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4090614af5565b8015610d8d5780601f10610d6257610100808354040283529160200191610d8d565b820191906000526020600020905b815481529060010190602001808311610d7057829003601f168201915b5050505050905090565b610d9f612abd565b73ffffffffffffffffffffffffffffffffffffffff16610dbd611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906146be565b60405180910390fd5b600b54600f81905550565b6000610e2982612b2f565b610e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5f9061467e565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610eab612abd565b73ffffffffffffffffffffffffffffffffffffffff16610ec9611dce565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f16906146be565b60405180910390fd5b60026004811115610f3357610f32614c5e565b5b610f3b611a12565b6004811115610f4d57610f4c614c5e565b5b14610f8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f849061457e565b60405180910390fd5b42601d81905550565b610f9e612abd565b73ffffffffffffffffffffffffffffffffffffffff16610fbc611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906146be565b60405180910390fd5b6018548160165461102391906148ee565b1115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061465e565b60405180910390fd5b60005b81811015611124576000611079612a5e565b90506110853382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110d591906148ee565b925050819055506001600b60008282546110ef91906148ee565b9250508190555060016016600082825461110991906148ee565b9250508190555050808061111c90614b58565b915050611067565b5050565b600061113382611a6b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119b9061473e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166111c3612abd565b73ffffffffffffffffffffffffffffffffffffffff1614806111f257506111f1816111ec612abd565b612625565b5b611231576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611228906145be565b60405180910390fd5b61123b8383612b9b565b505050565b6000600b54905090565b61125b611255612abd565b82612c54565b61129a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112919061477e565b60405180910390fd5b6112a5838383612d32565b505050565b8282826112b9338484846114dc565b6112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef9061469e565b60405180910390fd5b6000611302611a12565b90506001600481111561131857611317614c5e565b5b81600481111561132b5761132a614c5e565b5b1461136b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113629061443e565b60405180910390fd5b600c54600854106113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a89061453e565b60405180910390fd5b6000601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142a9061455e565b60405180910390fd5b600061143d612a5e565b90506114493382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149991906148ee565b925050819055506001600b60008282546114b391906148ee565b925050819055505050505050505050565b601f6020528060005260406000206000915090505481565b60008030866040516020016114f29291906142a4565b60405160208183030381529060405280519060200120905060018160405160200161151d91906142ff565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161155394939291906143bc565b6020604051602081039080840390855afa158015611575573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6115e2612abd565b73ffffffffffffffffffffffffffffffffffffffff16611600611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906146be565b60405180910390fd5b806010908051906020019061166c92919061372c565b5050565b600060165460185461168291906149cf565b905090565b61168f612abd565b73ffffffffffffffffffffffffffffffffffffffff166116ad611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa906146be565b60405180910390fd5b600061170d61200b565b905060008111611752576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611749906147be565b60405180910390fd5b61176a61175d611dce565b61176561200b565b612f8e565b50565b6117888383836040518060200160405280600081525061240e565b505050565b611795612abd565b73ffffffffffffffffffffffffffffffffffffffff166117b3611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611800906146be565b60405180910390fd5b6019548160175461181a91906148ee565b111561185b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118529061465e565b60405180910390fd5b60005b8181101561191b576000611870612a5e565b905061187c3382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118cc91906148ee565b925050819055506001600b60008282546118e691906148ee565b9250508190555060016017600082825461190091906148ee565b9250508190555050808061191390614b58565b91505061185e565b5050565b611927612abd565b73ffffffffffffffffffffffffffffffffffffffff16611945611dce565b73ffffffffffffffffffffffffffffffffffffffff161461199b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611992906146be565b60405180910390fd5b600060048111156119af576119ae614c5e565b5b6119b7611a12565b60048111156119c9576119c8614c5e565b5b14611a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a00906147de565b60405180910390fd5b42601b81905550565b600080601b541415611a275760009050611a68565b6000601c541415611a3b5760019050611a68565b6000601d541415611a4f5760029050611a68565b6000601e541415611a635760039050611a68565b600490505b90565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b9061461e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b85906145fe565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611bdd612abd565b73ffffffffffffffffffffffffffffffffffffffff16611bfb611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611c51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c48906146be565b60405180910390fd5b611c5b600061303f565b565b600080611c68611a12565b905060006004811115611c7e57611c7d614c5e565b5b816004811115611c9157611c90614c5e565b5b1480611cc1575060016004811115611cac57611cab614c5e565b5b816004811115611cbf57611cbe614c5e565b5b145b15611cd157601454915050611cd8565b6015549150505b90565b611ce3612abd565b73ffffffffffffffffffffffffffffffffffffffff16611d01611dce565b73ffffffffffffffffffffffffffffffffffffffff1614611d57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4e906146be565b60405180910390fd5b60016004811115611d6b57611d6a614c5e565b5b611d73611a12565b6004811115611d8557611d84614c5e565b5b14611dc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbc906144be565b60405180910390fd5b42601c81905550565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611e0790614af5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e3390614af5565b8015611e805780601f10611e5557610100808354040283529160200191611e80565b820191906000526020600020905b815481529060010190602001808311611e6357829003601f168201915b5050505050905090565b611e92612abd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef79061451e565b60405180910390fd5b8060056000611f0d612abd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fba612abd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611fff91906143a1565b60405180910390a35050565b6000612015612abd565b73ffffffffffffffffffffffffffffffffffffffff16612033611dce565b73ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612080906146be565b60405180910390fd5b47905090565b6000612099611a12565b90506004808111156120ae576120ad614c5e565b5b8160048111156120c1576120c0614c5e565b5b14612101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f89061443e565b60405180910390fd5b60175460165460195460185461211791906148ee565b61212191906149cf565b61212b91906149cf565b600f5461213891906149cf565b82600b5461214691906148ee565b1115612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e9061453e565b60405180910390fd5b61218f611c5d565b82601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546121da91906148ee565b111561221b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122129061455e565b60405180910390fd5b81612224612470565b61222e9190614975565b341015612270576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612267906145de565b60405180910390fd5b60005b82811015612316576000612285612a5e565b90506122913382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122e191906148ee565b925050819055506001600b60008282546122fb91906148ee565b9250508190555050808061230e90614b58565b915050612273565b505050565b612323612abd565b73ffffffffffffffffffffffffffffffffffffffff16612341611dce565b73ffffffffffffffffffffffffffffffffffffffff1614612397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238e906146be565b60405180910390fd5b600360048111156123ab576123aa614c5e565b5b6123b3611a12565b60048111156123c5576123c4614c5e565b5b14612405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fc9061475e565b60405180910390fd5b42601e81905550565b61241f612419612abd565b83612c54565b61245e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124559061477e565b60405180910390fd5b61246a84848484613105565b50505050565b60008061247b611a12565b90506000600481111561249157612490614c5e565b5b8160048111156124a4576124a3614c5e565b5b14806124d45750600160048111156124bf576124be614c5e565b5b8160048111156124d2576124d1614c5e565b5b145b156124e357600091505061255a565b600260048111156124f7576124f6614c5e565b5b81600481111561250a57612509614c5e565b5b141561251b5760115491505061255a565b6003600481111561252f5761252e614c5e565b5b81600481111561254257612541614c5e565b5b14156125535760125491505061255a565b6013549150505b90565b606061256882612b2f565b6125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e906146fe565b60405180910390fd5b60006125b1613161565b905060008151116125d157604051806020016040528060008152506125fc565b806125db846131f3565b6040516020016125ec9291906142d0565b6040516020818303038152906040525b915050919050565b600060175460195461261691906149cf565b905090565b6000600f54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8282826126c8338484846114dc565b612707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fe9061469e565b60405180910390fd5b6000612711611a12565b90506002600481111561272757612726614c5e565b5b81600481111561273a57612739614c5e565b5b1461277a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127719061443e565b60405180910390fd5b600d548860095461278b91906148ee565b11156127cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c39061453e565b60405180910390fd5b6127d4611c5d565b88601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461281f91906148ee565b1115612860576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128579061455e565b60405180910390fd5b87612869612470565b6128739190614975565b3410156128b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ac9061471e565b60405180910390fd5b60005b8881101561295b5760006128ca612a5e565b90506128d63382612a9f565b6001601f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292691906148ee565b925050819055506001600b600082825461294091906148ee565b9250508190555050808061295390614b58565b9150506128b8565b505050505050505050565b61296e612abd565b73ffffffffffffffffffffffffffffffffffffffff1661298c611dce565b73ffffffffffffffffffffffffffffffffffffffff16146129e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d9906146be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a499061447e565b60405180910390fd5b612a5b8161303f565b50565b600080612a69611240565b90506000600190505b8015612a9757600182612a8591906148ee565b9150612a9082612b2f565b9050612a72565b819250505090565b612ab9828260405180602001604052806000815250613354565b5050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c0e83611a6b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612c5f82612b2f565b612c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c959061459e565b60405180910390fd5b6000612ca983611a6b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612d1857508373ffffffffffffffffffffffffffffffffffffffff16612d0084610e1e565b73ffffffffffffffffffffffffffffffffffffffff16145b80612d295750612d288185612625565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612d5282611a6b565b73ffffffffffffffffffffffffffffffffffffffff1614612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f906146de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0f906144fe565b60405180910390fd5b612e238383836133af565b612e2e600082612b9b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e7e91906149cf565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ed591906148ee565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612fb490614325565b60006040518083038185875af1925050503d8060008114612ff1576040519150601f19603f3d011682016040523d82523d6000602084013e612ff6565b606091505b505090508061303a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613031906144de565b60405180910390fd5b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613110848484612d32565b61311c848484846133b4565b61315b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131529061445e565b60405180910390fd5b50505050565b60606010805461317090614af5565b80601f016020809104026020016040519081016040528092919081815260200182805461319c90614af5565b80156131e95780601f106131be576101008083540402835291602001916131e9565b820191906000526020600020905b8154815290600101906020018083116131cc57829003601f168201915b5050505050905090565b6060600082141561323b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061334f565b600082905060005b6000821461326d57808061325690614b58565b915050600a826132669190614944565b9150613243565b60008167ffffffffffffffff81111561328957613288614ceb565b5b6040519080825280601f01601f1916602001820160405280156132bb5781602001600182028036833780820191505090505b5090505b60008514613348576001826132d491906149cf565b9150600a856132e39190614bcf565b60306132ef91906148ee565b60f81b81838151811061330557613304614cbc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133419190614944565b94506132bf565b8093505050505b919050565b61335e838361354b565b61336b60008484846133b4565b6133aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a19061445e565b60405180910390fd5b505050565b505050565b60006133d58473ffffffffffffffffffffffffffffffffffffffff16613719565b1561353e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133fe612abd565b8786866040518563ffffffff1660e01b81526004016134209493929190614355565b602060405180830381600087803b15801561343a57600080fd5b505af192505050801561346b57506040513d601f19601f820116820180604052508101906134689190613b99565b60015b6134ee573d806000811461349b576040519150601f19603f3d011682016040523d82523d6000602084013e6134a0565b606091505b506000815114156134e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134dd9061445e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613543565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b29061463e565b60405180910390fd5b6135c481612b2f565b15613604576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135fb9061449e565b60405180910390fd5b613610600083836133af565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461366091906148ee565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461373890614af5565b90600052602060002090601f01602090048101928261375a57600085556137a1565b82601f1061377357805160ff19168380011785556137a1565b828001600101855582156137a1579182015b828111156137a0578251825591602001919060010190613785565b5b5090506137ae91906137b2565b5090565b5b808211156137cb5760008160009055506001016137b3565b5090565b60006137e26137dd8461483e565b614819565b9050828152602081018484840111156137fe576137fd614d1f565b5b613809848285614ab3565b509392505050565b600061382461381f8461486f565b614819565b9050828152602081018484840111156138405761383f614d1f565b5b61384b848285614ab3565b509392505050565b60008135905061386281615613565b92915050565b6000813590506138778161562a565b92915050565b60008135905061388c81615641565b92915050565b6000813590506138a181615658565b92915050565b6000815190506138b681615658565b92915050565b600082601f8301126138d1576138d0614d1a565b5b81356138e18482602086016137cf565b91505092915050565b600082601f8301126138ff576138fe614d1a565b5b813561390f848260208601613811565b91505092915050565b6000813590506139278161566f565b92915050565b60008135905061393c81615686565b92915050565b60006020828403121561395857613957614d29565b5b600061396684828501613853565b91505092915050565b6000806040838503121561398657613985614d29565b5b600061399485828601613853565b92505060206139a585828601613853565b9150509250929050565b6000806000606084860312156139c8576139c7614d29565b5b60006139d686828701613853565b93505060206139e786828701613853565b92505060406139f886828701613918565b9150509250925092565b60008060008060808587031215613a1c57613a1b614d29565b5b6000613a2a87828801613853565b9450506020613a3b87828801613853565b9350506040613a4c87828801613918565b925050606085013567ffffffffffffffff811115613a6d57613a6c614d24565b5b613a79878288016138bc565b91505092959194509250565b60008060408385031215613a9c57613a9b614d29565b5b6000613aaa85828601613853565b9250506020613abb85828601613868565b9150509250929050565b60008060408385031215613adc57613adb614d29565b5b6000613aea85828601613853565b9250506020613afb85828601613918565b9150509250929050565b60008060008060808587031215613b1f57613b1e614d29565b5b6000613b2d87828801613853565b9450506020613b3e8782880161392d565b9350506040613b4f8782880161387d565b9250506060613b608782880161387d565b91505092959194509250565b600060208284031215613b8257613b81614d29565b5b6000613b9084828501613892565b91505092915050565b600060208284031215613baf57613bae614d29565b5b6000613bbd848285016138a7565b91505092915050565b600060208284031215613bdc57613bdb614d29565b5b600082013567ffffffffffffffff811115613bfa57613bf9614d24565b5b613c06848285016138ea565b91505092915050565b600060208284031215613c2557613c24614d29565b5b6000613c3384828501613918565b91505092915050565b60008060008060808587031215613c5657613c55614d29565b5b6000613c6487828801613918565b9450506020613c758782880161392d565b9350506040613c868782880161387d565b9250506060613c978782880161387d565b91505092959194509250565b600080600060608486031215613cbc57613cbb614d29565b5b6000613cca8682870161392d565b9350506020613cdb8682870161387d565b9250506040613cec8682870161387d565b9150509250925092565b613cff81614a03565b82525050565b613d16613d1182614a03565b614ba1565b82525050565b613d2581614a15565b82525050565b613d3481614a21565b82525050565b613d4b613d4682614a21565b614bb3565b82525050565b6000613d5c826148a0565b613d6681856148b6565b9350613d76818560208601614ac2565b613d7f81614d2e565b840191505092915050565b613d9381614aa1565b82525050565b6000613da4826148ab565b613dae81856148d2565b9350613dbe818560208601614ac2565b613dc781614d2e565b840191505092915050565b6000613ddd826148ab565b613de781856148e3565b9350613df7818560208601614ac2565b80840191505092915050565b6000613e106011836148d2565b9150613e1b82614d4c565b602082019050919050565b6000613e33601c836148e3565b9150613e3e82614d75565b601c82019050919050565b6000613e566032836148d2565b9150613e6182614d9e565b604082019050919050565b6000613e796026836148d2565b9150613e8482614ded565b604082019050919050565b6000613e9c601c836148d2565b9150613ea782614e3c565b602082019050919050565b6000613ebf6021836148d2565b9150613eca82614e65565b604082019050919050565b6000613ee26014836148d2565b9150613eed82614eb4565b602082019050919050565b6000613f056024836148d2565b9150613f1082614edd565b604082019050919050565b6000613f286019836148d2565b9150613f3382614f2c565b602082019050919050565b6000613f4b601e836148d2565b9150613f5682614f55565b602082019050919050565b6000613f6e6023836148d2565b9150613f7982614f7e565b604082019050919050565b6000613f916021836148d2565b9150613f9c82614fcd565b604082019050919050565b6000613fb4602c836148d2565b9150613fbf8261501c565b604082019050919050565b6000613fd76038836148d2565b9150613fe28261506b565b604082019050919050565b6000613ffa604d836148d2565b9150614005826150ba565b606082019050919050565b600061401d602a836148d2565b91506140288261512f565b604082019050919050565b60006140406029836148d2565b915061404b8261517e565b604082019050919050565b60006140636020836148d2565b915061406e826151cd565b602082019050919050565b60006140866026836148d2565b9150614091826151f6565b604082019050919050565b60006140a9602c836148d2565b91506140b482615245565b604082019050919050565b60006140cc6005836148e3565b91506140d782615294565b600582019050919050565b60006140ef6011836148d2565b91506140fa826152bd565b602082019050919050565b60006141126020836148d2565b915061411d826152e6565b602082019050919050565b60006141356029836148d2565b91506141408261530f565b604082019050919050565b6000614158602f836148d2565b91506141638261535e565b604082019050919050565b600061417b604c836148d2565b9150614186826153ad565b606082019050919050565b600061419e6021836148d2565b91506141a982615422565b604082019050919050565b60006141c16027836148d2565b91506141cc82615471565b604082019050919050565b60006141e46000836148c7565b91506141ef826154c0565b600082019050919050565b60006142076031836148d2565b9150614212826154c3565b604082019050919050565b600061422a604c836148d2565b915061423582615512565b606082019050919050565b600061424d6022836148d2565b915061425882615587565b604082019050919050565b60006142706020836148d2565b915061427b826155d6565b602082019050919050565b61428f81614a8a565b82525050565b61429e81614a94565b82525050565b60006142b08285613d05565b6014820191506142c08284613d05565b6014820191508190509392505050565b60006142dc8285613dd2565b91506142e88284613dd2565b91506142f3826140bf565b91508190509392505050565b600061430a82613e26565b91506143168284613d3a565b60208201915081905092915050565b6000614330826141d7565b9150819050919050565b600060208201905061434f6000830184613cf6565b92915050565b600060808201905061436a6000830187613cf6565b6143776020830186613cf6565b6143846040830185614286565b81810360608301526143968184613d51565b905095945050505050565b60006020820190506143b66000830184613d1c565b92915050565b60006080820190506143d16000830187613d2b565b6143de6020830186614295565b6143eb6040830185613d2b565b6143f86060830184613d2b565b95945050505050565b60006020820190506144166000830184613d8a565b92915050565b600060208201905081810360008301526144368184613d99565b905092915050565b6000602082019050818103600083015261445781613e03565b9050919050565b6000602082019050818103600083015261447781613e49565b9050919050565b6000602082019050818103600083015261449781613e6c565b9050919050565b600060208201905081810360008301526144b781613e8f565b9050919050565b600060208201905081810360008301526144d781613eb2565b9050919050565b600060208201905081810360008301526144f781613ed5565b9050919050565b6000602082019050818103600083015261451781613ef8565b9050919050565b6000602082019050818103600083015261453781613f1b565b9050919050565b6000602082019050818103600083015261455781613f3e565b9050919050565b6000602082019050818103600083015261457781613f61565b9050919050565b6000602082019050818103600083015261459781613f84565b9050919050565b600060208201905081810360008301526145b781613fa7565b9050919050565b600060208201905081810360008301526145d781613fca565b9050919050565b600060208201905081810360008301526145f781613fed565b9050919050565b6000602082019050818103600083015261461781614010565b9050919050565b6000602082019050818103600083015261463781614033565b9050919050565b6000602082019050818103600083015261465781614056565b9050919050565b6000602082019050818103600083015261467781614079565b9050919050565b600060208201905081810360008301526146978161409c565b9050919050565b600060208201905081810360008301526146b7816140e2565b9050919050565b600060208201905081810360008301526146d781614105565b9050919050565b600060208201905081810360008301526146f781614128565b9050919050565b600060208201905081810360008301526147178161414b565b9050919050565b600060208201905081810360008301526147378161416e565b9050919050565b6000602082019050818103600083015261475781614191565b9050919050565b60006020820190508181036000830152614777816141b4565b9050919050565b60006020820190508181036000830152614797816141fa565b9050919050565b600060208201905081810360008301526147b78161421d565b9050919050565b600060208201905081810360008301526147d781614240565b9050919050565b600060208201905081810360008301526147f781614263565b9050919050565b60006020820190506148136000830184614286565b92915050565b6000614823614834565b905061482f8282614b27565b919050565b6000604051905090565b600067ffffffffffffffff82111561485957614858614ceb565b5b61486282614d2e565b9050602081019050919050565b600067ffffffffffffffff82111561488a57614889614ceb565b5b61489382614d2e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006148f982614a8a565b915061490483614a8a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561493957614938614c00565b5b828201905092915050565b600061494f82614a8a565b915061495a83614a8a565b92508261496a57614969614c2f565b5b828204905092915050565b600061498082614a8a565b915061498b83614a8a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149c4576149c3614c00565b5b828202905092915050565b60006149da82614a8a565b91506149e583614a8a565b9250828210156149f8576149f7614c00565b5b828203905092915050565b6000614a0e82614a6a565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614a65826155ff565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614aac82614a57565b9050919050565b82818337600083830152505050565b60005b83811015614ae0578082015181840152602081019050614ac5565b83811115614aef576000848401525b50505050565b60006002820490506001821680614b0d57607f821691505b60208210811415614b2157614b20614c8d565b5b50919050565b614b3082614d2e565b810181811067ffffffffffffffff82111715614b4f57614b4e614ceb565b5b80604052505050565b6000614b6382614a8a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b9657614b95614c00565b5b600182019050919050565b6000614bac82614bbd565b9050919050565b6000819050919050565b6000614bc882614d3f565b9050919050565b6000614bda82614a8a565b9150614be583614a8a565b925082614bf557614bf4614c2f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f53616c6520696e206e6f74206f70656e21000000000000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43757272656e742053746174652068617320746f2062652050726573616c653160008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f4d6178696d756d204d696e74732070657220416464726573732065786365656460008201527f6564210000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f2062652050726573616c653260008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e323520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4e6f7420656e6f756768205265736572766564204e4654206c65667420746f2060008201527f6d696e742e2e0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e312065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f2062652057686974656c697360008201527f742053616c652100000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e322065746860208201527f65722065616368204e4654290000000000000000000000000000000000000000604082015250565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b7f43757272656e742053746174652068617320746f206265204e6f2053616c6521600082015250565b600581106156105761560f614c5e565b5b50565b61561c81614a03565b811461562757600080fd5b50565b61563381614a15565b811461563e57600080fd5b50565b61564a81614a21565b811461565557600080fd5b50565b61566181614a2b565b811461566c57600080fd5b50565b61567881614a8a565b811461568357600080fd5b50565b61568f81614a94565b811461569a57600080fd5b5056fea26469706673582212204153a9a1415440b5c35c120c7beb466a9779dc38e525e309b5b94fd524da826464736f6c63430008070033
Deployed Bytecode Sourcemap
34788:12650:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37255:8;;;41095:824;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45173:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22903:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23854:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44290:94;;;;;;;;;;;;;:::i;:::-;;25169:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38305:184;;;;;;;;;;;;;:::i;:::-;;43264:462;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24692:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45332:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26059:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39601:568;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36675:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39283:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37482:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45498:141;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44603:238;;;;;;;;;;;;;:::i;:::-;;26469:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43785:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37928:179;;;;;;;;;;;;;:::i;:::-;;45923:497;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23548:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23278:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;47147:277;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38115:182;;;;;;;;;;;;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24023:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25462:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44434:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41974:852;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38497:197;;;;;;;;;;;;;:::i;:::-;;26725:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46469:479;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42838:367;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45711:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47013:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25828:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40224:816;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41095:824;41184:2;41189;41193;38785:41;38806:10;38817:2;38820;38823;38785:20;:41::i;:::-;38776:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41223:16:::1;41242:11;:9;:11::i;:::-;41223:30;;41286:19;41272:33;;;;;;;;:::i;:::-;;:10;:33;;;;;;;;:::i;:::-;;;41264:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;41382:18;;41372:6;41346:23;;:32;;;;:::i;:::-;:54;;41338:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;41494:9;:7;:9::i;:::-;41484:6;41454:15;:27;41470:10;41454:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:49;;41446:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;41588:6;41575:10;:8;:10::i;:::-;:19;;;;:::i;:::-;41562:9;:32;;41554:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;41701:9;41696:214;41720:6;41716:1;:10;41696:214;;;41748:11;41762:9;:7;:9::i;:::-;41748:23;;41786:26;41796:10;41808:3;41786:9;:26::i;:::-;41858:1;41827:15;:27;41843:10;41827:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;41897:1;41874:19;;:24;;;;;;;:::i;:::-;;;;;;;;41733:177;41728:3;;;;;:::i;:::-;;;;41696:214;;;;41212:707;41095:824:::0;;;;;;;:::o;45173:87::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45246:6:::1;45238:5;;:14;;;;;;;;;;;;;;;;;;45173:87:::0;:::o;22903:305::-;23005:4;23057:25;23042:40;;;:11;:40;;;;:105;;;;23114:33;23099:48;;;:11;:48;;;;23042:105;:158;;;;23164:36;23188:11;23164:23;:36::i;:::-;23042:158;23022:178;;22903:305;;;:::o;23854:100::-;23908:13;23941:5;23934:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23854:100;:::o;44290:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44357:19:::1;;44340:14;:36;;;;44290:94::o:0;25169:221::-;25245:7;25273:16;25281:7;25273;:16::i;:::-;25265:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25358:15;:24;25374:7;25358:24;;;;;;;;;;;;;;;;;;;;;25351:31;;25169:221;;;:::o;38305:184::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38381:14:::1;38366:29;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:29;;;;;;;;:::i;:::-;;;38358:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38466:15;38444:19;:37;;;;38305:184::o:0;43264:462::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43383:25:::1;;43373:6;43347:23;;:32;;;;:::i;:::-;:61;;43339:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;43467:9;43462:257;43486:6;43482:1;:10;43462:257;;;43514:11;43528:9;:7;:9::i;:::-;43514:23;;43552:26;43562:10;43574:3;43552:9;:26::i;:::-;43624:1;43593:15;:27;43609:10;43593:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;43663:1;43640:19;;:24;;;;;;;:::i;:::-;;;;;;;;43706:1;43679:23;;:28;;;;;;;:::i;:::-;;;;;;;;43499:220;43494:3;;;;;:::i;:::-;;;;43462:257;;;;43264:462:::0;:::o;24692:411::-;24773:13;24789:23;24804:7;24789:14;:23::i;:::-;24773:39;;24837:5;24831:11;;:2;:11;;;;24823:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;24931:5;24915:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24940:37;24957:5;24964:12;:10;:12::i;:::-;24940:16;:37::i;:::-;24915:62;24893:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25074:21;25083:2;25087:7;25074:8;:21::i;:::-;24762:341;24692:411;;:::o;45332:94::-;45375:4;45399:19;;45392:26;;45332:94;:::o;26059:339::-;26254:41;26273:12;:10;:12::i;:::-;26287:7;26254:18;:41::i;:::-;26246:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26362:28;26372:4;26378:2;26382:7;26362:9;:28::i;:::-;26059:339;;;:::o;39601:568::-;39673:2;39678;39682;38785:41;38806:10;38817:2;38820;38823;38785:20;:41::i;:::-;38776:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39712:16:::1;39731:11;:9;:11::i;:::-;39712:30;;39775:14;39761:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;39753:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39855:17;;39830:22;;:42;39822:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39957:1;39926:15;:27;39942:10;39926:27;;;;;;;;;;;;;;;;:32;39918:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;40011:11;40025:9;:7;:9::i;:::-;40011:23;;40045:26;40055:10;40067:3;40045:9;:26::i;:::-;40113:1;40082:15;:27;40098:10;40082:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;40148:1;40125:19;;:24;;;;;;;:::i;:::-;;;;;;;;39701:468;;39601:568:::0;;;;;;:::o;36675:50::-;;;;;;;;;;;;;;;;;:::o;39283:306::-;39382:4;39399:12;39449:4;39456;39424:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39414:48;;;;;;39399:63;;39489:92;39562:4;39509:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;39499:69;;;;;;39570:2;39574;39578;39489:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39480:101;;:5;;;;;;;;;;;:101;;;39473:108;;;39283:306;;;;;;:::o;37482:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37575:8:::1;37557:15;:26;;;;;;;;;;;;:::i;:::-;;37482:109:::0;:::o;45498:141::-;45556:4;45608:23;;45580:25;;:51;;;;:::i;:::-;45573:58;;45498:141;:::o;44603:238::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44651:15:::1;44669:16;:14;:16::i;:::-;44651:34;;44714:1;44704:7;:11;44696:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44767:45;44785:7;:5;:7::i;:::-;44795:16;:14;:16::i;:::-;44767:9;:45::i;:::-;44640:201;44603:238::o:0;26469:185::-;26607:39;26624:4;26630:2;26634:7;26607:39;;;;;;;;;;;;:16;:39::i;:::-;26469:185;;;:::o;43785:442::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43894:20:::1;;43884:6;43863:18;;:27;;;;:::i;:::-;:51;;43855:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;43973:9;43968:252;43992:6;43988:1;:10;43968:252;;;44020:11;44034:9;:7;:9::i;:::-;44020:23;;44058:26;44068:10;44080:3;44058:9;:26::i;:::-;44130:1;44099:15;:27;44115:10;44099:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;44169:1;44146:19;;:24;;;;;;;:::i;:::-;;;;;;;;44207:1;44185:18;;:23;;;;;;;:::i;:::-;;;;;;;;44005:215;44000:3;;;;;:::i;:::-;;;;43968:252;;;;43785:442:::0;:::o;37928:179::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38003:12:::1;37988:27;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:27;;;;;;;;:::i;:::-;;;37980:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;38084:15;38063:18;:36;;;;37928:179::o:0;45923:497::-;45964:5;46007:1;45985:18;;:23;45981:429;;;46032:12;46025:19;;;;45981:429;46101:1;46079:18;;:23;46075:335;;;46126:14;46119:21;;;;46075:335;46195:1;46172:19;;:24;46168:242;;;46220:14;46213:21;;;;46168:242;46289:1;46265:20;;:25;46261:149;;;46314:19;46307:26;;;;46261:149;46382:16;46375:23;;45923:497;;:::o;23548:239::-;23620:7;23640:13;23656:7;:16;23664:7;23656:16;;;;;;;;;;;;;;;;;;;;;23640:32;;23708:1;23691:19;;:5;:19;;;;23683:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23774:5;23767:12;;;23548:239;;;:::o;23278:208::-;23350:7;23395:1;23378:19;;:5;:19;;;;23370:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23462:9;:16;23472:5;23462:16;;;;;;;;;;;;;;;;23455:23;;23278:208;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;47147:277::-;47186:4;47203:16;47222:11;:9;:11::i;:::-;47203:30;;47262:12;47248:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;:58;;;;47292:14;47278:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;47248:58;47244:173;;;47330:15;;47323:22;;;;;47244:173;47394:11;;47387:18;;;47147:277;;:::o;38115:182::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38190:14:::1;38175:29;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:29;;;;;;;;:::i;:::-;;;38167:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;38274:15;38253:18;:36;;;;38115:182::o:0;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;24023:104::-;24079:13;24112:7;24105:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24023:104;:::o;25462:295::-;25577:12;:10;:12::i;:::-;25565:24;;:8;:24;;;;25557:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25677:8;25632:18;:32;25651:12;:10;:12::i;:::-;25632:32;;;;;;;;;;;;;;;:42;25665:8;25632:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25730:8;25701:48;;25716:12;:10;:12::i;:::-;25701:48;;;25740:8;25701:48;;;;;;:::i;:::-;;;;;;;;25462:295;;:::o;44434:109::-;44490:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44514:21:::1;44507:28;;44434:109:::0;:::o;41974:852::-;42040:16;42059:11;:9;:11::i;:::-;42040:30;;42103:16;42089:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;42081:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;42287:18;;42261:23;;42238:20;;42210:25;;:48;;;;:::i;:::-;:74;;;;:::i;:::-;:95;;;;:::i;:::-;42192:14;;:114;;;;:::i;:::-;42182:6;42160:19;;:28;;;;:::i;:::-;:146;;42152:189;;;;;;;;;;;;:::i;:::-;;;;;;;;;42400:9;:7;:9::i;:::-;42390:6;42360:15;:27;42376:10;42360:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:49;;42352:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;42494:6;42481:10;:8;:10::i;:::-;:19;;;;:::i;:::-;42468:9;:32;;42460:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;42608:9;42603:214;42627:6;42623:1;:10;42603:214;;;42655:11;42669:9;:7;:9::i;:::-;42655:23;;42693:26;42703:10;42715:3;42693:9;:26::i;:::-;42765:1;42734:15;:27;42750:10;42734:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;42804:1;42781:19;;:24;;;;;;;:::i;:::-;;;;;;;;42640:177;42635:3;;;;;:::i;:::-;;;;42603:214;;;;42029:797;41974:852;:::o;38497:197::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38574:19:::1;38559:34;;;;;;;;:::i;:::-;;:11;:9;:11::i;:::-;:34;;;;;;;;:::i;:::-;;;38551:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;38671:15;38648:20;:38;;;;38497:197::o:0;26725:328::-;26900:41;26919:12;:10;:12::i;:::-;26933:7;26900:18;:41::i;:::-;26892:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27006:39;27020:4;27026:2;27030:7;27039:5;27006:13;:39::i;:::-;26725:328;;;;:::o;46469:479::-;46509:4;46526:16;46545:11;:9;:11::i;:::-;46526:30;;46585:12;46571:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;:58;;;;46615:14;46601:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;46571:58;46567:374;;;46653:1;46646:8;;;;;46567:374;46699:14;46685:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;46681:260;;;46737:16;;46730:23;;;;;46681:260;46798:19;46784:33;;;;;;;;:::i;:::-;;:10;:33;;;;;;;;:::i;:::-;;;46780:161;;;46841:21;;46834:28;;;;;46780:161;46911:18;;46904:25;;;46469:479;;:::o;42838:367::-;42912:13;42946:17;42954:8;42946:7;:17::i;:::-;42938:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43036:21;43060:10;:8;:10::i;:::-;43036:34;;43112:1;43094:7;43088:21;:25;:96;;;;;;;;;;;;;;;;;43140:7;43149:19;:8;:17;:19::i;:::-;43123:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43088:96;43081:103;;;42838:367;;;:::o;45711:126::-;45764:4;45811:18;;45788:20;;:41;;;;:::i;:::-;45781:48;;45711:126;:::o;47013:87::-;47054:4;47078:14;;47071:21;;47013:87;:::o;25828:164::-;25925:4;25949:18;:25;25968:5;25949:25;;;;;;;;;;;;;;;:35;25975:8;25949:35;;;;;;;;;;;;;;;;;;;;;;;;;25942:42;;25828:164;;;;:::o;40224:816::-;40312:2;40317;40321;38785:41;38806:10;38817:2;38820;38823;38785:20;:41::i;:::-;38776:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40351:16:::1;40370:11;:9;:11::i;:::-;40351:30;;40414:14;40400:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;40392:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40504:17;;40494:6;40469:22;;:31;;;;:::i;:::-;:52;;40461:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40615:9;:7;:9::i;:::-;40605:6;40575:15;:27;40591:10;40575:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:49;;40567:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;40709:6;40696:10;:8;:10::i;:::-;:19;;;;:::i;:::-;40683:9;:32;;40675:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;40822:9;40817:214;40841:6;40837:1;:10;40817:214;;;40869:11;40883:9;:7;:9::i;:::-;40869:23;;40907:26;40917:10;40929:3;40907:9;:26::i;:::-;40979:1;40948:15;:27;40964:10;40948:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;41018:1;40995:19;;:24;;;;;;;:::i;:::-;;;;;;;;40854:177;40849:3;;;;;:::i;:::-;;;;40817:214;;;;40340:700;40224:816:::0;;;;;;;:::o;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;37647:273::-;37688:7;37708:14;37725:13;:11;:13::i;:::-;37708:30;;37749:11;37763:4;37749:18;;37778:98;37785:6;37778:98;;;37821:1;37808:14;;;;;:::i;:::-;;;37846:18;37854:9;37846:7;:18::i;:::-;37837:27;;37778:98;;;37903:9;37896:16;;;;37647:273;:::o;29547:110::-;29623:26;29633:2;29637:7;29623:26;;;;;;;;;;;;:9;:26::i;:::-;29547:110;;:::o;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;28563:127::-;28628:4;28680:1;28652:30;;:7;:16;28660:7;28652:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28645:37;;28563:127;;;:::o;32545:174::-;32647:2;32620:15;:24;32636:7;32620:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;32703:7;32699:2;32665:46;;32674:23;32689:7;32674:14;:23::i;:::-;32665:46;;;;;;;;;;;;32545:174;;:::o;28857:348::-;28950:4;28975:16;28983:7;28975;:16::i;:::-;28967:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29051:13;29067:23;29082:7;29067:14;:23::i;:::-;29051:39;;29120:5;29109:16;;:7;:16;;;:51;;;;29153:7;29129:31;;:20;29141:7;29129:11;:20::i;:::-;:31;;;29109:51;:87;;;;29164:32;29181:5;29188:7;29164:16;:32::i;:::-;29109:87;29101:96;;;28857:348;;;;:::o;31849:578::-;32008:4;31981:31;;:23;31996:7;31981:14;:23::i;:::-;:31;;;31973:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32091:1;32077:16;;:2;:16;;;;32069:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32147:39;32168:4;32174:2;32178:7;32147:20;:39::i;:::-;32251:29;32268:1;32272:7;32251:8;:29::i;:::-;32312:1;32293:9;:15;32303:4;32293:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32341:1;32324:9;:13;32334:2;32324:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32372:2;32353:7;:16;32361:7;32353:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32411:7;32407:2;32392:27;;32401:4;32392:27;;;;;;;;;;;;31849:578;;;:::o;44916:183::-;44997:9;45012:7;:12;;45032:6;45012:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44996:47;;;45062:4;45054:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;44985:114;44916:183;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;27935:315::-;28092:28;28102:4;28108:2;28112:7;28092:9;:28::i;:::-;28139:48;28162:4;28168:2;28172:7;28181:5;28139:22;:48::i;:::-;28131:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;27935:315;;;;:::o;37308:116::-;37368:13;37401:15;37394:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37308:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;29884:321::-;30014:18;30020:2;30024:7;30014:5;:18::i;:::-;30065:54;30096:1;30100:2;30104:7;30113:5;30065:22;:54::i;:::-;30043:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29884:321;;;:::o;34655:126::-;;;;:::o;33284:799::-;33439:4;33460:15;:2;:13;;;:15::i;:::-;33456:620;;;33512:2;33496:36;;;33533:12;:10;:12::i;:::-;33547:4;33553:7;33562:5;33496:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33492:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33755:1;33738:6;:13;:18;33734:272;;;33781:60;;;;;;;;;;:::i;:::-;;;;;;;;33734:272;33956:6;33950:13;33941:6;33937:2;33933:15;33926:38;33492:529;33629:41;;;33619:51;;;:6;:51;;;;33612:58;;;;;33456:620;34060:4;34053:11;;33284:799;;;;;;;:::o;30541:382::-;30635:1;30621:16;;:2;:16;;;;30613:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30694:16;30702:7;30694;:16::i;:::-;30693:17;30685:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30756:45;30785:1;30789:2;30793:7;30756:20;:45::i;:::-;30831:1;30814:9;:13;30824:2;30814:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30862:2;30843:7;:16;30851:7;30843:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30907:7;30903:2;30882:33;;30899:1;30882:33;;;;;;;;;;;;30541:382;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:761::-;8295:6;8303;8311;8319;8368:3;8356:9;8347:7;8343:23;8339:33;8336:120;;;8375:79;;:::i;:::-;8336:120;8495:1;8520:53;8565:7;8556:6;8545:9;8541:22;8520:53;:::i;:::-;8510:63;;8466:117;8622:2;8648:51;8691:7;8682:6;8671:9;8667:22;8648:51;:::i;:::-;8638:61;;8593:116;8748:2;8774:53;8819:7;8810:6;8799:9;8795:22;8774:53;:::i;:::-;8764:63;;8719:118;8876:2;8902:53;8947:7;8938:6;8927:9;8923:22;8902:53;:::i;:::-;8892:63;;8847:118;8211:761;;;;;;;:::o;8978:615::-;9053:6;9061;9069;9118:2;9106:9;9097:7;9093:23;9089:32;9086:119;;;9124:79;;:::i;:::-;9086:119;9244:1;9269:51;9312:7;9303:6;9292:9;9288:22;9269:51;:::i;:::-;9259:61;;9215:115;9369:2;9395:53;9440:7;9431:6;9420:9;9416:22;9395:53;:::i;:::-;9385:63;;9340:118;9497:2;9523:53;9568:7;9559:6;9548:9;9544:22;9523:53;:::i;:::-;9513:63;;9468:118;8978:615;;;;;:::o;9599:118::-;9686:24;9704:5;9686:24;:::i;:::-;9681:3;9674:37;9599:118;;:::o;9723:157::-;9828:45;9848:24;9866:5;9848:24;:::i;:::-;9828:45;:::i;:::-;9823:3;9816:58;9723:157;;:::o;9886:109::-;9967:21;9982:5;9967:21;:::i;:::-;9962:3;9955:34;9886:109;;:::o;10001:118::-;10088:24;10106:5;10088:24;:::i;:::-;10083:3;10076:37;10001:118;;:::o;10125:157::-;10230:45;10250:24;10268:5;10250:24;:::i;:::-;10230:45;:::i;:::-;10225:3;10218:58;10125:157;;:::o;10288:360::-;10374:3;10402:38;10434:5;10402:38;:::i;:::-;10456:70;10519:6;10514:3;10456:70;:::i;:::-;10449:77;;10535:52;10580:6;10575:3;10568:4;10561:5;10557:16;10535:52;:::i;:::-;10612:29;10634:6;10612:29;:::i;:::-;10607:3;10603:39;10596:46;;10378:270;10288:360;;;;:::o;10654:147::-;10749:45;10788:5;10749:45;:::i;:::-;10744:3;10737:58;10654:147;;:::o;10807:364::-;10895:3;10923:39;10956:5;10923:39;:::i;:::-;10978:71;11042:6;11037:3;10978:71;:::i;:::-;10971:78;;11058:52;11103:6;11098:3;11091:4;11084:5;11080:16;11058:52;:::i;:::-;11135:29;11157:6;11135:29;:::i;:::-;11130:3;11126:39;11119:46;;10899:272;10807:364;;;;:::o;11177:377::-;11283:3;11311:39;11344:5;11311:39;:::i;:::-;11366:89;11448:6;11443:3;11366:89;:::i;:::-;11359:96;;11464:52;11509:6;11504:3;11497:4;11490:5;11486:16;11464:52;:::i;:::-;11541:6;11536:3;11532:16;11525:23;;11287:267;11177:377;;;;:::o;11560:366::-;11702:3;11723:67;11787:2;11782:3;11723:67;:::i;:::-;11716:74;;11799:93;11888:3;11799:93;:::i;:::-;11917:2;11912:3;11908:12;11901:19;;11560:366;;;:::o;11932:402::-;12092:3;12113:85;12195:2;12190:3;12113:85;:::i;:::-;12106:92;;12207:93;12296:3;12207:93;:::i;:::-;12325:2;12320:3;12316:12;12309:19;;11932:402;;;:::o;12340:366::-;12482:3;12503:67;12567:2;12562:3;12503:67;:::i;:::-;12496:74;;12579:93;12668:3;12579:93;:::i;:::-;12697:2;12692:3;12688:12;12681:19;;12340:366;;;:::o;12712:::-;12854:3;12875:67;12939:2;12934:3;12875:67;:::i;:::-;12868:74;;12951:93;13040:3;12951:93;:::i;:::-;13069:2;13064:3;13060:12;13053:19;;12712:366;;;:::o;13084:::-;13226:3;13247:67;13311:2;13306:3;13247:67;:::i;:::-;13240:74;;13323:93;13412:3;13323:93;:::i;:::-;13441:2;13436:3;13432:12;13425:19;;13084:366;;;:::o;13456:::-;13598:3;13619:67;13683:2;13678:3;13619:67;:::i;:::-;13612:74;;13695:93;13784:3;13695:93;:::i;:::-;13813:2;13808:3;13804:12;13797:19;;13456:366;;;:::o;13828:::-;13970:3;13991:67;14055:2;14050:3;13991:67;:::i;:::-;13984:74;;14067:93;14156:3;14067:93;:::i;:::-;14185:2;14180:3;14176:12;14169:19;;13828:366;;;:::o;14200:::-;14342:3;14363:67;14427:2;14422:3;14363:67;:::i;:::-;14356:74;;14439:93;14528:3;14439:93;:::i;:::-;14557:2;14552:3;14548:12;14541:19;;14200:366;;;:::o;14572:::-;14714:3;14735:67;14799:2;14794:3;14735:67;:::i;:::-;14728:74;;14811:93;14900:3;14811:93;:::i;:::-;14929:2;14924:3;14920:12;14913:19;;14572:366;;;:::o;14944:::-;15086:3;15107:67;15171:2;15166:3;15107:67;:::i;:::-;15100:74;;15183:93;15272:3;15183:93;:::i;:::-;15301:2;15296:3;15292:12;15285:19;;14944:366;;;:::o;15316:::-;15458:3;15479:67;15543:2;15538:3;15479:67;:::i;:::-;15472:74;;15555:93;15644:3;15555:93;:::i;:::-;15673:2;15668:3;15664:12;15657:19;;15316:366;;;:::o;15688:::-;15830:3;15851:67;15915:2;15910:3;15851:67;:::i;:::-;15844:74;;15927:93;16016:3;15927:93;:::i;:::-;16045:2;16040:3;16036:12;16029:19;;15688:366;;;:::o;16060:::-;16202:3;16223:67;16287:2;16282:3;16223:67;:::i;:::-;16216:74;;16299:93;16388:3;16299:93;:::i;:::-;16417:2;16412:3;16408:12;16401:19;;16060:366;;;:::o;16432:::-;16574:3;16595:67;16659:2;16654:3;16595:67;:::i;:::-;16588:74;;16671:93;16760:3;16671:93;:::i;:::-;16789:2;16784:3;16780:12;16773:19;;16432:366;;;:::o;16804:::-;16946:3;16967:67;17031:2;17026:3;16967:67;:::i;:::-;16960:74;;17043:93;17132:3;17043:93;:::i;:::-;17161:2;17156:3;17152:12;17145:19;;16804:366;;;:::o;17176:::-;17318:3;17339:67;17403:2;17398:3;17339:67;:::i;:::-;17332:74;;17415:93;17504:3;17415:93;:::i;:::-;17533:2;17528:3;17524:12;17517:19;;17176:366;;;:::o;17548:::-;17690:3;17711:67;17775:2;17770:3;17711:67;:::i;:::-;17704:74;;17787:93;17876:3;17787:93;:::i;:::-;17905:2;17900:3;17896:12;17889:19;;17548:366;;;:::o;17920:::-;18062:3;18083:67;18147:2;18142:3;18083:67;:::i;:::-;18076:74;;18159:93;18248:3;18159:93;:::i;:::-;18277:2;18272:3;18268:12;18261:19;;17920:366;;;:::o;18292:::-;18434:3;18455:67;18519:2;18514:3;18455:67;:::i;:::-;18448:74;;18531:93;18620:3;18531:93;:::i;:::-;18649:2;18644:3;18640:12;18633:19;;18292:366;;;:::o;18664:::-;18806:3;18827:67;18891:2;18886:3;18827:67;:::i;:::-;18820:74;;18903:93;18992:3;18903:93;:::i;:::-;19021:2;19016:3;19012:12;19005:19;;18664:366;;;:::o;19036:400::-;19196:3;19217:84;19299:1;19294:3;19217:84;:::i;:::-;19210:91;;19310:93;19399:3;19310:93;:::i;:::-;19428:1;19423:3;19419:11;19412:18;;19036:400;;;:::o;19442:366::-;19584:3;19605:67;19669:2;19664:3;19605:67;:::i;:::-;19598:74;;19681:93;19770:3;19681:93;:::i;:::-;19799:2;19794:3;19790:12;19783:19;;19442:366;;;:::o;19814:::-;19956:3;19977:67;20041:2;20036:3;19977:67;:::i;:::-;19970:74;;20053:93;20142:3;20053:93;:::i;:::-;20171:2;20166:3;20162:12;20155:19;;19814:366;;;:::o;20186:::-;20328:3;20349:67;20413:2;20408:3;20349:67;:::i;:::-;20342:74;;20425:93;20514:3;20425:93;:::i;:::-;20543:2;20538:3;20534:12;20527:19;;20186:366;;;:::o;20558:::-;20700:3;20721:67;20785:2;20780:3;20721:67;:::i;:::-;20714:74;;20797:93;20886:3;20797:93;:::i;:::-;20915:2;20910:3;20906:12;20899:19;;20558:366;;;:::o;20930:::-;21072:3;21093:67;21157:2;21152:3;21093:67;:::i;:::-;21086:74;;21169:93;21258:3;21169:93;:::i;:::-;21287:2;21282:3;21278:12;21271:19;;20930:366;;;:::o;21302:::-;21444:3;21465:67;21529:2;21524:3;21465:67;:::i;:::-;21458:74;;21541:93;21630:3;21541:93;:::i;:::-;21659:2;21654:3;21650:12;21643:19;;21302:366;;;:::o;21674:::-;21816:3;21837:67;21901:2;21896:3;21837:67;:::i;:::-;21830:74;;21913:93;22002:3;21913:93;:::i;:::-;22031:2;22026:3;22022:12;22015:19;;21674:366;;;:::o;22046:398::-;22205:3;22226:83;22307:1;22302:3;22226:83;:::i;:::-;22219:90;;22318:93;22407:3;22318:93;:::i;:::-;22436:1;22431:3;22427:11;22420:18;;22046:398;;;:::o;22450:366::-;22592:3;22613:67;22677:2;22672:3;22613:67;:::i;:::-;22606:74;;22689:93;22778:3;22689:93;:::i;:::-;22807:2;22802:3;22798:12;22791:19;;22450:366;;;:::o;22822:::-;22964:3;22985:67;23049:2;23044:3;22985:67;:::i;:::-;22978:74;;23061:93;23150:3;23061:93;:::i;:::-;23179:2;23174:3;23170:12;23163:19;;22822:366;;;:::o;23194:::-;23336:3;23357:67;23421:2;23416:3;23357:67;:::i;:::-;23350:74;;23433:93;23522:3;23433:93;:::i;:::-;23551:2;23546:3;23542:12;23535:19;;23194:366;;;:::o;23566:::-;23708:3;23729:67;23793:2;23788:3;23729:67;:::i;:::-;23722:74;;23805:93;23894:3;23805:93;:::i;:::-;23923:2;23918:3;23914:12;23907:19;;23566:366;;;:::o;23938:118::-;24025:24;24043:5;24025:24;:::i;:::-;24020:3;24013:37;23938:118;;:::o;24062:112::-;24145:22;24161:5;24145:22;:::i;:::-;24140:3;24133:35;24062:112;;:::o;24180:397::-;24320:3;24335:75;24406:3;24397:6;24335:75;:::i;:::-;24435:2;24430:3;24426:12;24419:19;;24448:75;24519:3;24510:6;24448:75;:::i;:::-;24548:2;24543:3;24539:12;24532:19;;24568:3;24561:10;;24180:397;;;;;:::o;24583:701::-;24864:3;24886:95;24977:3;24968:6;24886:95;:::i;:::-;24879:102;;24998:95;25089:3;25080:6;24998:95;:::i;:::-;24991:102;;25110:148;25254:3;25110:148;:::i;:::-;25103:155;;25275:3;25268:10;;24583:701;;;;;:::o;25290:522::-;25503:3;25525:148;25669:3;25525:148;:::i;:::-;25518:155;;25683:75;25754:3;25745:6;25683:75;:::i;:::-;25783:2;25778:3;25774:12;25767:19;;25803:3;25796:10;;25290:522;;;;:::o;25818:379::-;26002:3;26024:147;26167:3;26024:147;:::i;:::-;26017:154;;26188:3;26181:10;;25818:379;;;:::o;26203:222::-;26296:4;26334:2;26323:9;26319:18;26311:26;;26347:71;26415:1;26404:9;26400:17;26391:6;26347:71;:::i;:::-;26203:222;;;;:::o;26431:640::-;26626:4;26664:3;26653:9;26649:19;26641:27;;26678:71;26746:1;26735:9;26731:17;26722:6;26678:71;:::i;:::-;26759:72;26827:2;26816:9;26812:18;26803:6;26759:72;:::i;:::-;26841;26909:2;26898:9;26894:18;26885:6;26841:72;:::i;:::-;26960:9;26954:4;26950:20;26945:2;26934:9;26930:18;26923:48;26988:76;27059:4;27050:6;26988:76;:::i;:::-;26980:84;;26431:640;;;;;;;:::o;27077:210::-;27164:4;27202:2;27191:9;27187:18;27179:26;;27215:65;27277:1;27266:9;27262:17;27253:6;27215:65;:::i;:::-;27077:210;;;;:::o;27293:545::-;27466:4;27504:3;27493:9;27489:19;27481:27;;27518:71;27586:1;27575:9;27571:17;27562:6;27518:71;:::i;:::-;27599:68;27663:2;27652:9;27648:18;27639:6;27599:68;:::i;:::-;27677:72;27745:2;27734:9;27730:18;27721:6;27677:72;:::i;:::-;27759;27827:2;27816:9;27812:18;27803:6;27759:72;:::i;:::-;27293:545;;;;;;;:::o;27844:238::-;27945:4;27983:2;27972:9;27968:18;27960:26;;27996:79;28072:1;28061:9;28057:17;28048:6;27996:79;:::i;:::-;27844:238;;;;:::o;28088:313::-;28201:4;28239:2;28228:9;28224:18;28216:26;;28288:9;28282:4;28278:20;28274:1;28263:9;28259:17;28252:47;28316:78;28389:4;28380:6;28316:78;:::i;:::-;28308:86;;28088:313;;;;:::o;28407:419::-;28573:4;28611:2;28600:9;28596:18;28588:26;;28660:9;28654:4;28650:20;28646:1;28635:9;28631:17;28624:47;28688:131;28814:4;28688:131;:::i;:::-;28680:139;;28407:419;;;:::o;28832:::-;28998:4;29036:2;29025:9;29021:18;29013:26;;29085:9;29079:4;29075:20;29071:1;29060:9;29056:17;29049:47;29113:131;29239:4;29113:131;:::i;:::-;29105:139;;28832:419;;;:::o;29257:::-;29423:4;29461:2;29450:9;29446:18;29438:26;;29510:9;29504:4;29500:20;29496:1;29485:9;29481:17;29474:47;29538:131;29664:4;29538:131;:::i;:::-;29530:139;;29257:419;;;:::o;29682:::-;29848:4;29886:2;29875:9;29871:18;29863:26;;29935:9;29929:4;29925:20;29921:1;29910:9;29906:17;29899:47;29963:131;30089:4;29963:131;:::i;:::-;29955:139;;29682:419;;;:::o;30107:::-;30273:4;30311:2;30300:9;30296:18;30288:26;;30360:9;30354:4;30350:20;30346:1;30335:9;30331:17;30324:47;30388:131;30514:4;30388:131;:::i;:::-;30380:139;;30107:419;;;:::o;30532:::-;30698:4;30736:2;30725:9;30721:18;30713:26;;30785:9;30779:4;30775:20;30771:1;30760:9;30756:17;30749:47;30813:131;30939:4;30813:131;:::i;:::-;30805:139;;30532:419;;;:::o;30957:::-;31123:4;31161:2;31150:9;31146:18;31138:26;;31210:9;31204:4;31200:20;31196:1;31185:9;31181:17;31174:47;31238:131;31364:4;31238:131;:::i;:::-;31230:139;;30957:419;;;:::o;31382:::-;31548:4;31586:2;31575:9;31571:18;31563:26;;31635:9;31629:4;31625:20;31621:1;31610:9;31606:17;31599:47;31663:131;31789:4;31663:131;:::i;:::-;31655:139;;31382:419;;;:::o;31807:::-;31973:4;32011:2;32000:9;31996:18;31988:26;;32060:9;32054:4;32050:20;32046:1;32035:9;32031:17;32024:47;32088:131;32214:4;32088:131;:::i;:::-;32080:139;;31807:419;;;:::o;32232:::-;32398:4;32436:2;32425:9;32421:18;32413:26;;32485:9;32479:4;32475:20;32471:1;32460:9;32456:17;32449:47;32513:131;32639:4;32513:131;:::i;:::-;32505:139;;32232:419;;;:::o;32657:::-;32823:4;32861:2;32850:9;32846:18;32838:26;;32910:9;32904:4;32900:20;32896:1;32885:9;32881:17;32874:47;32938:131;33064:4;32938:131;:::i;:::-;32930:139;;32657:419;;;:::o;33082:::-;33248:4;33286:2;33275:9;33271:18;33263:26;;33335:9;33329:4;33325:20;33321:1;33310:9;33306:17;33299:47;33363:131;33489:4;33363:131;:::i;:::-;33355:139;;33082:419;;;:::o;33507:::-;33673:4;33711:2;33700:9;33696:18;33688:26;;33760:9;33754:4;33750:20;33746:1;33735:9;33731:17;33724:47;33788:131;33914:4;33788:131;:::i;:::-;33780:139;;33507:419;;;:::o;33932:::-;34098:4;34136:2;34125:9;34121:18;34113:26;;34185:9;34179:4;34175:20;34171:1;34160:9;34156:17;34149:47;34213:131;34339:4;34213:131;:::i;:::-;34205:139;;33932:419;;;:::o;34357:::-;34523:4;34561:2;34550:9;34546:18;34538:26;;34610:9;34604:4;34600:20;34596:1;34585:9;34581:17;34574:47;34638:131;34764:4;34638:131;:::i;:::-;34630:139;;34357:419;;;:::o;34782:::-;34948:4;34986:2;34975:9;34971:18;34963:26;;35035:9;35029:4;35025:20;35021:1;35010:9;35006:17;34999:47;35063:131;35189:4;35063:131;:::i;:::-;35055:139;;34782:419;;;:::o;35207:::-;35373:4;35411:2;35400:9;35396:18;35388:26;;35460:9;35454:4;35450:20;35446:1;35435:9;35431:17;35424:47;35488:131;35614:4;35488:131;:::i;:::-;35480:139;;35207:419;;;:::o;35632:::-;35798:4;35836:2;35825:9;35821:18;35813:26;;35885:9;35879:4;35875:20;35871:1;35860:9;35856:17;35849:47;35913:131;36039:4;35913:131;:::i;:::-;35905:139;;35632:419;;;:::o;36057:::-;36223:4;36261:2;36250:9;36246:18;36238:26;;36310:9;36304:4;36300:20;36296:1;36285:9;36281:17;36274:47;36338:131;36464:4;36338:131;:::i;:::-;36330:139;;36057:419;;;:::o;36482:::-;36648:4;36686:2;36675:9;36671:18;36663:26;;36735:9;36729:4;36725:20;36721:1;36710:9;36706:17;36699:47;36763:131;36889:4;36763:131;:::i;:::-;36755:139;;36482:419;;;:::o;36907:::-;37073:4;37111:2;37100:9;37096:18;37088:26;;37160:9;37154:4;37150:20;37146:1;37135:9;37131:17;37124:47;37188:131;37314:4;37188:131;:::i;:::-;37180:139;;36907:419;;;:::o;37332:::-;37498:4;37536:2;37525:9;37521:18;37513:26;;37585:9;37579:4;37575:20;37571:1;37560:9;37556:17;37549:47;37613:131;37739:4;37613:131;:::i;:::-;37605:139;;37332:419;;;:::o;37757:::-;37923:4;37961:2;37950:9;37946:18;37938:26;;38010:9;38004:4;38000:20;37996:1;37985:9;37981:17;37974:47;38038:131;38164:4;38038:131;:::i;:::-;38030:139;;37757:419;;;:::o;38182:::-;38348:4;38386:2;38375:9;38371:18;38363:26;;38435:9;38429:4;38425:20;38421:1;38410:9;38406:17;38399:47;38463:131;38589:4;38463:131;:::i;:::-;38455:139;;38182:419;;;:::o;38607:::-;38773:4;38811:2;38800:9;38796:18;38788:26;;38860:9;38854:4;38850:20;38846:1;38835:9;38831:17;38824:47;38888:131;39014:4;38888:131;:::i;:::-;38880:139;;38607:419;;;:::o;39032:::-;39198:4;39236:2;39225:9;39221:18;39213:26;;39285:9;39279:4;39275:20;39271:1;39260:9;39256:17;39249:47;39313:131;39439:4;39313:131;:::i;:::-;39305:139;;39032:419;;;:::o;39457:::-;39623:4;39661:2;39650:9;39646:18;39638:26;;39710:9;39704:4;39700:20;39696:1;39685:9;39681:17;39674:47;39738:131;39864:4;39738:131;:::i;:::-;39730:139;;39457:419;;;:::o;39882:::-;40048:4;40086:2;40075:9;40071:18;40063:26;;40135:9;40129:4;40125:20;40121:1;40110:9;40106:17;40099:47;40163:131;40289:4;40163:131;:::i;:::-;40155:139;;39882:419;;;:::o;40307:::-;40473:4;40511:2;40500:9;40496:18;40488:26;;40560:9;40554:4;40550:20;40546:1;40535:9;40531:17;40524:47;40588:131;40714:4;40588:131;:::i;:::-;40580:139;;40307:419;;;:::o;40732:::-;40898:4;40936:2;40925:9;40921:18;40913:26;;40985:9;40979:4;40975:20;40971:1;40960:9;40956:17;40949:47;41013:131;41139:4;41013:131;:::i;:::-;41005:139;;40732:419;;;:::o;41157:222::-;41250:4;41288:2;41277:9;41273:18;41265:26;;41301:71;41369:1;41358:9;41354:17;41345:6;41301:71;:::i;:::-;41157:222;;;;:::o;41385:129::-;41419:6;41446:20;;:::i;:::-;41436:30;;41475:33;41503:4;41495:6;41475:33;:::i;:::-;41385:129;;;:::o;41520:75::-;41553:6;41586:2;41580:9;41570:19;;41520:75;:::o;41601:307::-;41662:4;41752:18;41744:6;41741:30;41738:56;;;41774:18;;:::i;:::-;41738:56;41812:29;41834:6;41812:29;:::i;:::-;41804:37;;41896:4;41890;41886:15;41878:23;;41601:307;;;:::o;41914:308::-;41976:4;42066:18;42058:6;42055:30;42052:56;;;42088:18;;:::i;:::-;42052:56;42126:29;42148:6;42126:29;:::i;:::-;42118:37;;42210:4;42204;42200:15;42192:23;;41914:308;;;:::o;42228:98::-;42279:6;42313:5;42307:12;42297:22;;42228:98;;;:::o;42332:99::-;42384:6;42418:5;42412:12;42402:22;;42332:99;;;:::o;42437:168::-;42520:11;42554:6;42549:3;42542:19;42594:4;42589:3;42585:14;42570:29;;42437:168;;;;:::o;42611:147::-;42712:11;42749:3;42734:18;;42611:147;;;;:::o;42764:169::-;42848:11;42882:6;42877:3;42870:19;42922:4;42917:3;42913:14;42898:29;;42764:169;;;;:::o;42939:148::-;43041:11;43078:3;43063:18;;42939:148;;;;:::o;43093:305::-;43133:3;43152:20;43170:1;43152:20;:::i;:::-;43147:25;;43186:20;43204:1;43186:20;:::i;:::-;43181:25;;43340:1;43272:66;43268:74;43265:1;43262:81;43259:107;;;43346:18;;:::i;:::-;43259:107;43390:1;43387;43383:9;43376:16;;43093:305;;;;:::o;43404:185::-;43444:1;43461:20;43479:1;43461:20;:::i;:::-;43456:25;;43495:20;43513:1;43495:20;:::i;:::-;43490:25;;43534:1;43524:35;;43539:18;;:::i;:::-;43524:35;43581:1;43578;43574:9;43569:14;;43404:185;;;;:::o;43595:348::-;43635:7;43658:20;43676:1;43658:20;:::i;:::-;43653:25;;43692:20;43710:1;43692:20;:::i;:::-;43687:25;;43880:1;43812:66;43808:74;43805:1;43802:81;43797:1;43790:9;43783:17;43779:105;43776:131;;;43887:18;;:::i;:::-;43776:131;43935:1;43932;43928:9;43917:20;;43595:348;;;;:::o;43949:191::-;43989:4;44009:20;44027:1;44009:20;:::i;:::-;44004:25;;44043:20;44061:1;44043:20;:::i;:::-;44038:25;;44082:1;44079;44076:8;44073:34;;;44087:18;;:::i;:::-;44073:34;44132:1;44129;44125:9;44117:17;;43949:191;;;;:::o;44146:96::-;44183:7;44212:24;44230:5;44212:24;:::i;:::-;44201:35;;44146:96;;;:::o;44248:90::-;44282:7;44325:5;44318:13;44311:21;44300:32;;44248:90;;;:::o;44344:77::-;44381:7;44410:5;44399:16;;44344:77;;;:::o;44427:149::-;44463:7;44503:66;44496:5;44492:78;44481:89;;44427:149;;;:::o;44582:131::-;44629:7;44658:5;44647:16;;44664:43;44701:5;44664:43;:::i;:::-;44582:131;;;:::o;44719:126::-;44756:7;44796:42;44789:5;44785:54;44774:65;;44719:126;;;:::o;44851:77::-;44888:7;44917:5;44906:16;;44851:77;;;:::o;44934:86::-;44969:7;45009:4;45002:5;44998:16;44987:27;;44934:86;;;:::o;45026:131::-;45084:9;45117:34;45145:5;45117:34;:::i;:::-;45104:47;;45026:131;;;:::o;45163:154::-;45247:6;45242:3;45237;45224:30;45309:1;45300:6;45295:3;45291:16;45284:27;45163:154;;;:::o;45323:307::-;45391:1;45401:113;45415:6;45412:1;45409:13;45401:113;;;45500:1;45495:3;45491:11;45485:18;45481:1;45476:3;45472:11;45465:39;45437:2;45434:1;45430:10;45425:15;;45401:113;;;45532:6;45529:1;45526:13;45523:101;;;45612:1;45603:6;45598:3;45594:16;45587:27;45523:101;45372:258;45323:307;;;:::o;45636:320::-;45680:6;45717:1;45711:4;45707:12;45697:22;;45764:1;45758:4;45754:12;45785:18;45775:81;;45841:4;45833:6;45829:17;45819:27;;45775:81;45903:2;45895:6;45892:14;45872:18;45869:38;45866:84;;;45922:18;;:::i;:::-;45866:84;45687:269;45636:320;;;:::o;45962:281::-;46045:27;46067:4;46045:27;:::i;:::-;46037:6;46033:40;46175:6;46163:10;46160:22;46139:18;46127:10;46124:34;46121:62;46118:88;;;46186:18;;:::i;:::-;46118:88;46226:10;46222:2;46215:22;46005:238;45962:281;;:::o;46249:233::-;46288:3;46311:24;46329:5;46311:24;:::i;:::-;46302:33;;46357:66;46350:5;46347:77;46344:103;;;46427:18;;:::i;:::-;46344:103;46474:1;46467:5;46463:13;46456:20;;46249:233;;;:::o;46488:100::-;46527:7;46556:26;46576:5;46556:26;:::i;:::-;46545:37;;46488:100;;;:::o;46594:79::-;46633:7;46662:5;46651:16;;46594:79;;;:::o;46679:94::-;46718:7;46747:20;46761:5;46747:20;:::i;:::-;46736:31;;46679:94;;;:::o;46779:176::-;46811:1;46828:20;46846:1;46828:20;:::i;:::-;46823:25;;46862:20;46880:1;46862:20;:::i;:::-;46857:25;;46901:1;46891:35;;46906:18;;:::i;:::-;46891:35;46947:1;46944;46940:9;46935:14;;46779:176;;;;:::o;46961:180::-;47009:77;47006:1;46999:88;47106:4;47103:1;47096:15;47130:4;47127:1;47120:15;47147:180;47195:77;47192:1;47185:88;47292:4;47289:1;47282:15;47316:4;47313:1;47306:15;47333:180;47381:77;47378:1;47371:88;47478:4;47475:1;47468:15;47502:4;47499:1;47492:15;47519:180;47567:77;47564:1;47557:88;47664:4;47661:1;47654:15;47688:4;47685:1;47678:15;47705:180;47753:77;47750:1;47743:88;47850:4;47847:1;47840:15;47874:4;47871:1;47864:15;47891:180;47939:77;47936:1;47929:88;48036:4;48033:1;48026:15;48060:4;48057:1;48050:15;48077:117;48186:1;48183;48176:12;48200:117;48309:1;48306;48299:12;48323:117;48432:1;48429;48422:12;48446:117;48555:1;48552;48545:12;48569:102;48610:6;48661:2;48657:7;48652:2;48645:5;48641:14;48637:28;48627:38;;48569:102;;;:::o;48677:94::-;48710:8;48758:5;48754:2;48750:14;48729:35;;48677:94;;;:::o;48777:167::-;48917:19;48913:1;48905:6;48901:14;48894:43;48777:167;:::o;48950:214::-;49090:66;49086:1;49078:6;49074:14;49067:90;48950:214;:::o;49170:237::-;49310:34;49306:1;49298:6;49294:14;49287:58;49379:20;49374:2;49366:6;49362:15;49355:45;49170:237;:::o;49413:225::-;49553:34;49549:1;49541:6;49537:14;49530:58;49622:8;49617:2;49609:6;49605:15;49598:33;49413:225;:::o;49644:178::-;49784:30;49780:1;49772:6;49768:14;49761:54;49644:178;:::o;49828:220::-;49968:34;49964:1;49956:6;49952:14;49945:58;50037:3;50032:2;50024:6;50020:15;50013:28;49828:220;:::o;50054:170::-;50194:22;50190:1;50182:6;50178:14;50171:46;50054:170;:::o;50230:223::-;50370:34;50366:1;50358:6;50354:14;50347:58;50439:6;50434:2;50426:6;50422:15;50415:31;50230:223;:::o;50459:175::-;50599:27;50595:1;50587:6;50583:14;50576:51;50459:175;:::o;50640:180::-;50780:32;50776:1;50768:6;50764:14;50757:56;50640:180;:::o;50826:222::-;50966:34;50962:1;50954:6;50950:14;50943:58;51035:5;51030:2;51022:6;51018:15;51011:30;50826:222;:::o;51054:220::-;51194:34;51190:1;51182:6;51178:14;51171:58;51263:3;51258:2;51250:6;51246:15;51239:28;51054:220;:::o;51280:231::-;51420:34;51416:1;51408:6;51404:14;51397:58;51489:14;51484:2;51476:6;51472:15;51465:39;51280:231;:::o;51517:243::-;51657:34;51653:1;51645:6;51641:14;51634:58;51726:26;51721:2;51713:6;51709:15;51702:51;51517:243;:::o;51766:301::-;51906:34;51902:1;51894:6;51890:14;51883:58;51975:34;51970:2;51962:6;51958:15;51951:59;52044:15;52039:2;52031:6;52027:15;52020:40;51766:301;:::o;52073:229::-;52213:34;52209:1;52201:6;52197:14;52190:58;52282:12;52277:2;52269:6;52265:15;52258:37;52073:229;:::o;52308:228::-;52448:34;52444:1;52436:6;52432:14;52425:58;52517:11;52512:2;52504:6;52500:15;52493:36;52308:228;:::o;52542:182::-;52682:34;52678:1;52670:6;52666:14;52659:58;52542:182;:::o;52730:225::-;52870:34;52866:1;52858:6;52854:14;52847:58;52939:8;52934:2;52926:6;52922:15;52915:33;52730:225;:::o;52961:231::-;53101:34;53097:1;53089:6;53085:14;53078:58;53170:14;53165:2;53157:6;53153:15;53146:39;52961:231;:::o;53198:155::-;53338:7;53334:1;53326:6;53322:14;53315:31;53198:155;:::o;53359:167::-;53499:19;53495:1;53487:6;53483:14;53476:43;53359:167;:::o;53532:182::-;53672:34;53668:1;53660:6;53656:14;53649:58;53532:182;:::o;53720:228::-;53860:34;53856:1;53848:6;53844:14;53837:58;53929:11;53924:2;53916:6;53912:15;53905:36;53720:228;:::o;53954:234::-;54094:34;54090:1;54082:6;54078:14;54071:58;54163:17;54158:2;54150:6;54146:15;54139:42;53954:234;:::o;54194:300::-;54334:34;54330:1;54322:6;54318:14;54311:58;54403:34;54398:2;54390:6;54386:15;54379:59;54472:14;54467:2;54459:6;54455:15;54448:39;54194:300;:::o;54500:220::-;54640:34;54636:1;54628:6;54624:14;54617:58;54709:3;54704:2;54696:6;54692:15;54685:28;54500:220;:::o;54726:226::-;54866:34;54862:1;54854:6;54850:14;54843:58;54935:9;54930:2;54922:6;54918:15;54911:34;54726:226;:::o;54958:114::-;;:::o;55078:236::-;55218:34;55214:1;55206:6;55202:14;55195:58;55287:19;55282:2;55274:6;55270:15;55263:44;55078:236;:::o;55320:300::-;55460:34;55456:1;55448:6;55444:14;55437:58;55529:34;55524:2;55516:6;55512:15;55505:59;55598:14;55593:2;55585:6;55581:15;55574:39;55320:300;:::o;55626:221::-;55766:34;55762:1;55754:6;55750:14;55743:58;55835:4;55830:2;55822:6;55818:15;55811:29;55626:221;:::o;55853:182::-;55993:34;55989:1;55981:6;55977:14;55970:58;55853:182;:::o;56041:115::-;56124:1;56117:5;56114:12;56104:46;;56130:18;;:::i;:::-;56104:46;56041:115;:::o;56162:122::-;56235:24;56253:5;56235:24;:::i;:::-;56228:5;56225:35;56215:63;;56274:1;56271;56264:12;56215:63;56162:122;:::o;56290:116::-;56360:21;56375:5;56360:21;:::i;:::-;56353:5;56350:32;56340:60;;56396:1;56393;56386:12;56340:60;56290:116;:::o;56412:122::-;56485:24;56503:5;56485:24;:::i;:::-;56478:5;56475:35;56465:63;;56524:1;56521;56514:12;56465:63;56412:122;:::o;56540:120::-;56612:23;56629:5;56612:23;:::i;:::-;56605:5;56602:34;56592:62;;56650:1;56647;56640:12;56592:62;56540:120;:::o;56666:122::-;56739:24;56757:5;56739:24;:::i;:::-;56732:5;56729:35;56719:63;;56778:1;56775;56768:12;56719:63;56666:122;:::o;56794:118::-;56865:22;56881:5;56865:22;:::i;:::-;56858:5;56855:33;56845:61;;56902:1;56899;56892:12;56845:61;56794:118;:::o
Swarm Source
ipfs://4153a9a1415440b5c35c120c7beb466a9779dc38e525e309b5b94fd524da8264
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.