Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13988686 | 927 days ago | IN | 0 ETH | 0.81183574 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
testNftFactory
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-12 */ // File: TestContracts/ProxyTarget.sol pragma solidity 0.8.7; /// @dev Proxy for NFT Factory contract ProxyTarget { // Storage for this proxy bytes32 internal constant IMPLEMENTATION_SLOT = bytes32(0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc); bytes32 internal constant ADMIN_SLOT = bytes32(0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103); function _getAddress(bytes32 key) internal view returns (address add) { add = address(uint160(uint256(_getSlotValue(key)))); } function _getSlotValue(bytes32 slot_) internal view returns (bytes32 value_) { assembly { value_ := sload(slot_) } } function _setSlotValue(bytes32 slot_, bytes32 value_) internal { assembly { sstore(slot_, value_) } } } // File: base/IVRF.sol //SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; interface IVRF{ function initiateRandomness(uint _tokenId,uint _timestamp) external view returns(uint); function stealRandomness() external view returns(uint); function getCurrentIndex() external view returns(uint); } // File: base/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: base/IWhitelist.sol pragma solidity ^0.8.0; interface IWhitelist{ struct Whitelist{ address userAddress; bytes signature; } function getSigner(Whitelist memory whitelist) external view returns(address); } // File: base/IGameEngine.sol pragma solidity ^0.8.0; interface GameEngine{ function stake ( uint tokenId ) external; function alertStake (uint tokenId) external; } // File: base/IMetadata.sol pragma solidity ^0.8.0; interface IMetadata{ function addMetadata(uint8 tokenType,uint8 level,uint tokenID) external; function createRandomZombie(uint8 level) external returns(uint8[] memory traits); function createRandomSurvivor(uint8 level) external returns(uint8[] memory traits); function getTokenURI(uint tokenId) external view returns (string memory); function changeNft(uint tokenID, uint8 nftType, uint8 level, bool canClaim, uint stakedTime, uint lastClaimTime) external; function getToken(uint256 _tokenId) external view returns(uint8, uint8, bool, uint,uint); } // File: base/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, uint tokenId, bytes calldata data ) external returns (bytes4); } // File: base/IERC165.sol pragma solidity ^0.8.0; 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: base/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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: base/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(uint tokenId) external view returns (string memory); } // File: base/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: base/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint` to its ASCII `string` decimal representation. */ function toString(uint 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"; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint` to its ASCII `string` hexadecimal representation. */ function toHexString(uint value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint temp = value; uint length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint value, uint length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint 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: base/Address.sol pragma solidity ^0.8.0; 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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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" ); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue( address target, bytes memory data, uint256 weiValue, string memory errorMessage ) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value : weiValue}(data); 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: base/IERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); function burn(uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: base/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 GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () {} function _msgSender() internal view returns (address payable) { return payable (msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: base/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint; // Token name string internal _name; // Token symbol string internal _symbol; // Mapping from token ID to owner address mapping(uint => address) private _owners; // Mapping owner address to token count mapping(address => uint) private _balances; // Mapping from token ID to approved address mapping(uint => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @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 (uint) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint 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(uint tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint 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(uint 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, uint 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, uint tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint 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, uint 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(uint 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, uint 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, uint tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint 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, uint 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(uint 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, uint 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, uint 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 uint 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, uint tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "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, uint tokenId ) internal virtual {} } // File: base/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. */ contract Ownable is Context { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view 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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: TestContracts/testnftFactory.sol /** * Author : Lil Ye, Ace, Anyx, Elmontos */ pragma solidity ^0.8.0; contract testNftFactory is Ownable, ERC721, ProxyTarget { using Strings for uint; ////nfts mapping (uint => address) public tokenOwner; mapping (uint=>uint) public actionTimestamp; //COUNTS using Counters for Counters.Counter; Counters.Counter private tokenId_; //SALES bool public isPresale = true; uint public SUP_THRESHOLD = 10000; //todo place the finalised price // To-change -> from 0 eth to 0.069 eth uint public HungerBrainz_MAINSALE_PRICE = 0.069 ether; //priceInMainSale mapping(address=>uint) public userPurchase; //AMOUNT uint[2] public amount; //CONTRACT GameEngine game; IERC20 SUP; IWhitelist whitelist; IMetadata metadataHandler; IVRF randomNumberGenerated; function initialize(address _gameAddress, address _tokenAddress,address _whitelist,address _metadata,address _vrf) external { require(msg.sender == _getAddress(ADMIN_SLOT), "not admin"); _name = "HungerBrainz"; _symbol = "HBZ"; _owner = msg.sender; HungerBrainz_MAINSALE_PRICE = 0.069 ether; isPresale = true; SUP_THRESHOLD = 10000; game = GameEngine(_gameAddress); SUP = IERC20(_tokenAddress); whitelist = IWhitelist(_whitelist); metadataHandler = IMetadata(_metadata); randomNumberGenerated = IVRF(_vrf); } function currentTokenID() external view returns(uint){ return tokenId_.current(); } function tokenOwnerSetter(uint tokenId, address owner_) external { require(_msgSender() == address(game)); tokenOwner[tokenId] = owner_; } function setContract(address _gameAddress, address _tokenAddress,address _whitelist,address _metadata,address _vrf) external onlyOwner { game = GameEngine(_gameAddress); SUP = IERC20(_tokenAddress); whitelist = IWhitelist(_whitelist); metadataHandler = IMetadata(_metadata); randomNumberGenerated = IVRF(_vrf); } function burnNFT(uint tokenId) external { require (_msgSender() == address(game), "Not GameAddress"); //console.log("Tries burning"); _burn(tokenId); } function setTimeStamp(uint tokenId) external { require(msg.sender == address(game)); actionTimestamp[tokenId] = randomNumberGenerated.getCurrentIndex(); } function setPresale(bool presale) external onlyOwner{ isPresale = presale; } function setSupThreshold(uint newThreshold) external onlyOwner { SUP_THRESHOLD = newThreshold; } function buyAndStake(bool stake,uint8 tokenType, uint tokenAmount,address receiver) external payable { // By calling this function, you agreed that you have read and accepted the terms & conditions // available at this link: https://hungerbrainz.com/terms require(tokenType < 2,"Invalid type"); require(tokenId_.current() <= SUP_THRESHOLD,"Buy using SUP"); if(isPresale){ require(msg.sender == address(whitelist),"Not whitelisted"); require(userPurchase[receiver] + tokenAmount <= 3,"Purchase limit"); } else{ require (HungerBrainz_MAINSALE_PRICE*tokenAmount <= msg.value, "INSUFFICIENT_ETH"); require(msg.sender != address(whitelist),"Not presale"); require(userPurchase[msg.sender] + tokenAmount <= 13,"Purchase limit"); receiver = msg.sender; } if (isApprovedForAll(_msgSender(),address(game))==false) { setApprovalForAll(address(game), true); } amount[tokenType] = amount[tokenType]+tokenAmount; userPurchase[receiver] += tokenAmount; if(stake) for (uint i=0; i<tokenAmount; i++) { tokenId_.increment(); _safeMint(address(game),tokenId_.current()); metadataHandler.addMetadata(1,tokenType,tokenId_.current()); tokenOwner[tokenId_.current()] = receiver; game.alertStake(tokenId_.current()); } else{ for (uint i =0;i<tokenAmount;i++) { tokenId_.increment(); _safeMint(receiver, tokenId_.current()); metadataHandler.addMetadata(1,tokenType,tokenId_.current()); tokenOwner[tokenId_.current()]=receiver; } } } function buyUsingSUPAndStake(bool stake, uint8 tokenType, uint tokenAmount) external { // By calling this function, you agreed that you have read and accepted the terms & conditions // available at this link: https://hungerbrainz.com/terms require(tokenType < 2,"Invalid type"); require(tokenId_.current() > SUP_THRESHOLD,"Buy using Eth"); SUP.transferFrom(_msgSender(), address(this), tokenAmount*1000 ether); SUP.burn(tokenAmount* 1000 ether); //1000 ether amount[tokenType] = amount[tokenType]+tokenAmount; for (uint i=0; i< tokenAmount; i++) { if (stake) { tokenId_.increment(); _safeMint(address(game), tokenId_.current()); metadataHandler.addMetadata(1,tokenType,tokenId_.current()); game.alertStake(tokenId_.current()); } else { tokenId_.increment(); _safeMint(msg.sender,tokenId_.current()); metadataHandler.addMetadata(1,tokenType,tokenId_.current()); } tokenOwner[tokenId_.current()]=msg.sender; } } function tokenOwnerCall(uint tokenId) external view returns (address) { return tokenOwner[tokenId]; } function withdraw() external { uint balance = address(this).balance; require(balance > 0); address payable _devAddress = payable (0x3384392f12f90C185a43861E0547aFF77BD5134A); uint devFees = (balance*(10))/(100); _devAddress.transfer(devFees); payable(owner()).transfer(address(this).balance); } //Better if Game Address directly calls metadata contract function restrictedChangeNft(uint tokenID, uint8 nftType, uint8 level, bool canClaim, uint stakedTime, uint lastClaimTime) external { require(msg.sender == address(game),"Call restricted"); metadataHandler.changeNft(tokenID,nftType,level,canClaim,stakedTime,lastClaimTime); } //#endregion function tokenURI(uint tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), "Cannot query non-existent token"); return metadataHandler.getTokenURI(tokenId); } function setHungerBrainz_MAINSALE_PRICE(uint _price) external onlyOwner{ HungerBrainz_MAINSALE_PRICE = _price; } function _transfer( address from, address to, uint tokenId ) internal override{ if(to!=address(game) && to!=tokenOwner[tokenId]){ tokenOwner[tokenId] = to; } super._transfer(from,to,tokenId); } function _mint(address to, uint tokenId) internal override{ super._mint(to,tokenId); actionTimestamp[tokenId] = randomNumberGenerated.getCurrentIndex(); } function _burn(uint tokenId) internal override { (uint8 nftType,,,,)=metadataHandler.getToken(tokenId); amount[nftType]--; tokenOwner[tokenId] = address(0); super._burn(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"HungerBrainz_MAINSALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUP_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"actionTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"amount","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"stake","type":"bool"},{"internalType":"uint8","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"buyAndStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"stake","type":"bool"},{"internalType":"uint8","name":"tokenType","type":"uint8"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"buyUsingSUPAndStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gameAddress","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"address","name":"_metadata","type":"address"},{"internalType":"address","name":"_vrf","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"uint8","name":"nftType","type":"uint8"},{"internalType":"uint8","name":"level","type":"uint8"},{"internalType":"bool","name":"canClaim","type":"bool"},{"internalType":"uint256","name":"stakedTime","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"}],"name":"restrictedChangeNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gameAddress","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_whitelist","type":"address"},{"internalType":"address","name":"_metadata","type":"address"},{"internalType":"address","name":"_vrf","type":"address"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setHungerBrainz_MAINSALE_PRICE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presale","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"setSupThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setTimeStamp","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":"","type":"uint256"}],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenOwnerCall","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"name":"tokenOwnerSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001600a60006101000a81548160ff021916908315150217905550612710600b5566f5232269808000600c553480156200003d57600080fd5b50600062000050620000f460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620000fc565b600033905090565b6157d7806200010c6000396000f3fe60806040526004361061021a5760003560e01c80638da5cb5b11610123578063bb62115e116100ab578063e985e9c51161006f578063e985e9c5146107e0578063f1525e401461081d578063f2fde38b14610848578063f48238b414610871578063fe92404a1461089c5761021a565b8063bb62115e146106e9578063c2eb275c14610714578063c378a9771461073d578063c54e73e31461077a578063c87b56dd146107a35761021a565b8063a22cb465116100f2578063a22cb46514610608578063b484eff714610631578063b88d4fde1461066e578063b894223b14610697578063ba7133f9146106c05761021a565b80638da5cb5b1461055e578063952b1f6b1461058957806395364a84146105b257806395d89b41146105dd5761021a565b80632257c0e2116101a657806342842e0e1161017557806342842e0e146104675780636352211e1461049057806370a08231146104cd578063715018a61461050a5780638b0d0258146105215761021a565b80632257c0e2146103c157806323b872dd146103fe5780632890e0d7146104275780633ccfd60b146104505761021a565b80630b1b806b116101ed5780630b1b806b146102ed57806313e43bc6146103095780631459457a146103325780631caaa4871461035b57806320eb2a87146103985761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190614130565b6108c5565b604051610253919061486d565b60405180910390f35b34801561026857600080fd5b506102716109a7565b60405161027e91906148bf565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906141d3565b610a39565b6040516102bb91906147cf565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613fdc565b610abe565b005b610307600480360381019061030291906140c9565b610bd6565b005b34801561031557600080fd5b50610330600480360381019061032b91906141d3565b611346565b005b34801561033e57600080fd5b5061035960048036038101906103549190613e4b565b61145a565b005b34801561036757600080fd5b50610382600480360381019061037d91906141d3565b611749565b60405161038f91906147cf565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613e4b565b61177c565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906141d3565b61195d565b6040516103f59190614c21565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613ec6565b611975565b005b34801561043357600080fd5b5061044e600480360381019061044991906141d3565b6119d5565b005b34801561045c57600080fd5b50610465611a78565b005b34801561047357600080fd5b5061048e60048036038101906104899190613ec6565b611b5a565b005b34801561049c57600080fd5b506104b760048036038101906104b291906141d3565b611b7a565b6040516104c491906147cf565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613dde565b611c2c565b6040516105019190614c21565b60405180910390f35b34801561051657600080fd5b5061051f611ce4565b005b34801561052d57600080fd5b50610548600480360381019061054391906141d3565b611e37565b6040516105559190614c21565b60405180910390f35b34801561056a57600080fd5b50610573611e52565b60405161058091906147cf565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab91906141d3565b611e7b565b005b3480156105be57600080fd5b506105c7611f1a565b6040516105d4919061486d565b60405180910390f35b3480156105e957600080fd5b506105f2611f2d565b6040516105ff91906148bf565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190613f9c565b611fbf565b005b34801561063d57600080fd5b5061065860048036038101906106539190613dde565b612140565b6040516106659190614c21565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613f19565b612158565b005b3480156106a357600080fd5b506106be60048036038101906106b9919061422d565b6121ba565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906141d3565b612271565b005b3480156106f557600080fd5b506106fe612310565b60405161070b9190614c21565b60405180910390f35b34801561072057600080fd5b5061073b60048036038101906107369190614076565b612321565b005b34801561074957600080fd5b50610764600480360381019061075f91906141d3565b612836565b60405161077191906147cf565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061401c565b612873565b005b3480156107af57600080fd5b506107ca60048036038101906107c591906141d3565b612925565b6040516107d791906148bf565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613e0b565b612a26565b604051610814919061486d565b60405180910390f35b34801561082957600080fd5b50610832612aba565b60405161083f9190614c21565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613dde565b612ac0565b005b34801561087d57600080fd5b50610886612b61565b6040516108939190614c21565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be919061426d565b612b67565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a0575061099f82612c96565b5b9050919050565b6060600180546109b690614fa6565b80601f01602080910402602001604051908101604052809291908181526020018280546109e290614fa6565b8015610a2f5780601f10610a0457610100808354040283529160200191610a2f565b820191906000526020600020905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b6000610a4482612d00565b610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90614ac1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac982611b7a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3190614b61565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b59612d6c565b73ffffffffffffffffffffffffffffffffffffffff161480610b885750610b8781610b82612d6c565b612a26565b5b610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe906149c1565b60405180910390fd5b610bd18383612d74565b505050565b60028360ff1610610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614bc1565b60405180910390fd5b600b54610c296009612e2d565b1115610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190614b41565b60405180910390fd5b600a60009054906101000a900460ff1615610da257601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906149e1565b60405180910390fd5b600382600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d5c9190614d5c565b1115610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490614a61565b60405180910390fd5b610f15565b3482600c54610db19190614de3565b1115610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990614c01565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90614a81565b60405180910390fd5b600d82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed09190614d5c565b1115610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890614a61565b60405180910390fd5b3390505b60001515610f4c610f24612d6c565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612a26565b15151415610f8257610f81601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001611fbf565b5b81600e8460ff1660028110610f9a57610f996150df565b5b0154610fa69190614d5c565b600e8460ff1660028110610fbd57610fbc6150df565b5b018190555081600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110119190614d5c565b92505081905550831561120d5760005b82811015611207576110336009612e3b565b611068601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166110636009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001866110b36009612e2d565b6040518463ffffffff1660e01b81526004016110d193929190614888565b600060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b5050505081600760006111126009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f8e93246111a66009612e2d565b6040518263ffffffff1660e01b81526004016111c29190614c21565b600060405180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b5050505080806111ff90615009565b915050611021565b50611340565b60005b8281101561133e576112226009612e3b565b611235826112306009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001866112806009612e2d565b6040518463ffffffff1660e01b815260040161129e93929190614888565b600060405180830381600087803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b5050505081600760006112df6009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061133690615009565b915050611210565b505b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113a057600080fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9005ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561140857600080fd5b505afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114409190614200565b600860008381526020019081526020016000208190555050565b6114867fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b612e6f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90614be1565b60405180910390fd5b6040518060400160405280600c81526020017f48756e676572427261696e7a00000000000000000000000000000000000000008152506001908051906020019061153e929190613b9e565b506040518060400160405280600381526020017f48425a00000000000000000000000000000000000000000000000000000000008152506002908051906020019061158a929190613b9e565b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066f5232269808000600c819055506001600a60006101000a81548160ff021916908315150217905550612710600b8190555084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611784612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614ae1565b60405180910390fd5b84601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60086020528060005260406000206000915090505481565b611986611980612d6c565b82612e84565b6119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90614b81565b60405180910390fd5b6119d0838383612f62565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a16612d6c565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614941565b60405180910390fd5b611a7581613087565b50565b600047905060008111611a8a57600080fd5b6000733384392f12f90c185a43861e0547aff77bd5134a905060006064600a84611ab49190614de3565b611abe9190614db2565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b06573d6000803e3d6000fd5b50611b0f611e52565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611b54573d6000803e3d6000fd5b50505050565b611b7583838360405180602001604052806000815250612158565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614a21565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490614a01565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cec612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e8160028110611e4757600080fd5b016000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e83612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790614ae1565b60405180910390fd5b80600b8190555050565b600a60009054906101000a900460ff1681565b606060028054611f3c90614fa6565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6890614fa6565b8015611fb55780601f10611f8a57610100808354040283529160200191611fb5565b820191906000526020600020905b815481529060010190602001808311611f9857829003601f168201915b5050505050905090565b611fc7612d6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614981565b60405180910390fd5b8060066000612042612d6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120ef612d6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612134919061486d565b60405180910390a35050565b600d6020528060005260406000206000915090505481565b612169612163612d6c565b83612e84565b6121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614b81565b60405180910390fd5b6121b4848484846131c8565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121fb612d6c565b73ffffffffffffffffffffffffffffffffffffffff161461221b57600080fd5b806007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612279612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614ae1565b60405180910390fd5b80600c8190555050565b600061231c6009612e2d565b905090565b60028260ff1610612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614bc1565b60405180910390fd5b600b546123746009612e2d565b116123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab90614ba1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6123fa612d6c565b30683635c9adc5dea00000856124109190614de3565b6040518463ffffffff1660e01b815260040161242e939291906147ea565b602060405180830381600087803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124809190614049565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68683635c9adc5dea00000836124d49190614de3565b6040518263ffffffff1660e01b81526004016124f09190614c21565b602060405180830381600087803b15801561250a57600080fd5b505af115801561251e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125429190614049565b5080600e8360ff166002811061255b5761255a6150df565b5b01546125679190614d5c565b600e8360ff166002811061257e5761257d6150df565b5b018190555060005b818110156128305783156127095761259e6009612e3b565b6125d3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166125ce6009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f60018561261e6009612e2d565b6040518463ffffffff1660e01b815260040161263c93929190614888565b600060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b50505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f8e93246126b66009612e2d565b6040518263ffffffff1660e01b81526004016126d29190614c21565b600060405180830381600087803b1580156126ec57600080fd5b505af1158015612700573d6000803e3d6000fd5b505050506127c2565b6127136009612e3b565b612726336127216009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001856127716009612e2d565b6040518463ffffffff1660e01b815260040161278f93929190614888565b600060405180830381600087803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505050505b33600760006127d16009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061282890615009565b915050612586565b50505050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61287b612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614ae1565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b606061293082612d00565b61296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296690614b21565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bb3a24d836040518263ffffffff1660e01b81526004016129ca9190614c21565b60006040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612a1f919061418a565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b612ac8612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4c90614ae1565b60405180910390fd5b612b5e81613224565b50565b600c5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90614aa1565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638576492f8787878787876040518763ffffffff1660e01b8152600401612c5c96959493929190614c3c565b600060405180830381600087803b158015612c7657600080fd5b505af1158015612c8a573d6000803e3d6000fd5b50505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de783611b7a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612e6b828260405180602001604052806000815250613351565b5050565b6000612e7a826133ac565b60001c9050919050565b6000612e8f82612d00565b612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec5906149a1565b60405180910390fd5b6000612ed983611b7a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f4857508373ffffffffffffffffffffffffffffffffffffffff16612f3084610a39565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f595750612f588185612a26565b5b91505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561301f57506007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561307757816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6130828383836133b7565b505050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4b50cb8836040518263ffffffff1660e01b81526004016130e49190614c21565b60a06040518083038186803b1580156130fc57600080fd5b505afa158015613110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313491906142fa565b505050509050600e8160ff1660028110613151576131506150df565b5b01600081548092919061316390614f7c565b919050555060006007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506131c482613613565b5050565b6131d3848484612f62565b6131df84848484613724565b61321e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613215906148e1565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328b90614901565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61335b83836138bb565b6133686000848484613724565b6133a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339e906148e1565b60405180910390fd5b505050565b600081549050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133d782611b7a565b73ffffffffffffffffffffffffffffffffffffffff161461342d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342490614b01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561349d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349490614961565b60405180910390fd5b6134a8838383613980565b6134b3600082612d74565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135039190614e3d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461355a9190614d5c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061361e82611b7a565b905061362c81600084613980565b613637600083612d74565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136879190614e3d565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006137458473ffffffffffffffffffffffffffffffffffffffff16613985565b156138ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261376e612d6c565b8786866040518563ffffffff1660e01b81526004016137909493929190614821565b602060405180830381600087803b1580156137aa57600080fd5b505af19250505080156137db57506040513d601f19601f820116820180604052508101906137d8919061415d565b60015b61385e573d806000811461380b576040519150601f19603f3d011682016040523d82523d6000602084013e613810565b606091505b50600081511415613856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384d906148e1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138b3565b600190505b949350505050565b6138c582826139d0565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9005ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561392d57600080fd5b505afa158015613941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139659190614200565b60086000838152602001908152602001600020819055505050565b505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156139c757506000801b8214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3790614a41565b60405180910390fd5b613a4981612d00565b15613a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8090614921565b60405180910390fd5b613a9560008383613980565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae59190614d5c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613baa90614fa6565b90600052602060002090601f016020900481019282613bcc5760008555613c13565b82601f10613be557805160ff1916838001178555613c13565b82800160010185558215613c13579182015b82811115613c12578251825591602001919060010190613bf7565b5b509050613c209190613c24565b5090565b5b80821115613c3d576000816000905550600101613c25565b5090565b6000613c54613c4f84614cc2565b614c9d565b905082815260208101848484011115613c7057613c6f615142565b5b613c7b848285614f3a565b509392505050565b6000613c96613c9184614cf3565b614c9d565b905082815260208101848484011115613cb257613cb1615142565b5b613cbd848285614f49565b509392505050565b600081359050613cd48161572e565b92915050565b600081359050613ce981615745565b92915050565b600081519050613cfe81615745565b92915050565b600081359050613d138161575c565b92915050565b600081519050613d288161575c565b92915050565b600082601f830112613d4357613d4261513d565b5b8135613d53848260208601613c41565b91505092915050565b600082601f830112613d7157613d7061513d565b5b8151613d81848260208601613c83565b91505092915050565b600081359050613d9981615773565b92915050565b600081519050613dae81615773565b92915050565b600081359050613dc38161578a565b92915050565b600081519050613dd88161578a565b92915050565b600060208284031215613df457613df361514c565b5b6000613e0284828501613cc5565b91505092915050565b60008060408385031215613e2257613e2161514c565b5b6000613e3085828601613cc5565b9250506020613e4185828601613cc5565b9150509250929050565b600080600080600060a08688031215613e6757613e6661514c565b5b6000613e7588828901613cc5565b9550506020613e8688828901613cc5565b9450506040613e9788828901613cc5565b9350506060613ea888828901613cc5565b9250506080613eb988828901613cc5565b9150509295509295909350565b600080600060608486031215613edf57613ede61514c565b5b6000613eed86828701613cc5565b9350506020613efe86828701613cc5565b9250506040613f0f86828701613d8a565b9150509250925092565b60008060008060808587031215613f3357613f3261514c565b5b6000613f4187828801613cc5565b9450506020613f5287828801613cc5565b9350506040613f6387828801613d8a565b925050606085013567ffffffffffffffff811115613f8457613f83615147565b5b613f9087828801613d2e565b91505092959194509250565b60008060408385031215613fb357613fb261514c565b5b6000613fc185828601613cc5565b9250506020613fd285828601613cda565b9150509250929050565b60008060408385031215613ff357613ff261514c565b5b600061400185828601613cc5565b925050602061401285828601613d8a565b9150509250929050565b6000602082840312156140325761403161514c565b5b600061404084828501613cda565b91505092915050565b60006020828403121561405f5761405e61514c565b5b600061406d84828501613cef565b91505092915050565b60008060006060848603121561408f5761408e61514c565b5b600061409d86828701613cda565b93505060206140ae86828701613db4565b92505060406140bf86828701613d8a565b9150509250925092565b600080600080608085870312156140e3576140e261514c565b5b60006140f187828801613cda565b945050602061410287828801613db4565b935050604061411387828801613d8a565b925050606061412487828801613cc5565b91505092959194509250565b6000602082840312156141465761414561514c565b5b600061415484828501613d04565b91505092915050565b6000602082840312156141735761417261514c565b5b600061418184828501613d19565b91505092915050565b6000602082840312156141a05761419f61514c565b5b600082015167ffffffffffffffff8111156141be576141bd615147565b5b6141ca84828501613d5c565b91505092915050565b6000602082840312156141e9576141e861514c565b5b60006141f784828501613d8a565b91505092915050565b6000602082840312156142165761421561514c565b5b600061422484828501613d9f565b91505092915050565b600080604083850312156142445761424361514c565b5b600061425285828601613d8a565b925050602061426385828601613cc5565b9150509250929050565b60008060008060008060c0878903121561428a5761428961514c565b5b600061429889828a01613d8a565b96505060206142a989828a01613db4565b95505060406142ba89828a01613db4565b94505060606142cb89828a01613cda565b93505060806142dc89828a01613d8a565b92505060a06142ed89828a01613d8a565b9150509295509295509295565b600080600080600060a086880312156143165761431561514c565b5b600061432488828901613dc9565b955050602061433588828901613dc9565b945050604061434688828901613cef565b935050606061435788828901613d9f565b925050608061436888828901613d9f565b9150509295509295909350565b61437e81614ef2565b82525050565b61438d81614e71565b82525050565b61439c81614e83565b82525050565b60006143ad82614d24565b6143b78185614d3a565b93506143c7818560208601614f49565b6143d081615151565b840191505092915050565b6143e481614f04565b82525050565b60006143f582614d2f565b6143ff8185614d4b565b935061440f818560208601614f49565b61441881615151565b840191505092915050565b6000614430603283614d4b565b915061443b82615162565b604082019050919050565b6000614453602683614d4b565b915061445e826151b1565b604082019050919050565b6000614476601c83614d4b565b915061448182615200565b602082019050919050565b6000614499600f83614d4b565b91506144a482615229565b602082019050919050565b60006144bc602483614d4b565b91506144c782615252565b604082019050919050565b60006144df601983614d4b565b91506144ea826152a1565b602082019050919050565b6000614502602c83614d4b565b915061450d826152ca565b604082019050919050565b6000614525603883614d4b565b915061453082615319565b604082019050919050565b6000614548600f83614d4b565b915061455382615368565b602082019050919050565b600061456b602a83614d4b565b915061457682615391565b604082019050919050565b600061458e602983614d4b565b9150614599826153e0565b604082019050919050565b60006145b1602083614d4b565b91506145bc8261542f565b602082019050919050565b60006145d4600e83614d4b565b91506145df82615458565b602082019050919050565b60006145f7600b83614d4b565b915061460282615481565b602082019050919050565b600061461a600f83614d4b565b9150614625826154aa565b602082019050919050565b600061463d602c83614d4b565b9150614648826154d3565b604082019050919050565b6000614660602083614d4b565b915061466b82615522565b602082019050919050565b6000614683602983614d4b565b915061468e8261554b565b604082019050919050565b60006146a6601f83614d4b565b91506146b18261559a565b602082019050919050565b60006146c9600d83614d4b565b91506146d4826155c3565b602082019050919050565b60006146ec602183614d4b565b91506146f7826155ec565b604082019050919050565b600061470f603183614d4b565b915061471a8261563b565b604082019050919050565b6000614732600d83614d4b565b915061473d8261568a565b602082019050919050565b6000614755600c83614d4b565b9150614760826156b3565b602082019050919050565b6000614778600983614d4b565b9150614783826156dc565b602082019050919050565b600061479b601083614d4b565b91506147a682615705565b602082019050919050565b6147ba81614edb565b82525050565b6147c981614ee5565b82525050565b60006020820190506147e46000830184614384565b92915050565b60006060820190506147ff6000830186614375565b61480c6020830185614384565b61481960408301846147b1565b949350505050565b60006080820190506148366000830187614375565b6148436020830186614384565b61485060408301856147b1565b818103606083015261486281846143a2565b905095945050505050565b60006020820190506148826000830184614393565b92915050565b600060608201905061489d60008301866143db565b6148aa60208301856147c0565b6148b760408301846147b1565b949350505050565b600060208201905081810360008301526148d981846143ea565b905092915050565b600060208201905081810360008301526148fa81614423565b9050919050565b6000602082019050818103600083015261491a81614446565b9050919050565b6000602082019050818103600083015261493a81614469565b9050919050565b6000602082019050818103600083015261495a8161448c565b9050919050565b6000602082019050818103600083015261497a816144af565b9050919050565b6000602082019050818103600083015261499a816144d2565b9050919050565b600060208201905081810360008301526149ba816144f5565b9050919050565b600060208201905081810360008301526149da81614518565b9050919050565b600060208201905081810360008301526149fa8161453b565b9050919050565b60006020820190508181036000830152614a1a8161455e565b9050919050565b60006020820190508181036000830152614a3a81614581565b9050919050565b60006020820190508181036000830152614a5a816145a4565b9050919050565b60006020820190508181036000830152614a7a816145c7565b9050919050565b60006020820190508181036000830152614a9a816145ea565b9050919050565b60006020820190508181036000830152614aba8161460d565b9050919050565b60006020820190508181036000830152614ada81614630565b9050919050565b60006020820190508181036000830152614afa81614653565b9050919050565b60006020820190508181036000830152614b1a81614676565b9050919050565b60006020820190508181036000830152614b3a81614699565b9050919050565b60006020820190508181036000830152614b5a816146bc565b9050919050565b60006020820190508181036000830152614b7a816146df565b9050919050565b60006020820190508181036000830152614b9a81614702565b9050919050565b60006020820190508181036000830152614bba81614725565b9050919050565b60006020820190508181036000830152614bda81614748565b9050919050565b60006020820190508181036000830152614bfa8161476b565b9050919050565b60006020820190508181036000830152614c1a8161478e565b9050919050565b6000602082019050614c3660008301846147b1565b92915050565b600060c082019050614c5160008301896147b1565b614c5e60208301886147c0565b614c6b60408301876147c0565b614c786060830186614393565b614c8560808301856147b1565b614c9260a08301846147b1565b979650505050505050565b6000614ca7614cb8565b9050614cb38282614fd8565b919050565b6000604051905090565b600067ffffffffffffffff821115614cdd57614cdc61510e565b5b614ce682615151565b9050602081019050919050565b600067ffffffffffffffff821115614d0e57614d0d61510e565b5b614d1782615151565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614d6782614edb565b9150614d7283614edb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614da757614da6615052565b5b828201905092915050565b6000614dbd82614edb565b9150614dc883614edb565b925082614dd857614dd7615081565b5b828204905092915050565b6000614dee82614edb565b9150614df983614edb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3257614e31615052565b5b828202905092915050565b6000614e4882614edb565b9150614e5383614edb565b925082821015614e6657614e65615052565b5b828203905092915050565b6000614e7c82614ebb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614efd82614f16565b9050919050565b6000614f0f82614ee5565b9050919050565b6000614f2182614f28565b9050919050565b6000614f3382614ebb565b9050919050565b82818337600083830152505050565b60005b83811015614f67578082015181840152602081019050614f4c565b83811115614f76576000848401525b50505050565b6000614f8782614edb565b91506000821415614f9b57614f9a615052565b5b600182039050919050565b60006002820490506001821680614fbe57607f821691505b60208210811415614fd257614fd16150b0565b5b50919050565b614fe182615151565b810181811067ffffffffffffffff8211171561500057614fff61510e565b5b80604052505050565b600061501482614edb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504757615046615052565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f742047616d65416464726573730000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5075726368617365206c696d6974000000000000000000000000000000000000600082015250565b7f4e6f742070726573616c65000000000000000000000000000000000000000000600082015250565b7f43616c6c20726573747269637465640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f427579207573696e672053555000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f427579207573696e672045746800000000000000000000000000000000000000600082015250565b7f496e76616c696420747970650000000000000000000000000000000000000000600082015250565b7f6e6f742061646d696e0000000000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b61573781614e71565b811461574257600080fd5b50565b61574e81614e83565b811461575957600080fd5b50565b61576581614e8f565b811461577057600080fd5b50565b61577c81614edb565b811461578757600080fd5b50565b61579381614ee5565b811461579e57600080fd5b5056fea2646970667358221220b8f7235c4f59f04125eade438b2dfd779c973d19b24d1de2bcf76ebc9f0507e264736f6c63430008070033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80638da5cb5b11610123578063bb62115e116100ab578063e985e9c51161006f578063e985e9c5146107e0578063f1525e401461081d578063f2fde38b14610848578063f48238b414610871578063fe92404a1461089c5761021a565b8063bb62115e146106e9578063c2eb275c14610714578063c378a9771461073d578063c54e73e31461077a578063c87b56dd146107a35761021a565b8063a22cb465116100f2578063a22cb46514610608578063b484eff714610631578063b88d4fde1461066e578063b894223b14610697578063ba7133f9146106c05761021a565b80638da5cb5b1461055e578063952b1f6b1461058957806395364a84146105b257806395d89b41146105dd5761021a565b80632257c0e2116101a657806342842e0e1161017557806342842e0e146104675780636352211e1461049057806370a08231146104cd578063715018a61461050a5780638b0d0258146105215761021a565b80632257c0e2146103c157806323b872dd146103fe5780632890e0d7146104275780633ccfd60b146104505761021a565b80630b1b806b116101ed5780630b1b806b146102ed57806313e43bc6146103095780631459457a146103325780631caaa4871461035b57806320eb2a87146103985761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190614130565b6108c5565b604051610253919061486d565b60405180910390f35b34801561026857600080fd5b506102716109a7565b60405161027e91906148bf565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a991906141d3565b610a39565b6040516102bb91906147cf565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613fdc565b610abe565b005b610307600480360381019061030291906140c9565b610bd6565b005b34801561031557600080fd5b50610330600480360381019061032b91906141d3565b611346565b005b34801561033e57600080fd5b5061035960048036038101906103549190613e4b565b61145a565b005b34801561036757600080fd5b50610382600480360381019061037d91906141d3565b611749565b60405161038f91906147cf565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613e4b565b61177c565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906141d3565b61195d565b6040516103f59190614c21565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613ec6565b611975565b005b34801561043357600080fd5b5061044e600480360381019061044991906141d3565b6119d5565b005b34801561045c57600080fd5b50610465611a78565b005b34801561047357600080fd5b5061048e60048036038101906104899190613ec6565b611b5a565b005b34801561049c57600080fd5b506104b760048036038101906104b291906141d3565b611b7a565b6040516104c491906147cf565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613dde565b611c2c565b6040516105019190614c21565b60405180910390f35b34801561051657600080fd5b5061051f611ce4565b005b34801561052d57600080fd5b50610548600480360381019061054391906141d3565b611e37565b6040516105559190614c21565b60405180910390f35b34801561056a57600080fd5b50610573611e52565b60405161058091906147cf565b60405180910390f35b34801561059557600080fd5b506105b060048036038101906105ab91906141d3565b611e7b565b005b3480156105be57600080fd5b506105c7611f1a565b6040516105d4919061486d565b60405180910390f35b3480156105e957600080fd5b506105f2611f2d565b6040516105ff91906148bf565b60405180910390f35b34801561061457600080fd5b5061062f600480360381019061062a9190613f9c565b611fbf565b005b34801561063d57600080fd5b5061065860048036038101906106539190613dde565b612140565b6040516106659190614c21565b60405180910390f35b34801561067a57600080fd5b5061069560048036038101906106909190613f19565b612158565b005b3480156106a357600080fd5b506106be60048036038101906106b9919061422d565b6121ba565b005b3480156106cc57600080fd5b506106e760048036038101906106e291906141d3565b612271565b005b3480156106f557600080fd5b506106fe612310565b60405161070b9190614c21565b60405180910390f35b34801561072057600080fd5b5061073b60048036038101906107369190614076565b612321565b005b34801561074957600080fd5b50610764600480360381019061075f91906141d3565b612836565b60405161077191906147cf565b60405180910390f35b34801561078657600080fd5b506107a1600480360381019061079c919061401c565b612873565b005b3480156107af57600080fd5b506107ca60048036038101906107c591906141d3565b612925565b6040516107d791906148bf565b60405180910390f35b3480156107ec57600080fd5b5061080760048036038101906108029190613e0b565b612a26565b604051610814919061486d565b60405180910390f35b34801561082957600080fd5b50610832612aba565b60405161083f9190614c21565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613dde565b612ac0565b005b34801561087d57600080fd5b50610886612b61565b6040516108939190614c21565b60405180910390f35b3480156108a857600080fd5b506108c360048036038101906108be919061426d565b612b67565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109a0575061099f82612c96565b5b9050919050565b6060600180546109b690614fa6565b80601f01602080910402602001604051908101604052809291908181526020018280546109e290614fa6565b8015610a2f5780601f10610a0457610100808354040283529160200191610a2f565b820191906000526020600020905b815481529060010190602001808311610a1257829003601f168201915b5050505050905090565b6000610a4482612d00565b610a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7a90614ac1565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ac982611b7a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3190614b61565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b59612d6c565b73ffffffffffffffffffffffffffffffffffffffff161480610b885750610b8781610b82612d6c565b612a26565b5b610bc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbe906149c1565b60405180910390fd5b610bd18383612d74565b505050565b60028360ff1610610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1390614bc1565b60405180910390fd5b600b54610c296009612e2d565b1115610c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6190614b41565b60405180910390fd5b600a60009054906101000a900460ff1615610da257601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d06906149e1565b60405180910390fd5b600382600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d5c9190614d5c565b1115610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490614a61565b60405180910390fd5b610f15565b3482600c54610db19190614de3565b1115610df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de990614c01565b60405180910390fd5b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90614a81565b60405180910390fd5b600d82600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ed09190614d5c565b1115610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0890614a61565b60405180910390fd5b3390505b60001515610f4c610f24612d6c565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612a26565b15151415610f8257610f81601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001611fbf565b5b81600e8460ff1660028110610f9a57610f996150df565b5b0154610fa69190614d5c565b600e8460ff1660028110610fbd57610fbc6150df565b5b018190555081600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110119190614d5c565b92505081905550831561120d5760005b82811015611207576110336009612e3b565b611068601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166110636009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001866110b36009612e2d565b6040518463ffffffff1660e01b81526004016110d193929190614888565b600060405180830381600087803b1580156110eb57600080fd5b505af11580156110ff573d6000803e3d6000fd5b5050505081600760006111126009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f8e93246111a66009612e2d565b6040518263ffffffff1660e01b81526004016111c29190614c21565b600060405180830381600087803b1580156111dc57600080fd5b505af11580156111f0573d6000803e3d6000fd5b5050505080806111ff90615009565b915050611021565b50611340565b60005b8281101561133e576112226009612e3b565b611235826112306009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001866112806009612e2d565b6040518463ffffffff1660e01b815260040161129e93929190614888565b600060405180830381600087803b1580156112b857600080fd5b505af11580156112cc573d6000803e3d6000fd5b5050505081600760006112df6009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061133690615009565b915050611210565b505b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113a057600080fd5b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9005ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561140857600080fd5b505afa15801561141c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114409190614200565b600860008381526020019081526020016000208190555050565b6114867fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b612e6f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea90614be1565b60405180910390fd5b6040518060400160405280600c81526020017f48756e676572427261696e7a00000000000000000000000000000000000000008152506001908051906020019061153e929190613b9e565b506040518060400160405280600381526020017f48425a00000000000000000000000000000000000000000000000000000000008152506002908051906020019061158a929190613b9e565b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555066f5232269808000600c819055506001600a60006101000a81548160ff021916908315150217905550612710600b8190555084601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60076020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611784612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611811576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180890614ae1565b60405180910390fd5b84601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b60086020528060005260406000206000915090505481565b611986611980612d6c565b82612e84565b6119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc90614b81565b60405180910390fd5b6119d0838383612f62565b505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a16612d6c565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614941565b60405180910390fd5b611a7581613087565b50565b600047905060008111611a8a57600080fd5b6000733384392f12f90c185a43861e0547aff77bd5134a905060006064600a84611ab49190614de3565b611abe9190614db2565b90508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611b06573d6000803e3d6000fd5b50611b0f611e52565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611b54573d6000803e3d6000fd5b50505050565b611b7583838360405180602001604052806000815250612158565b505050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614a21565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490614a01565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611cec612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7090614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600e8160028110611e4757600080fd5b016000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e83612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0790614ae1565b60405180910390fd5b80600b8190555050565b600a60009054906101000a900460ff1681565b606060028054611f3c90614fa6565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6890614fa6565b8015611fb55780601f10611f8a57610100808354040283529160200191611fb5565b820191906000526020600020905b815481529060010190602001808311611f9857829003601f168201915b5050505050905090565b611fc7612d6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90614981565b60405180910390fd5b8060066000612042612d6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166120ef612d6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612134919061486d565b60405180910390a35050565b600d6020528060005260406000206000915090505481565b612169612163612d6c565b83612e84565b6121a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219f90614b81565b60405180910390fd5b6121b4848484846131c8565b50505050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166121fb612d6c565b73ffffffffffffffffffffffffffffffffffffffff161461221b57600080fd5b806007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b612279612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fd90614ae1565b60405180910390fd5b80600c8190555050565b600061231c6009612e2d565b905090565b60028260ff1610612367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235e90614bc1565b60405180910390fd5b600b546123746009612e2d565b116123b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ab90614ba1565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6123fa612d6c565b30683635c9adc5dea00000856124109190614de3565b6040518463ffffffff1660e01b815260040161242e939291906147ea565b602060405180830381600087803b15801561244857600080fd5b505af115801561245c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124809190614049565b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342966c68683635c9adc5dea00000836124d49190614de3565b6040518263ffffffff1660e01b81526004016124f09190614c21565b602060405180830381600087803b15801561250a57600080fd5b505af115801561251e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125429190614049565b5080600e8360ff166002811061255b5761255a6150df565b5b01546125679190614d5c565b600e8360ff166002811061257e5761257d6150df565b5b018190555060005b818110156128305783156127095761259e6009612e3b565b6125d3601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166125ce6009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f60018561261e6009612e2d565b6040518463ffffffff1660e01b815260040161263c93929190614888565b600060405180830381600087803b15801561265657600080fd5b505af115801561266a573d6000803e3d6000fd5b50505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638f8e93246126b66009612e2d565b6040518263ffffffff1660e01b81526004016126d29190614c21565b600060405180830381600087803b1580156126ec57600080fd5b505af1158015612700573d6000803e3d6000fd5b505050506127c2565b6127136009612e3b565b612726336127216009612e2d565b612e51565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa4fc2f6001856127716009612e2d565b6040518463ffffffff1660e01b815260040161278f93929190614888565b600060405180830381600087803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505050505b33600760006127d16009612e2d565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061282890615009565b915050612586565b50505050565b60006007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61287b612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612908576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ff90614ae1565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b606061293082612d00565b61296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296690614b21565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633bb3a24d836040518263ffffffff1660e01b81526004016129ca9190614c21565b60006040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612a1f919061418a565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b612ac8612d6c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4c90614ae1565b60405180910390fd5b612b5e81613224565b50565b600c5481565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bee90614aa1565b60405180910390fd5b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638576492f8787878787876040518763ffffffff1660e01b8152600401612c5c96959493929190614c3c565b600060405180830381600087803b158015612c7657600080fd5b505af1158015612c8a573d6000803e3d6000fd5b50505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612de783611b7a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612e6b828260405180602001604052806000815250613351565b5050565b6000612e7a826133ac565b60001c9050919050565b6000612e8f82612d00565b612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec5906149a1565b60405180910390fd5b6000612ed983611b7a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f4857508373ffffffffffffffffffffffffffffffffffffffff16612f3084610a39565b73ffffffffffffffffffffffffffffffffffffffff16145b80612f595750612f588185612a26565b5b91505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415801561301f57506007600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561307757816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6130828383836133b7565b505050565b6000601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4b50cb8836040518263ffffffff1660e01b81526004016130e49190614c21565b60a06040518083038186803b1580156130fc57600080fd5b505afa158015613110573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313491906142fa565b505050509050600e8160ff1660028110613151576131506150df565b5b01600081548092919061316390614f7c565b919050555060006007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506131c482613613565b5050565b6131d3848484612f62565b6131df84848484613724565b61321e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613215906148e1565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328b90614901565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61335b83836138bb565b6133686000848484613724565b6133a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161339e906148e1565b60405180910390fd5b505050565b600081549050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133d782611b7a565b73ffffffffffffffffffffffffffffffffffffffff161461342d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342490614b01565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561349d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349490614961565b60405180910390fd5b6134a8838383613980565b6134b3600082612d74565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546135039190614e3d565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461355a9190614d5c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061361e82611b7a565b905061362c81600084613980565b613637600083612d74565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136879190614e3d565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006137458473ffffffffffffffffffffffffffffffffffffffff16613985565b156138ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261376e612d6c565b8786866040518563ffffffff1660e01b81526004016137909493929190614821565b602060405180830381600087803b1580156137aa57600080fd5b505af19250505080156137db57506040513d601f19601f820116820180604052508101906137d8919061415d565b60015b61385e573d806000811461380b576040519150601f19603f3d011682016040523d82523d6000602084013e613810565b606091505b50600081511415613856576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161384d906148e1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506138b3565b600190505b949350505050565b6138c582826139d0565b601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d9005ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801561392d57600080fd5b505afa158015613941573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139659190614200565b60086000838152602001908152602001600020819055505050565b505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156139c757506000801b8214155b92505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a3790614a41565b60405180910390fd5b613a4981612d00565b15613a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a8090614921565b60405180910390fd5b613a9560008383613980565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613ae59190614d5c565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613baa90614fa6565b90600052602060002090601f016020900481019282613bcc5760008555613c13565b82601f10613be557805160ff1916838001178555613c13565b82800160010185558215613c13579182015b82811115613c12578251825591602001919060010190613bf7565b5b509050613c209190613c24565b5090565b5b80821115613c3d576000816000905550600101613c25565b5090565b6000613c54613c4f84614cc2565b614c9d565b905082815260208101848484011115613c7057613c6f615142565b5b613c7b848285614f3a565b509392505050565b6000613c96613c9184614cf3565b614c9d565b905082815260208101848484011115613cb257613cb1615142565b5b613cbd848285614f49565b509392505050565b600081359050613cd48161572e565b92915050565b600081359050613ce981615745565b92915050565b600081519050613cfe81615745565b92915050565b600081359050613d138161575c565b92915050565b600081519050613d288161575c565b92915050565b600082601f830112613d4357613d4261513d565b5b8135613d53848260208601613c41565b91505092915050565b600082601f830112613d7157613d7061513d565b5b8151613d81848260208601613c83565b91505092915050565b600081359050613d9981615773565b92915050565b600081519050613dae81615773565b92915050565b600081359050613dc38161578a565b92915050565b600081519050613dd88161578a565b92915050565b600060208284031215613df457613df361514c565b5b6000613e0284828501613cc5565b91505092915050565b60008060408385031215613e2257613e2161514c565b5b6000613e3085828601613cc5565b9250506020613e4185828601613cc5565b9150509250929050565b600080600080600060a08688031215613e6757613e6661514c565b5b6000613e7588828901613cc5565b9550506020613e8688828901613cc5565b9450506040613e9788828901613cc5565b9350506060613ea888828901613cc5565b9250506080613eb988828901613cc5565b9150509295509295909350565b600080600060608486031215613edf57613ede61514c565b5b6000613eed86828701613cc5565b9350506020613efe86828701613cc5565b9250506040613f0f86828701613d8a565b9150509250925092565b60008060008060808587031215613f3357613f3261514c565b5b6000613f4187828801613cc5565b9450506020613f5287828801613cc5565b9350506040613f6387828801613d8a565b925050606085013567ffffffffffffffff811115613f8457613f83615147565b5b613f9087828801613d2e565b91505092959194509250565b60008060408385031215613fb357613fb261514c565b5b6000613fc185828601613cc5565b9250506020613fd285828601613cda565b9150509250929050565b60008060408385031215613ff357613ff261514c565b5b600061400185828601613cc5565b925050602061401285828601613d8a565b9150509250929050565b6000602082840312156140325761403161514c565b5b600061404084828501613cda565b91505092915050565b60006020828403121561405f5761405e61514c565b5b600061406d84828501613cef565b91505092915050565b60008060006060848603121561408f5761408e61514c565b5b600061409d86828701613cda565b93505060206140ae86828701613db4565b92505060406140bf86828701613d8a565b9150509250925092565b600080600080608085870312156140e3576140e261514c565b5b60006140f187828801613cda565b945050602061410287828801613db4565b935050604061411387828801613d8a565b925050606061412487828801613cc5565b91505092959194509250565b6000602082840312156141465761414561514c565b5b600061415484828501613d04565b91505092915050565b6000602082840312156141735761417261514c565b5b600061418184828501613d19565b91505092915050565b6000602082840312156141a05761419f61514c565b5b600082015167ffffffffffffffff8111156141be576141bd615147565b5b6141ca84828501613d5c565b91505092915050565b6000602082840312156141e9576141e861514c565b5b60006141f784828501613d8a565b91505092915050565b6000602082840312156142165761421561514c565b5b600061422484828501613d9f565b91505092915050565b600080604083850312156142445761424361514c565b5b600061425285828601613d8a565b925050602061426385828601613cc5565b9150509250929050565b60008060008060008060c0878903121561428a5761428961514c565b5b600061429889828a01613d8a565b96505060206142a989828a01613db4565b95505060406142ba89828a01613db4565b94505060606142cb89828a01613cda565b93505060806142dc89828a01613d8a565b92505060a06142ed89828a01613d8a565b9150509295509295509295565b600080600080600060a086880312156143165761431561514c565b5b600061432488828901613dc9565b955050602061433588828901613dc9565b945050604061434688828901613cef565b935050606061435788828901613d9f565b925050608061436888828901613d9f565b9150509295509295909350565b61437e81614ef2565b82525050565b61438d81614e71565b82525050565b61439c81614e83565b82525050565b60006143ad82614d24565b6143b78185614d3a565b93506143c7818560208601614f49565b6143d081615151565b840191505092915050565b6143e481614f04565b82525050565b60006143f582614d2f565b6143ff8185614d4b565b935061440f818560208601614f49565b61441881615151565b840191505092915050565b6000614430603283614d4b565b915061443b82615162565b604082019050919050565b6000614453602683614d4b565b915061445e826151b1565b604082019050919050565b6000614476601c83614d4b565b915061448182615200565b602082019050919050565b6000614499600f83614d4b565b91506144a482615229565b602082019050919050565b60006144bc602483614d4b565b91506144c782615252565b604082019050919050565b60006144df601983614d4b565b91506144ea826152a1565b602082019050919050565b6000614502602c83614d4b565b915061450d826152ca565b604082019050919050565b6000614525603883614d4b565b915061453082615319565b604082019050919050565b6000614548600f83614d4b565b915061455382615368565b602082019050919050565b600061456b602a83614d4b565b915061457682615391565b604082019050919050565b600061458e602983614d4b565b9150614599826153e0565b604082019050919050565b60006145b1602083614d4b565b91506145bc8261542f565b602082019050919050565b60006145d4600e83614d4b565b91506145df82615458565b602082019050919050565b60006145f7600b83614d4b565b915061460282615481565b602082019050919050565b600061461a600f83614d4b565b9150614625826154aa565b602082019050919050565b600061463d602c83614d4b565b9150614648826154d3565b604082019050919050565b6000614660602083614d4b565b915061466b82615522565b602082019050919050565b6000614683602983614d4b565b915061468e8261554b565b604082019050919050565b60006146a6601f83614d4b565b91506146b18261559a565b602082019050919050565b60006146c9600d83614d4b565b91506146d4826155c3565b602082019050919050565b60006146ec602183614d4b565b91506146f7826155ec565b604082019050919050565b600061470f603183614d4b565b915061471a8261563b565b604082019050919050565b6000614732600d83614d4b565b915061473d8261568a565b602082019050919050565b6000614755600c83614d4b565b9150614760826156b3565b602082019050919050565b6000614778600983614d4b565b9150614783826156dc565b602082019050919050565b600061479b601083614d4b565b91506147a682615705565b602082019050919050565b6147ba81614edb565b82525050565b6147c981614ee5565b82525050565b60006020820190506147e46000830184614384565b92915050565b60006060820190506147ff6000830186614375565b61480c6020830185614384565b61481960408301846147b1565b949350505050565b60006080820190506148366000830187614375565b6148436020830186614384565b61485060408301856147b1565b818103606083015261486281846143a2565b905095945050505050565b60006020820190506148826000830184614393565b92915050565b600060608201905061489d60008301866143db565b6148aa60208301856147c0565b6148b760408301846147b1565b949350505050565b600060208201905081810360008301526148d981846143ea565b905092915050565b600060208201905081810360008301526148fa81614423565b9050919050565b6000602082019050818103600083015261491a81614446565b9050919050565b6000602082019050818103600083015261493a81614469565b9050919050565b6000602082019050818103600083015261495a8161448c565b9050919050565b6000602082019050818103600083015261497a816144af565b9050919050565b6000602082019050818103600083015261499a816144d2565b9050919050565b600060208201905081810360008301526149ba816144f5565b9050919050565b600060208201905081810360008301526149da81614518565b9050919050565b600060208201905081810360008301526149fa8161453b565b9050919050565b60006020820190508181036000830152614a1a8161455e565b9050919050565b60006020820190508181036000830152614a3a81614581565b9050919050565b60006020820190508181036000830152614a5a816145a4565b9050919050565b60006020820190508181036000830152614a7a816145c7565b9050919050565b60006020820190508181036000830152614a9a816145ea565b9050919050565b60006020820190508181036000830152614aba8161460d565b9050919050565b60006020820190508181036000830152614ada81614630565b9050919050565b60006020820190508181036000830152614afa81614653565b9050919050565b60006020820190508181036000830152614b1a81614676565b9050919050565b60006020820190508181036000830152614b3a81614699565b9050919050565b60006020820190508181036000830152614b5a816146bc565b9050919050565b60006020820190508181036000830152614b7a816146df565b9050919050565b60006020820190508181036000830152614b9a81614702565b9050919050565b60006020820190508181036000830152614bba81614725565b9050919050565b60006020820190508181036000830152614bda81614748565b9050919050565b60006020820190508181036000830152614bfa8161476b565b9050919050565b60006020820190508181036000830152614c1a8161478e565b9050919050565b6000602082019050614c3660008301846147b1565b92915050565b600060c082019050614c5160008301896147b1565b614c5e60208301886147c0565b614c6b60408301876147c0565b614c786060830186614393565b614c8560808301856147b1565b614c9260a08301846147b1565b979650505050505050565b6000614ca7614cb8565b9050614cb38282614fd8565b919050565b6000604051905090565b600067ffffffffffffffff821115614cdd57614cdc61510e565b5b614ce682615151565b9050602081019050919050565b600067ffffffffffffffff821115614d0e57614d0d61510e565b5b614d1782615151565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614d6782614edb565b9150614d7283614edb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614da757614da6615052565b5b828201905092915050565b6000614dbd82614edb565b9150614dc883614edb565b925082614dd857614dd7615081565b5b828204905092915050565b6000614dee82614edb565b9150614df983614edb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3257614e31615052565b5b828202905092915050565b6000614e4882614edb565b9150614e5383614edb565b925082821015614e6657614e65615052565b5b828203905092915050565b6000614e7c82614ebb565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614efd82614f16565b9050919050565b6000614f0f82614ee5565b9050919050565b6000614f2182614f28565b9050919050565b6000614f3382614ebb565b9050919050565b82818337600083830152505050565b60005b83811015614f67578082015181840152602081019050614f4c565b83811115614f76576000848401525b50505050565b6000614f8782614edb565b91506000821415614f9b57614f9a615052565b5b600182039050919050565b60006002820490506001821680614fbe57607f821691505b60208210811415614fd257614fd16150b0565b5b50919050565b614fe182615151565b810181811067ffffffffffffffff8211171561500057614fff61510e565b5b80604052505050565b600061501482614edb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561504757615046615052565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f742047616d65416464726573730000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f5075726368617365206c696d6974000000000000000000000000000000000000600082015250565b7f4e6f742070726573616c65000000000000000000000000000000000000000000600082015250565b7f43616c6c20726573747269637465640000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b7f427579207573696e672053555000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f427579207573696e672045746800000000000000000000000000000000000000600082015250565b7f496e76616c696420747970650000000000000000000000000000000000000000600082015250565b7f6e6f742061646d696e0000000000000000000000000000000000000000000000600082015250565b7f494e53554646494349454e545f45544800000000000000000000000000000000600082015250565b61573781614e71565b811461574257600080fd5b50565b61574e81614e83565b811461575957600080fd5b50565b61576581614e8f565b811461577057600080fd5b50565b61577c81614edb565b811461578757600080fd5b50565b61579381614ee5565b811461579e57600080fd5b5056fea2646970667358221220b8f7235c4f59f04125eade438b2dfd779c973d19b24d1de2bcf76ebc9f0507e264736f6c63430008070033
Deployed Bytecode Sourcemap
40695:7644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25317:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26408:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28055:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27581:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43376:1849;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42975:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41502:630;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40805:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42414:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40855:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29059:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42784:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46540:354;;;;;;;;;;;;;:::i;:::-;;29503:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26038:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25704:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39812:140;;;;;;;;;;;;;:::i;:::-;;41323:21;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39182:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43258:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41018:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26577:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28412:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41258:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29756:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42245:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47518:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42140:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45233:1176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46417:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43160:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47292:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28798:194;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41053:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40103:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41178:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46965:299;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25317:323;25444:4;25497:25;25482:40;;;:11;:40;;;;:101;;;;25550:33;25535:48;;;:11;:48;;;;25482:101;:150;;;;25596:36;25620:11;25596:23;:36::i;:::-;25482:150;25466:166;;25317:323;;;:::o;26408:100::-;26462:13;26495:5;26488:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26408:100;:::o;28055:285::-;28153:7;28200:16;28208:7;28200;:16::i;:::-;28178:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;28308:15;:24;28324:7;28308:24;;;;;;;;;;;;;;;;;;;;;28301:31;;28055:285;;;:::o;27581:408::-;27659:13;27675:23;27690:7;27675:14;:23::i;:::-;27659:39;;27723:5;27717:11;;:2;:11;;;;27709:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27817:5;27801:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27826:37;27843:5;27850:12;:10;:12::i;:::-;27826:16;:37::i;:::-;27801:62;27779:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27960:21;27969:2;27973:7;27960:8;:21::i;:::-;27648:341;27581:408;;:::o;43376:1849::-;43673:1;43661:9;:13;;;43653:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;43731:13;;43709:18;:8;:16;:18::i;:::-;:35;;43701:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43775:9;;;;;;;;;;;43772:495;;;43830:9;;;;;;;;;;;43808:32;;:10;:32;;;43800:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;43922:1;43907:11;43882:12;:22;43895:8;43882:22;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:41;;43874:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43772:495;;;44034:9;44019:11;43991:27;;:39;;;;:::i;:::-;:52;;43982:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;44109:9;;;;;;;;;;;44087:32;;:10;:32;;;;44079:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44199:2;44184:11;44157:12;:24;44170:10;44157:24;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:44;;44149:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;44245:10;44234:21;;43772:495;44327:5;44281:51;;:44;44298:12;:10;:12::i;:::-;44319:4;;;;;;;;;;;44281:16;:44::i;:::-;:51;;;44277:122;;;44349:38;44375:4;;;;;;;;;;;44382;44349:17;:38::i;:::-;44277:122;44447:11;44429:6;44436:9;44429:17;;;;;;;;;:::i;:::-;;;;:29;;;;:::i;:::-;44409:6;44416:9;44409:17;;;;;;;;;:::i;:::-;;;:49;;;;44495:11;44469:12;:22;44482:8;44469:22;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;44520:5;44517:701;;;44545:6;44540:344;44557:11;44555:1;:13;44540:344;;;44594:20;:8;:18;:20::i;:::-;44633:43;44651:4;;;;;;;;;;;44657:18;:8;:16;:18::i;:::-;44633:9;:43::i;:::-;44695:15;;;;;;;;;;;:27;;;44723:1;44725:9;44735:18;:8;:16;:18::i;:::-;44695:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44806:8;44773:10;:30;44784:18;:8;:16;:18::i;:::-;44773:30;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;44833:4;;;;;;;;;;;:15;;;44849:18;:8;:16;:18::i;:::-;44833:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44570:3;;;;;:::i;:::-;;;;44540:344;;;;44517:701;;;44928:6;44923:284;44940:11;44938:1;:13;44923:284;;;44976:20;:8;:18;:20::i;:::-;45015:40;45025:8;45036:18;:8;:16;:18::i;:::-;45015:9;:40::i;:::-;45074:15;;;;;;;;;;;:27;;;45102:1;45104:9;45114:18;:8;:16;:18::i;:::-;45074:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45183:8;45152:10;:30;45163:18;:8;:16;:18::i;:::-;45152:30;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;44952:3;;;;;:::i;:::-;;;;44923:284;;;;44517:701;43376:1849;;;;:::o;42975:177::-;43061:4;;;;;;;;;;;43039:27;;:10;:27;;;43031:36;;;;;;43105:21;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43078:15;:24;43094:7;43078:24;;;;;;;;;;;:66;;;;42975:177;:::o;41502:630::-;41659:23;347:66;339:75;;41659:11;:23::i;:::-;41645:37;;:10;:37;;;41637:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;41709:24;;;;;;;;;;;;;;;;;:5;:24;;;;;;;;;;;;:::i;:::-;;41744:15;;;;;;;;;;;;;;;;;:7;:15;;;;;;;;;;;;:::i;:::-;;41780:10;41770:6;;:20;;;;;;;;;;;;;;;;;;41833:11;41803:27;:41;;;;41867:4;41855:9;;:16;;;;;;;;;;;;;;;;;;41898:5;41882:13;:21;;;;41934:12;41916:4;;:31;;;;;;;;;;;;;;;;;;41971:13;41958:3;;:27;;;;;;;;;;;;;;;;;;42019:10;41996:9;;:34;;;;;;;;;;;;;;;;;;42069:9;42041:15;;:38;;;;;;;;;;;;;;;;;;42119:4;42090:21;;:34;;;;;;;;;;;;;;;;;;41502:630;;;;;:::o;40805:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;42414:362::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42578:12:::1;42560:4;;:31;;;;;;;;;;;;;;;;;;42615:13;42602:3;;:27;;;;;;;;;;;;;;;;;;42663:10;42640:9;;:34;;;;;;;;;;;;;;;;;;42713:9;42685:15;;:38;;;;;;;;;;;;;;;;;;42763:4;42734:21;;:34;;;;;;;;;;;;;;;;;;42414:362:::0;;;;;:::o;40855:43::-;;;;;;;;;;;;;;;;;:::o;29059:373::-;29265:41;29284:12;:10;:12::i;:::-;29298:7;29265:18;:41::i;:::-;29243:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;29396:28;29406:4;29412:2;29416:7;29396:9;:28::i;:::-;29059:373;;;:::o;42784:183::-;42868:4;;;;;;;;;;;42844:29;;:12;:10;:12::i;:::-;:29;;;42835:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42945:14;42951:7;42945:5;:14::i;:::-;42784:183;:::o;46540:354::-;46580:12;46595:21;46580:36;;46645:1;46635:7;:11;46627:20;;;;;;46658:27;46697:42;46658:82;;46751:12;46783:3;46777:2;46768:7;:12;;;;:::i;:::-;46767:20;;;;:::i;:::-;46751:36;;46798:11;:20;;:29;46819:7;46798:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46846:7;:5;:7::i;:::-;46838:25;;:48;46864:21;46838:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46569:325;;;46540:354::o;29503:182::-;29638:39;29655:4;29661:2;29665:7;29638:39;;;;;;;;;;;;:16;:39::i;:::-;29503:182;;;:::o;26038:303::-;26132:7;26157:13;26173:7;:16;26181:7;26173:16;;;;;;;;;;;;;;;;;;;;;26157:32;;26239:1;26222:19;;:5;:19;;;;26200:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;26328:5;26321:12;;;26038:303;;;:::o;25704:272::-;25801:4;25862:1;25845:19;;:5;:19;;;;25823:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25952:9;:16;25962:5;25952:16;;;;;;;;;;;;;;;;25945:23;;25704:272;;;:::o;39812:140::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39911:1:::1;39874:40;;39895:6;::::0;::::1;;;;;;;;39874:40;;;;;;;;;;;;39942:1;39925:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;39812:140::o:0;41323:21::-;;;;;;;;;;;;;;;;;;;;:::o;39182:79::-;39220:7;39247:6;;;;;;;;;;;39240:13;;39182:79;:::o;43258:110::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43348:12:::1;43332:13;:28;;;;43258:110:::0;:::o;41018:28::-;;;;;;;;;;;;;:::o;26577:104::-;26633:13;26666:7;26659:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:104;:::o;28412:315::-;28547:12;:10;:12::i;:::-;28535:24;;:8;:24;;;;28527:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28647:8;28602:18;:32;28621:12;:10;:12::i;:::-;28602:32;;;;;;;;;;;;;;;:42;28635:8;28602:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28700:8;28671:48;;28686:12;:10;:12::i;:::-;28671:48;;;28710:8;28671:48;;;;;;:::i;:::-;;;;;;;;28412:315;;:::o;41258:42::-;;;;;;;;;;;;;;;;;:::o;29756:362::-;29942:41;29961:12;:10;:12::i;:::-;29975:7;29942:18;:41::i;:::-;29920:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;30071:39;30085:4;30091:2;30095:7;30104:5;30071:13;:39::i;:::-;29756:362;;;;:::o;42245:161::-;42353:4;;;;;;;;;;;42329:29;;:12;:10;:12::i;:::-;:29;;;42321:38;;;;;;42392:6;42370:10;:19;42381:7;42370:19;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;42245:161;;:::o;47518:126::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;47630:6:::1;47600:27;:36;;;;47518:126:::0;:::o;42140:97::-;42188:4;42211:18;:8;:16;:18::i;:::-;42204:25;;42140:97;:::o;45233:1176::-;45516:1;45504:9;:13;;;45496:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;45572:13;;45551:18;:8;:16;:18::i;:::-;:34;45543:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;45613:3;;;;;;;;;;;:16;;;45630:12;:10;:12::i;:::-;45652:4;45671:10;45659:11;:22;;;;:::i;:::-;45613:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45693:3;;;;;;;;;;;:8;;;45715:10;45702:11;:23;;;;:::i;:::-;45693:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45788:11;45770:6;45777:9;45770:17;;;;;;;;;:::i;:::-;;;;:29;;;;:::i;:::-;45750:6;45757:9;45750:17;;;;;;;;;:::i;:::-;;;:49;;;;45817:6;45812:590;45830:11;45827:1;:14;45812:590;;;45867:5;45863:472;;;45893:20;:8;:18;:20::i;:::-;45932:44;45950:4;;;;;;;;;;;45957:18;:8;:16;:18::i;:::-;45932:9;:44::i;:::-;45995:15;;;;;;;;;;;:27;;;46023:1;46025:9;46035:18;:8;:16;:18::i;:::-;45995:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46073:4;;;;;;;;;;;:15;;;46089:18;:8;:16;:18::i;:::-;46073:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45863:472;;;46162:20;:8;:18;:20::i;:::-;46201:40;46211:10;46222:18;:8;:16;:18::i;:::-;46201:9;:40::i;:::-;46260:15;;;;;;;;;;;:27;;;46288:1;46290:9;46300:18;:8;:16;:18::i;:::-;46260:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45863:472;46380:10;46349;:30;46360:18;:8;:16;:18::i;:::-;46349:30;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;45843:3;;;;;:::i;:::-;;;;45812:590;;;;45233:1176;;;:::o;46417:115::-;46478:7;46505:10;:19;46516:7;46505:19;;;;;;;;;;;;;;;;;;;;;46498:26;;46417:115;;;:::o;43160:90::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43235:7:::1;43223:9;;:19;;;;;;;;;;;;;;;;;;43160:90:::0;:::o;47292:218::-;47362:13;47396:16;47404:7;47396;:16::i;:::-;47388:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;47466:15;;;;;;;;;;;:27;;;47494:7;47466:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47459:43;;47292:218;;;:::o;28798:194::-;28920:4;28949:18;:25;28968:5;28949:25;;;;;;;;;;;;;;;:35;28975:8;28949:35;;;;;;;;;;;;;;;;;;;;;;;;;28942:42;;28798:194;;;;:::o;41053:33::-;;;;:::o;40103:109::-;39402:12;:10;:12::i;:::-;39392:22;;:6;;;;;;;;;;:22;;;39384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;40176:28:::1;40195:8;40176:18;:28::i;:::-;40103:109:::0;:::o;41178:53::-;;;;:::o;46965:299::-;47139:4;;;;;;;;;;;47117:27;;:10;:27;;;47109:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47174:15;;;;;;;;;;;:25;;;47200:7;47208;47216:5;47222:8;47231:10;47242:13;47174:82;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46965:299;;;;;;:::o;11443:187::-;11553:4;11597:25;11582:40;;;:11;:40;;;;11575:47;;11443:187;;;:::o;31662:124::-;31724:4;31776:1;31748:30;;:7;:16;31756:7;31748:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31741:37;;31662:124;;;:::o;23903:108::-;23948:15;23992:10;23976:27;;23903:108;:::o;35737:171::-;35836:2;35809:15;:24;35825:7;35809:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35892:7;35888:2;35854:46;;35863:23;35878:7;35863:14;:23::i;:::-;35854:46;;;;;;;;;;;;35737:171;;:::o;2053:114::-;2118:7;2145;:14;;;2138:21;;2053:114;;;:::o;2175:127::-;2282:1;2264:7;:14;;;:19;;;;;;;;;;;2175:127;:::o;32720:107::-;32793:26;32803:2;32807:7;32793:26;;;;;;;;;;;;:9;:26::i;:::-;32720:107;;:::o;423:140::-;480:11;534:18;548:3;534:13;:18::i;:::-;526:27;;504:51;;423:140;;;:::o;31953:425::-;32063:4;32107:16;32115:7;32107;:16::i;:::-;32085:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;32206:13;32222:23;32237:7;32222:14;:23::i;:::-;32206:39;;32275:5;32264:16;;:7;:16;;;:60;;;;32317:7;32293:31;;:20;32305:7;32293:11;:20::i;:::-;:31;;;32264:60;:105;;;;32337:32;32354:5;32361:7;32337:16;:32::i;:::-;32264:105;32256:114;;;31953:425;;;;:::o;47652:270::-;47788:4;;;;;;;;;;;47776:17;;:2;:17;;;;:44;;;;;47801:10;:19;47812:7;47801:19;;;;;;;;;;;;;;;;;;;;;47797:23;;:2;:23;;;;47776:44;47773:99;;;47858:2;47836:10;:19;47847:7;47836:19;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;47773:99;47882:32;47898:4;47903:2;47906:7;47882:15;:32::i;:::-;47652:270;;;:::o;48115:221::-;48174:13;48193:15;;;;;;;;;;;:24;;;48218:7;48193:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48173:53;;;;;;48237:6;48244:7;48237:15;;;;;;;;;:::i;:::-;;;;:17;;;;;;;;;:::i;:::-;;;;;;48295:1;48265:10;:19;48276:7;48265:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;48308:20;48320:7;48308:11;:20::i;:::-;48162:174;48115:221;:::o;31000:349::-;31154:28;31164:4;31170:2;31174:7;31154:9;:28::i;:::-;31215:48;31238:4;31244:2;31248:7;31257:5;31215:22;:48::i;:::-;31193:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;31000:349;;;;:::o;40316:229::-;40410:1;40390:22;;:8;:22;;;;40382:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40500:8;40471:38;;40492:6;;;;;;;;;;40471:38;;;;;;;;;;;;40529:8;40520:6;;:17;;;;;;;;;;;;;;;;;;40316:229;:::o;33051:318::-;33178:18;33184:2;33188:7;33178:5;:18::i;:::-;33229:54;33260:1;33264:2;33268:7;33277:5;33229:22;:54::i;:::-;33207:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33051:318;;;:::o;571:152::-;632:14;699:5;693:12;683:22;;571:152;;;:::o;35007:612::-;35177:4;35150:31;;:23;35165:7;35150:14;:23::i;:::-;:31;;;35128:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;35283:1;35269:16;;:2;:16;;;;35261:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35339:39;35360:4;35366:2;35370:7;35339:20;:39::i;:::-;35443:29;35460:1;35464:7;35443:8;:29::i;:::-;35504:1;35485:9;:15;35495:4;35485:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35533:1;35516:9;:13;35526:2;35516:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35564:2;35545:7;:16;35553:7;35545:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35603:7;35599:2;35584:27;;35593:4;35584:27;;;;;;;;;;;;35007:612;;;:::o;34313:357::-;34370:13;34386:23;34401:7;34386:14;:23::i;:::-;34370:39;;34422:48;34443:5;34458:1;34462:7;34422:20;:48::i;:::-;34511:29;34528:1;34532:7;34511:8;:29::i;:::-;34573:1;34553:9;:16;34563:5;34553:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;34592:7;:16;34600:7;34592:16;;;;;;;;;;;;34585:23;;;;;;;;;;;34654:7;34650:1;34626:36;;34635:5;34626:36;;;;;;;;;;;;34359:311;34313:357;:::o;36470:953::-;36622:4;36643:15;:2;:13;;;:15::i;:::-;36639:777;;;36708:2;36692:36;;;36747:12;:10;:12::i;:::-;36778:4;36801:7;36827:5;36692:155;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36675:686;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37051:1;37034:6;:13;:18;37030:316;;;37077:104;;;;;;;;;;:::i;:::-;;;;;;;;37030:316;37296:6;37290:13;37281:6;37277:2;37273:15;37266:38;36675:686;36921:45;;;36911:55;;;:6;:55;;;;36904:62;;;;;36639:777;37400:4;37393:11;;36470:953;;;;;;;:::o;47930:177::-;47999:23;48011:2;48014:7;47999:11;:23::i;:::-;48060:21;;;;;;;;;;;:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48033:15;:24;48049:7;48033:24;;;;;;;;;;;:66;;;;47930:177;;:::o;37995:123::-;;;;:::o;14329:650::-;14389:4;14651:16;14678:19;14709:66;14678:97;;;;14891:7;14879:20;14867:32;;14940:11;14928:8;:23;;:42;;;;;14967:3;14955:15;;:8;:15;;14928:42;14920:51;;;;14329:650;;;:::o;33705:379::-;33796:1;33782:16;;:2;:16;;;;33774:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33855:16;33863:7;33855;:16::i;:::-;33854:17;33846:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33917:45;33946:1;33950:2;33954:7;33917:20;:45::i;:::-;33992:1;33975:9;:13;33985:2;33975:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34023:2;34004:7;:16;34012:7;34004:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34068:7;34064:2;34043:33;;34060:1;34043:33;;;;;;;;;;;;33705:379;;:::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:421::-;512:5;537:66;553:49;595:6;553:49;:::i;:::-;537:66;:::i;:::-;528:75;;626:6;619:5;612:21;664:4;657:5;653:16;702:3;693:6;688:3;684:16;681:25;678:112;;;709:79;;:::i;:::-;678:112;799:39;831:6;826:3;821;799:39;:::i;:::-;518:326;423:421;;;;;:::o;850:139::-;896:5;934:6;921:20;912:29;;950:33;977:5;950:33;:::i;:::-;850:139;;;;:::o;995:133::-;1038:5;1076:6;1063:20;1054:29;;1092:30;1116:5;1092:30;:::i;:::-;995:133;;;;:::o;1134:137::-;1188:5;1219:6;1213:13;1204:22;;1235:30;1259:5;1235:30;:::i;:::-;1134:137;;;;:::o;1277:::-;1322:5;1360:6;1347:20;1338:29;;1376:32;1402:5;1376:32;:::i;:::-;1277:137;;;;:::o;1420:141::-;1476:5;1507:6;1501:13;1492:22;;1523:32;1549:5;1523:32;:::i;:::-;1420:141;;;;:::o;1580:338::-;1635:5;1684:3;1677:4;1669:6;1665:17;1661:27;1651:122;;1692:79;;:::i;:::-;1651:122;1809:6;1796:20;1834:78;1908:3;1900:6;1893:4;1885:6;1881:17;1834:78;:::i;:::-;1825:87;;1641:277;1580:338;;;;:::o;1938:355::-;2005:5;2054:3;2047:4;2039:6;2035:17;2031:27;2021:122;;2062:79;;:::i;:::-;2021:122;2172:6;2166:13;2197:90;2283:3;2275:6;2268:4;2260:6;2256:17;2197:90;:::i;:::-;2188:99;;2011:282;1938:355;;;;:::o;2299:139::-;2345:5;2383:6;2370:20;2361:29;;2399:33;2426:5;2399:33;:::i;:::-;2299:139;;;;:::o;2444:143::-;2501:5;2532:6;2526:13;2517:22;;2548:33;2575:5;2548:33;:::i;:::-;2444:143;;;;:::o;2593:135::-;2637:5;2675:6;2662:20;2653:29;;2691:31;2716:5;2691:31;:::i;:::-;2593:135;;;;:::o;2734:139::-;2789:5;2820:6;2814:13;2805:22;;2836:31;2861:5;2836:31;:::i;:::-;2734:139;;;;:::o;2879:329::-;2938:6;2987:2;2975:9;2966:7;2962:23;2958:32;2955:119;;;2993:79;;:::i;:::-;2955:119;3113:1;3138:53;3183:7;3174:6;3163:9;3159:22;3138:53;:::i;:::-;3128:63;;3084:117;2879:329;;;;:::o;3214:474::-;3282:6;3290;3339:2;3327:9;3318:7;3314:23;3310:32;3307:119;;;3345:79;;:::i;:::-;3307:119;3465:1;3490:53;3535:7;3526:6;3515:9;3511:22;3490:53;:::i;:::-;3480:63;;3436:117;3592:2;3618:53;3663:7;3654:6;3643:9;3639:22;3618:53;:::i;:::-;3608:63;;3563:118;3214:474;;;;;:::o;3694:911::-;3789:6;3797;3805;3813;3821;3870:3;3858:9;3849:7;3845:23;3841:33;3838:120;;;3877:79;;:::i;:::-;3838:120;3997:1;4022:53;4067:7;4058:6;4047:9;4043:22;4022:53;:::i;:::-;4012:63;;3968:117;4124:2;4150:53;4195:7;4186:6;4175:9;4171:22;4150:53;:::i;:::-;4140:63;;4095:118;4252:2;4278:53;4323:7;4314:6;4303:9;4299:22;4278:53;:::i;:::-;4268:63;;4223:118;4380:2;4406:53;4451:7;4442:6;4431:9;4427:22;4406:53;:::i;:::-;4396:63;;4351:118;4508:3;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4479:119;3694:911;;;;;;;;:::o;4611:619::-;4688:6;4696;4704;4753:2;4741:9;4732:7;4728:23;4724:32;4721:119;;;4759:79;;:::i;:::-;4721:119;4879:1;4904:53;4949:7;4940:6;4929:9;4925:22;4904:53;:::i;:::-;4894:63;;4850:117;5006:2;5032:53;5077:7;5068:6;5057:9;5053:22;5032:53;:::i;:::-;5022:63;;4977:118;5134:2;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5105:118;4611:619;;;;;:::o;5236:943::-;5331:6;5339;5347;5355;5404:3;5392:9;5383:7;5379:23;5375:33;5372:120;;;5411:79;;:::i;:::-;5372:120;5531:1;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5502:117;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5786:2;5812:53;5857:7;5848:6;5837:9;5833:22;5812:53;:::i;:::-;5802:63;;5757:118;5942:2;5931:9;5927:18;5914:32;5973:18;5965:6;5962:30;5959:117;;;5995:79;;:::i;:::-;5959:117;6100:62;6154:7;6145:6;6134:9;6130:22;6100:62;:::i;:::-;6090:72;;5885:287;5236:943;;;;;;;:::o;6185:468::-;6250:6;6258;6307:2;6295:9;6286:7;6282:23;6278:32;6275:119;;;6313:79;;:::i;:::-;6275:119;6433:1;6458:53;6503:7;6494:6;6483:9;6479:22;6458:53;:::i;:::-;6448:63;;6404:117;6560:2;6586:50;6628:7;6619:6;6608:9;6604:22;6586:50;:::i;:::-;6576:60;;6531:115;6185:468;;;;;:::o;6659:474::-;6727:6;6735;6784:2;6772:9;6763:7;6759:23;6755:32;6752:119;;;6790:79;;:::i;:::-;6752:119;6910:1;6935:53;6980:7;6971:6;6960:9;6956:22;6935:53;:::i;:::-;6925:63;;6881:117;7037:2;7063:53;7108:7;7099:6;7088:9;7084:22;7063:53;:::i;:::-;7053:63;;7008:118;6659:474;;;;;:::o;7139:323::-;7195:6;7244:2;7232:9;7223:7;7219:23;7215:32;7212:119;;;7250:79;;:::i;:::-;7212:119;7370:1;7395:50;7437:7;7428:6;7417:9;7413:22;7395:50;:::i;:::-;7385:60;;7341:114;7139:323;;;;:::o;7468:345::-;7535:6;7584:2;7572:9;7563:7;7559:23;7555:32;7552:119;;;7590:79;;:::i;:::-;7552:119;7710:1;7735:61;7788:7;7779:6;7768:9;7764:22;7735:61;:::i;:::-;7725:71;;7681:125;7468:345;;;;:::o;7819:609::-;7891:6;7899;7907;7956:2;7944:9;7935:7;7931:23;7927:32;7924:119;;;7962:79;;:::i;:::-;7924:119;8082:1;8107:50;8149:7;8140:6;8129:9;8125:22;8107:50;:::i;:::-;8097:60;;8053:114;8206:2;8232:51;8275:7;8266:6;8255:9;8251:22;8232:51;:::i;:::-;8222:61;;8177:116;8332:2;8358:53;8403:7;8394:6;8383:9;8379:22;8358:53;:::i;:::-;8348:63;;8303:118;7819:609;;;;;:::o;8434:755::-;8515:6;8523;8531;8539;8588:3;8576:9;8567:7;8563:23;8559:33;8556:120;;;8595:79;;:::i;:::-;8556:120;8715:1;8740:50;8782:7;8773:6;8762:9;8758:22;8740:50;:::i;:::-;8730:60;;8686:114;8839:2;8865:51;8908:7;8899:6;8888:9;8884:22;8865:51;:::i;:::-;8855:61;;8810:116;8965:2;8991:53;9036:7;9027:6;9016:9;9012:22;8991:53;:::i;:::-;8981:63;;8936:118;9093:2;9119:53;9164:7;9155:6;9144:9;9140:22;9119:53;:::i;:::-;9109:63;;9064:118;8434:755;;;;;;;:::o;9195:327::-;9253:6;9302:2;9290:9;9281:7;9277:23;9273:32;9270:119;;;9308:79;;:::i;:::-;9270:119;9428:1;9453:52;9497:7;9488:6;9477:9;9473:22;9453:52;:::i;:::-;9443:62;;9399:116;9195:327;;;;:::o;9528:349::-;9597:6;9646:2;9634:9;9625:7;9621:23;9617:32;9614:119;;;9652:79;;:::i;:::-;9614:119;9772:1;9797:63;9852:7;9843:6;9832:9;9828:22;9797:63;:::i;:::-;9787:73;;9743:127;9528:349;;;;:::o;9883:524::-;9963:6;10012:2;10000:9;9991:7;9987:23;9983:32;9980:119;;;10018:79;;:::i;:::-;9980:119;10159:1;10148:9;10144:17;10138:24;10189:18;10181:6;10178:30;10175:117;;;10211:79;;:::i;:::-;10175:117;10316:74;10382:7;10373:6;10362:9;10358:22;10316:74;:::i;:::-;10306:84;;10109:291;9883:524;;;;:::o;10413:329::-;10472:6;10521:2;10509:9;10500:7;10496:23;10492:32;10489:119;;;10527:79;;:::i;:::-;10489:119;10647:1;10672:53;10717:7;10708:6;10697:9;10693:22;10672:53;:::i;:::-;10662:63;;10618:117;10413:329;;;;:::o;10748:351::-;10818:6;10867:2;10855:9;10846:7;10842:23;10838:32;10835:119;;;10873:79;;:::i;:::-;10835:119;10993:1;11018:64;11074:7;11065:6;11054:9;11050:22;11018:64;:::i;:::-;11008:74;;10964:128;10748:351;;;;:::o;11105:474::-;11173:6;11181;11230:2;11218:9;11209:7;11205:23;11201:32;11198:119;;;11236:79;;:::i;:::-;11198:119;11356:1;11381:53;11426:7;11417:6;11406:9;11402:22;11381:53;:::i;:::-;11371:63;;11327:117;11483:2;11509:53;11554:7;11545:6;11534:9;11530:22;11509:53;:::i;:::-;11499:63;;11454:118;11105:474;;;;;:::o;11585:1043::-;11682:6;11690;11698;11706;11714;11722;11771:3;11759:9;11750:7;11746:23;11742:33;11739:120;;;11778:79;;:::i;:::-;11739:120;11898:1;11923:53;11968:7;11959:6;11948:9;11944:22;11923:53;:::i;:::-;11913:63;;11869:117;12025:2;12051:51;12094:7;12085:6;12074:9;12070:22;12051:51;:::i;:::-;12041:61;;11996:116;12151:2;12177:51;12220:7;12211:6;12200:9;12196:22;12177:51;:::i;:::-;12167:61;;12122:116;12277:2;12303:50;12345:7;12336:6;12325:9;12321:22;12303:50;:::i;:::-;12293:60;;12248:115;12402:3;12429:53;12474:7;12465:6;12454:9;12450:22;12429:53;:::i;:::-;12419:63;;12373:119;12531:3;12558:53;12603:7;12594:6;12583:9;12579:22;12558:53;:::i;:::-;12548:63;;12502:119;11585:1043;;;;;;;;:::o;12634:963::-;12733:6;12741;12749;12757;12765;12814:3;12802:9;12793:7;12789:23;12785:33;12782:120;;;12821:79;;:::i;:::-;12782:120;12941:1;12966:62;13020:7;13011:6;13000:9;12996:22;12966:62;:::i;:::-;12956:72;;12912:126;13077:2;13103:62;13157:7;13148:6;13137:9;13133:22;13103:62;:::i;:::-;13093:72;;13048:127;13214:2;13240:61;13293:7;13284:6;13273:9;13269:22;13240:61;:::i;:::-;13230:71;;13185:126;13350:2;13376:64;13432:7;13423:6;13412:9;13408:22;13376:64;:::i;:::-;13366:74;;13321:129;13489:3;13516:64;13572:7;13563:6;13552:9;13548:22;13516:64;:::i;:::-;13506:74;;13460:130;12634:963;;;;;;;;:::o;13603:147::-;13698:45;13737:5;13698:45;:::i;:::-;13693:3;13686:58;13603:147;;:::o;13756:118::-;13843:24;13861:5;13843:24;:::i;:::-;13838:3;13831:37;13756:118;;:::o;13880:109::-;13961:21;13976:5;13961:21;:::i;:::-;13956:3;13949:34;13880:109;;:::o;13995:360::-;14081:3;14109:38;14141:5;14109:38;:::i;:::-;14163:70;14226:6;14221:3;14163:70;:::i;:::-;14156:77;;14242:52;14287:6;14282:3;14275:4;14268:5;14264:16;14242:52;:::i;:::-;14319:29;14341:6;14319:29;:::i;:::-;14314:3;14310:39;14303:46;;14085:270;13995:360;;;;:::o;14361:143::-;14454:43;14491:5;14454:43;:::i;:::-;14449:3;14442:56;14361:143;;:::o;14510:364::-;14598:3;14626:39;14659:5;14626:39;:::i;:::-;14681:71;14745:6;14740:3;14681:71;:::i;:::-;14674:78;;14761:52;14806:6;14801:3;14794:4;14787:5;14783:16;14761:52;:::i;:::-;14838:29;14860:6;14838:29;:::i;:::-;14833:3;14829:39;14822:46;;14602:272;14510:364;;;;:::o;14880:366::-;15022:3;15043:67;15107:2;15102:3;15043:67;:::i;:::-;15036:74;;15119:93;15208:3;15119:93;:::i;:::-;15237:2;15232:3;15228:12;15221:19;;14880:366;;;:::o;15252:::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15252:366;;;:::o;15624:::-;15766:3;15787:67;15851:2;15846:3;15787:67;:::i;:::-;15780:74;;15863:93;15952:3;15863:93;:::i;:::-;15981:2;15976:3;15972:12;15965:19;;15624:366;;;:::o;15996:::-;16138:3;16159:67;16223:2;16218:3;16159:67;:::i;:::-;16152:74;;16235:93;16324:3;16235:93;:::i;:::-;16353:2;16348:3;16344:12;16337:19;;15996:366;;;:::o;16368:::-;16510:3;16531:67;16595:2;16590:3;16531:67;:::i;:::-;16524:74;;16607:93;16696:3;16607:93;:::i;:::-;16725:2;16720:3;16716:12;16709:19;;16368:366;;;:::o;16740:::-;16882:3;16903:67;16967:2;16962:3;16903:67;:::i;:::-;16896:74;;16979:93;17068:3;16979:93;:::i;:::-;17097:2;17092:3;17088:12;17081:19;;16740:366;;;:::o;17112:::-;17254:3;17275:67;17339:2;17334:3;17275:67;:::i;:::-;17268:74;;17351:93;17440:3;17351:93;:::i;:::-;17469:2;17464:3;17460:12;17453:19;;17112:366;;;:::o;17484:::-;17626:3;17647:67;17711:2;17706:3;17647:67;:::i;:::-;17640:74;;17723:93;17812:3;17723:93;:::i;:::-;17841:2;17836:3;17832:12;17825:19;;17484:366;;;:::o;17856:::-;17998:3;18019:67;18083:2;18078:3;18019:67;:::i;:::-;18012:74;;18095:93;18184:3;18095:93;:::i;:::-;18213:2;18208:3;18204:12;18197:19;;17856:366;;;:::o;18228:::-;18370:3;18391:67;18455:2;18450:3;18391:67;:::i;:::-;18384:74;;18467:93;18556:3;18467:93;:::i;:::-;18585:2;18580:3;18576:12;18569:19;;18228:366;;;:::o;18600:::-;18742:3;18763:67;18827:2;18822:3;18763:67;:::i;:::-;18756:74;;18839:93;18928:3;18839:93;:::i;:::-;18957:2;18952:3;18948:12;18941:19;;18600:366;;;:::o;18972:::-;19114:3;19135:67;19199:2;19194:3;19135:67;:::i;:::-;19128:74;;19211:93;19300:3;19211:93;:::i;:::-;19329:2;19324:3;19320:12;19313:19;;18972:366;;;:::o;19344:::-;19486:3;19507:67;19571:2;19566:3;19507:67;:::i;:::-;19500:74;;19583:93;19672:3;19583:93;:::i;:::-;19701:2;19696:3;19692:12;19685:19;;19344:366;;;:::o;19716:::-;19858:3;19879:67;19943:2;19938:3;19879:67;:::i;:::-;19872:74;;19955:93;20044:3;19955:93;:::i;:::-;20073:2;20068:3;20064:12;20057:19;;19716:366;;;:::o;20088:::-;20230:3;20251:67;20315:2;20310:3;20251:67;:::i;:::-;20244:74;;20327:93;20416:3;20327:93;:::i;:::-;20445:2;20440:3;20436:12;20429:19;;20088:366;;;:::o;20460:::-;20602:3;20623:67;20687:2;20682:3;20623:67;:::i;:::-;20616:74;;20699:93;20788:3;20699:93;:::i;:::-;20817:2;20812:3;20808:12;20801:19;;20460:366;;;:::o;20832:::-;20974:3;20995:67;21059:2;21054:3;20995:67;:::i;:::-;20988:74;;21071:93;21160:3;21071:93;:::i;:::-;21189:2;21184:3;21180:12;21173:19;;20832:366;;;:::o;21204:::-;21346:3;21367:67;21431:2;21426:3;21367:67;:::i;:::-;21360:74;;21443:93;21532:3;21443:93;:::i;:::-;21561:2;21556:3;21552:12;21545:19;;21204:366;;;:::o;21576:::-;21718:3;21739:67;21803:2;21798:3;21739:67;:::i;:::-;21732:74;;21815:93;21904:3;21815:93;:::i;:::-;21933:2;21928:3;21924:12;21917:19;;21576:366;;;:::o;21948:::-;22090:3;22111:67;22175:2;22170:3;22111:67;:::i;:::-;22104:74;;22187:93;22276:3;22187:93;:::i;:::-;22305:2;22300:3;22296:12;22289:19;;21948:366;;;:::o;22320:::-;22462:3;22483:67;22547:2;22542:3;22483:67;:::i;:::-;22476:74;;22559:93;22648:3;22559:93;:::i;:::-;22677:2;22672:3;22668:12;22661:19;;22320:366;;;:::o;22692:::-;22834:3;22855:67;22919:2;22914:3;22855:67;:::i;:::-;22848:74;;22931:93;23020:3;22931:93;:::i;:::-;23049:2;23044:3;23040:12;23033:19;;22692:366;;;:::o;23064:::-;23206:3;23227:67;23291:2;23286:3;23227:67;:::i;:::-;23220:74;;23303:93;23392:3;23303:93;:::i;:::-;23421:2;23416:3;23412:12;23405:19;;23064:366;;;:::o;23436:::-;23578:3;23599:67;23663:2;23658:3;23599:67;:::i;:::-;23592:74;;23675:93;23764:3;23675:93;:::i;:::-;23793:2;23788:3;23784:12;23777:19;;23436:366;;;:::o;23808:365::-;23950:3;23971:66;24035:1;24030:3;23971:66;:::i;:::-;23964:73;;24046:93;24135:3;24046:93;:::i;:::-;24164:2;24159:3;24155:12;24148:19;;23808:365;;;:::o;24179:366::-;24321:3;24342:67;24406:2;24401:3;24342:67;:::i;:::-;24335:74;;24418:93;24507:3;24418:93;:::i;:::-;24536:2;24531:3;24527:12;24520:19;;24179:366;;;:::o;24551:118::-;24638:24;24656:5;24638:24;:::i;:::-;24633:3;24626:37;24551:118;;:::o;24675:112::-;24758:22;24774:5;24758:22;:::i;:::-;24753:3;24746:35;24675:112;;:::o;24793:222::-;24886:4;24924:2;24913:9;24909:18;24901:26;;24937:71;25005:1;24994:9;24990:17;24981:6;24937:71;:::i;:::-;24793:222;;;;:::o;25021:458::-;25178:4;25216:2;25205:9;25201:18;25193:26;;25229:79;25305:1;25294:9;25290:17;25281:6;25229:79;:::i;:::-;25318:72;25386:2;25375:9;25371:18;25362:6;25318:72;:::i;:::-;25400;25468:2;25457:9;25453:18;25444:6;25400:72;:::i;:::-;25021:458;;;;;;:::o;25485:656::-;25688:4;25726:3;25715:9;25711:19;25703:27;;25740:79;25816:1;25805:9;25801:17;25792:6;25740:79;:::i;:::-;25829:72;25897:2;25886:9;25882:18;25873:6;25829:72;:::i;:::-;25911;25979:2;25968:9;25964:18;25955:6;25911:72;:::i;:::-;26030:9;26024:4;26020:20;26015:2;26004:9;26000:18;25993:48;26058:76;26129:4;26120:6;26058:76;:::i;:::-;26050:84;;25485:656;;;;;;;:::o;26147:210::-;26234:4;26272:2;26261:9;26257:18;26249:26;;26285:65;26347:1;26336:9;26332:17;26323:6;26285:65;:::i;:::-;26147:210;;;;:::o;26363:446::-;26514:4;26552:2;26541:9;26537:18;26529:26;;26565:77;26639:1;26628:9;26624:17;26615:6;26565:77;:::i;:::-;26652:68;26716:2;26705:9;26701:18;26692:6;26652:68;:::i;:::-;26730:72;26798:2;26787:9;26783:18;26774:6;26730:72;:::i;:::-;26363:446;;;;;;:::o;26815:313::-;26928:4;26966:2;26955:9;26951:18;26943:26;;27015:9;27009:4;27005:20;27001:1;26990:9;26986:17;26979:47;27043:78;27116:4;27107:6;27043:78;:::i;:::-;27035:86;;26815:313;;;;:::o;27134:419::-;27300:4;27338:2;27327:9;27323:18;27315:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27415:131;27541:4;27415:131;:::i;:::-;27407:139;;27134:419;;;:::o;27559:::-;27725:4;27763:2;27752:9;27748:18;27740:26;;27812:9;27806:4;27802:20;27798:1;27787:9;27783:17;27776:47;27840:131;27966:4;27840:131;:::i;:::-;27832:139;;27559:419;;;:::o;27984:::-;28150:4;28188:2;28177:9;28173:18;28165:26;;28237:9;28231:4;28227:20;28223:1;28212:9;28208:17;28201:47;28265:131;28391:4;28265:131;:::i;:::-;28257:139;;27984:419;;;:::o;28409:::-;28575:4;28613:2;28602:9;28598:18;28590:26;;28662:9;28656:4;28652:20;28648:1;28637:9;28633:17;28626:47;28690:131;28816:4;28690:131;:::i;:::-;28682:139;;28409:419;;;:::o;28834:::-;29000:4;29038:2;29027:9;29023:18;29015:26;;29087:9;29081:4;29077:20;29073:1;29062:9;29058:17;29051:47;29115:131;29241:4;29115:131;:::i;:::-;29107:139;;28834:419;;;:::o;29259:::-;29425:4;29463:2;29452:9;29448:18;29440:26;;29512:9;29506:4;29502:20;29498:1;29487:9;29483:17;29476:47;29540:131;29666:4;29540:131;:::i;:::-;29532:139;;29259:419;;;:::o;29684:::-;29850:4;29888:2;29877:9;29873:18;29865:26;;29937:9;29931:4;29927:20;29923:1;29912:9;29908:17;29901:47;29965:131;30091:4;29965:131;:::i;:::-;29957:139;;29684:419;;;:::o;30109:::-;30275:4;30313:2;30302:9;30298:18;30290:26;;30362:9;30356:4;30352:20;30348:1;30337:9;30333:17;30326:47;30390:131;30516:4;30390:131;:::i;:::-;30382:139;;30109:419;;;:::o;30534:::-;30700:4;30738:2;30727:9;30723:18;30715:26;;30787:9;30781:4;30777:20;30773:1;30762:9;30758:17;30751:47;30815:131;30941:4;30815:131;:::i;:::-;30807:139;;30534:419;;;:::o;30959:::-;31125:4;31163:2;31152:9;31148:18;31140:26;;31212:9;31206:4;31202:20;31198:1;31187:9;31183:17;31176:47;31240:131;31366:4;31240:131;:::i;:::-;31232:139;;30959:419;;;:::o;31384:::-;31550:4;31588:2;31577:9;31573:18;31565:26;;31637:9;31631:4;31627:20;31623:1;31612:9;31608:17;31601:47;31665:131;31791:4;31665:131;:::i;:::-;31657:139;;31384:419;;;:::o;31809:::-;31975:4;32013:2;32002:9;31998:18;31990:26;;32062:9;32056:4;32052:20;32048:1;32037:9;32033:17;32026:47;32090:131;32216:4;32090:131;:::i;:::-;32082:139;;31809:419;;;:::o;32234:::-;32400:4;32438:2;32427:9;32423:18;32415:26;;32487:9;32481:4;32477:20;32473:1;32462:9;32458:17;32451:47;32515:131;32641:4;32515:131;:::i;:::-;32507:139;;32234:419;;;:::o;32659:::-;32825:4;32863:2;32852:9;32848:18;32840:26;;32912:9;32906:4;32902:20;32898:1;32887:9;32883:17;32876:47;32940:131;33066:4;32940:131;:::i;:::-;32932:139;;32659:419;;;:::o;33084:::-;33250:4;33288:2;33277:9;33273:18;33265:26;;33337:9;33331:4;33327:20;33323:1;33312:9;33308:17;33301:47;33365:131;33491:4;33365:131;:::i;:::-;33357:139;;33084:419;;;:::o;33509:::-;33675:4;33713:2;33702:9;33698:18;33690:26;;33762:9;33756:4;33752:20;33748:1;33737:9;33733:17;33726:47;33790:131;33916:4;33790:131;:::i;:::-;33782:139;;33509:419;;;:::o;33934:::-;34100:4;34138:2;34127:9;34123:18;34115:26;;34187:9;34181:4;34177:20;34173:1;34162:9;34158:17;34151:47;34215:131;34341:4;34215:131;:::i;:::-;34207:139;;33934:419;;;:::o;34359:::-;34525:4;34563:2;34552:9;34548:18;34540:26;;34612:9;34606:4;34602:20;34598:1;34587:9;34583:17;34576:47;34640:131;34766:4;34640:131;:::i;:::-;34632:139;;34359:419;;;:::o;34784:::-;34950:4;34988:2;34977:9;34973:18;34965:26;;35037:9;35031:4;35027:20;35023:1;35012:9;35008:17;35001:47;35065:131;35191:4;35065:131;:::i;:::-;35057:139;;34784:419;;;:::o;35209:::-;35375:4;35413:2;35402:9;35398:18;35390:26;;35462:9;35456:4;35452:20;35448:1;35437:9;35433:17;35426:47;35490:131;35616:4;35490:131;:::i;:::-;35482:139;;35209:419;;;:::o;35634:::-;35800:4;35838:2;35827:9;35823:18;35815:26;;35887:9;35881:4;35877:20;35873:1;35862:9;35858:17;35851:47;35915:131;36041:4;35915:131;:::i;:::-;35907:139;;35634:419;;;:::o;36059:::-;36225:4;36263:2;36252:9;36248:18;36240:26;;36312:9;36306:4;36302:20;36298:1;36287:9;36283:17;36276:47;36340:131;36466:4;36340:131;:::i;:::-;36332:139;;36059:419;;;:::o;36484:::-;36650:4;36688:2;36677:9;36673:18;36665:26;;36737:9;36731:4;36727:20;36723:1;36712:9;36708:17;36701:47;36765:131;36891:4;36765:131;:::i;:::-;36757:139;;36484:419;;;:::o;36909:::-;37075:4;37113:2;37102:9;37098:18;37090:26;;37162:9;37156:4;37152:20;37148:1;37137:9;37133:17;37126:47;37190:131;37316:4;37190:131;:::i;:::-;37182:139;;36909:419;;;:::o;37334:::-;37500:4;37538:2;37527:9;37523:18;37515:26;;37587:9;37581:4;37577:20;37573:1;37562:9;37558:17;37551:47;37615:131;37741:4;37615:131;:::i;:::-;37607:139;;37334:419;;;:::o;37759:::-;37925:4;37963:2;37952:9;37948:18;37940:26;;38012:9;38006:4;38002:20;37998:1;37987:9;37983:17;37976:47;38040:131;38166:4;38040:131;:::i;:::-;38032:139;;37759:419;;;:::o;38184:222::-;38277:4;38315:2;38304:9;38300:18;38292:26;;38328:71;38396:1;38385:9;38381:17;38372:6;38328:71;:::i;:::-;38184:222;;;;:::o;38412:747::-;38631:4;38669:3;38658:9;38654:19;38646:27;;38683:71;38751:1;38740:9;38736:17;38727:6;38683:71;:::i;:::-;38764:68;38828:2;38817:9;38813:18;38804:6;38764:68;:::i;:::-;38842;38906:2;38895:9;38891:18;38882:6;38842:68;:::i;:::-;38920:66;38982:2;38971:9;38967:18;38958:6;38920:66;:::i;:::-;38996:73;39064:3;39053:9;39049:19;39040:6;38996:73;:::i;:::-;39079;39147:3;39136:9;39132:19;39123:6;39079:73;:::i;:::-;38412:747;;;;;;;;;:::o;39165:129::-;39199:6;39226:20;;:::i;:::-;39216:30;;39255:33;39283:4;39275:6;39255:33;:::i;:::-;39165:129;;;:::o;39300:75::-;39333:6;39366:2;39360:9;39350:19;;39300:75;:::o;39381:307::-;39442:4;39532:18;39524:6;39521:30;39518:56;;;39554:18;;:::i;:::-;39518:56;39592:29;39614:6;39592:29;:::i;:::-;39584:37;;39676:4;39670;39666:15;39658:23;;39381:307;;;:::o;39694:308::-;39756:4;39846:18;39838:6;39835:30;39832:56;;;39868:18;;:::i;:::-;39832:56;39906:29;39928:6;39906:29;:::i;:::-;39898:37;;39990:4;39984;39980:15;39972:23;;39694:308;;;:::o;40008:98::-;40059:6;40093:5;40087:12;40077:22;;40008:98;;;:::o;40112:99::-;40164:6;40198:5;40192:12;40182:22;;40112:99;;;:::o;40217:168::-;40300:11;40334:6;40329:3;40322:19;40374:4;40369:3;40365:14;40350:29;;40217:168;;;;:::o;40391:169::-;40475:11;40509:6;40504:3;40497:19;40549:4;40544:3;40540:14;40525:29;;40391:169;;;;:::o;40566:305::-;40606:3;40625:20;40643:1;40625:20;:::i;:::-;40620:25;;40659:20;40677:1;40659:20;:::i;:::-;40654:25;;40813:1;40745:66;40741:74;40738:1;40735:81;40732:107;;;40819:18;;:::i;:::-;40732:107;40863:1;40860;40856:9;40849:16;;40566:305;;;;:::o;40877:185::-;40917:1;40934:20;40952:1;40934:20;:::i;:::-;40929:25;;40968:20;40986:1;40968:20;:::i;:::-;40963:25;;41007:1;40997:35;;41012:18;;:::i;:::-;40997:35;41054:1;41051;41047:9;41042:14;;40877:185;;;;:::o;41068:348::-;41108:7;41131:20;41149:1;41131:20;:::i;:::-;41126:25;;41165:20;41183:1;41165:20;:::i;:::-;41160:25;;41353:1;41285:66;41281:74;41278:1;41275:81;41270:1;41263:9;41256:17;41252:105;41249:131;;;41360:18;;:::i;:::-;41249:131;41408:1;41405;41401:9;41390:20;;41068:348;;;;:::o;41422:191::-;41462:4;41482:20;41500:1;41482:20;:::i;:::-;41477:25;;41516:20;41534:1;41516:20;:::i;:::-;41511:25;;41555:1;41552;41549:8;41546:34;;;41560:18;;:::i;:::-;41546:34;41605:1;41602;41598:9;41590:17;;41422:191;;;;:::o;41619:96::-;41656:7;41685:24;41703:5;41685:24;:::i;:::-;41674:35;;41619:96;;;:::o;41721:90::-;41755:7;41798:5;41791:13;41784:21;41773:32;;41721:90;;;:::o;41817:149::-;41853:7;41893:66;41886:5;41882:78;41871:89;;41817:149;;;:::o;41972:126::-;42009:7;42049:42;42042:5;42038:54;42027:65;;41972:126;;;:::o;42104:77::-;42141:7;42170:5;42159:16;;42104:77;;;:::o;42187:86::-;42222:7;42262:4;42255:5;42251:16;42240:27;;42187:86;;;:::o;42279:134::-;42337:9;42370:37;42401:5;42370:37;:::i;:::-;42357:50;;42279:134;;;:::o;42419:117::-;42475:9;42508:22;42524:5;42508:22;:::i;:::-;42495:35;;42419:117;;;:::o;42542:126::-;42592:9;42625:37;42656:5;42625:37;:::i;:::-;42612:50;;42542:126;;;:::o;42674:113::-;42724:9;42757:24;42775:5;42757:24;:::i;:::-;42744:37;;42674:113;;;:::o;42793:154::-;42877:6;42872:3;42867;42854:30;42939:1;42930:6;42925:3;42921:16;42914:27;42793:154;;;:::o;42953:307::-;43021:1;43031:113;43045:6;43042:1;43039:13;43031:113;;;43130:1;43125:3;43121:11;43115:18;43111:1;43106:3;43102:11;43095:39;43067:2;43064:1;43060:10;43055:15;;43031:113;;;43162:6;43159:1;43156:13;43153:101;;;43242:1;43233:6;43228:3;43224:16;43217:27;43153:101;43002:258;42953:307;;;:::o;43266:171::-;43305:3;43328:24;43346:5;43328:24;:::i;:::-;43319:33;;43374:4;43367:5;43364:15;43361:41;;;43382:18;;:::i;:::-;43361:41;43429:1;43422:5;43418:13;43411:20;;43266:171;;;:::o;43443:320::-;43487:6;43524:1;43518:4;43514:12;43504:22;;43571:1;43565:4;43561:12;43592:18;43582:81;;43648:4;43640:6;43636:17;43626:27;;43582:81;43710:2;43702:6;43699:14;43679:18;43676:38;43673:84;;;43729:18;;:::i;:::-;43673:84;43494:269;43443:320;;;:::o;43769:281::-;43852:27;43874:4;43852:27;:::i;:::-;43844:6;43840:40;43982:6;43970:10;43967:22;43946:18;43934:10;43931:34;43928:62;43925:88;;;43993:18;;:::i;:::-;43925:88;44033:10;44029:2;44022:22;43812:238;43769:281;;:::o;44056:233::-;44095:3;44118:24;44136:5;44118:24;:::i;:::-;44109:33;;44164:66;44157:5;44154:77;44151:103;;;44234:18;;:::i;:::-;44151:103;44281:1;44274:5;44270:13;44263:20;;44056:233;;;:::o;44295:180::-;44343:77;44340:1;44333:88;44440:4;44437:1;44430:15;44464:4;44461:1;44454:15;44481:180;44529:77;44526:1;44519:88;44626:4;44623:1;44616:15;44650:4;44647:1;44640:15;44667:180;44715:77;44712:1;44705:88;44812:4;44809:1;44802:15;44836:4;44833:1;44826:15;44853:180;44901:77;44898:1;44891:88;44998:4;44995:1;44988:15;45022:4;45019:1;45012:15;45039:180;45087:77;45084:1;45077:88;45184:4;45181:1;45174:15;45208:4;45205:1;45198:15;45225:117;45334:1;45331;45324:12;45348:117;45457:1;45454;45447:12;45471:117;45580:1;45577;45570:12;45594:117;45703:1;45700;45693:12;45717:102;45758:6;45809:2;45805:7;45800:2;45793:5;45789:14;45785:28;45775:38;;45717:102;;;:::o;45825:237::-;45965:34;45961:1;45953:6;45949:14;45942:58;46034:20;46029:2;46021:6;46017:15;46010:45;45825:237;:::o;46068:225::-;46208:34;46204:1;46196:6;46192:14;46185:58;46277:8;46272:2;46264:6;46260:15;46253:33;46068:225;:::o;46299:178::-;46439:30;46435:1;46427:6;46423:14;46416:54;46299:178;:::o;46483:165::-;46623:17;46619:1;46611:6;46607:14;46600:41;46483:165;:::o;46654:223::-;46794:34;46790:1;46782:6;46778:14;46771:58;46863:6;46858:2;46850:6;46846:15;46839:31;46654:223;:::o;46883:175::-;47023:27;47019:1;47011:6;47007:14;47000:51;46883:175;:::o;47064:231::-;47204:34;47200:1;47192:6;47188:14;47181:58;47273:14;47268:2;47260:6;47256:15;47249:39;47064:231;:::o;47301:243::-;47441:34;47437:1;47429:6;47425:14;47418:58;47510:26;47505:2;47497:6;47493:15;47486:51;47301:243;:::o;47550:165::-;47690:17;47686:1;47678:6;47674:14;47667:41;47550:165;:::o;47721:229::-;47861:34;47857:1;47849:6;47845:14;47838:58;47930:12;47925:2;47917:6;47913:15;47906:37;47721:229;:::o;47956:228::-;48096:34;48092:1;48084:6;48080:14;48073:58;48165:11;48160:2;48152:6;48148:15;48141:36;47956:228;:::o;48190:182::-;48330:34;48326:1;48318:6;48314:14;48307:58;48190:182;:::o;48378:164::-;48518:16;48514:1;48506:6;48502:14;48495:40;48378:164;:::o;48548:161::-;48688:13;48684:1;48676:6;48672:14;48665:37;48548:161;:::o;48715:165::-;48855:17;48851:1;48843:6;48839:14;48832:41;48715:165;:::o;48886:231::-;49026:34;49022:1;49014:6;49010:14;49003:58;49095:14;49090:2;49082:6;49078:15;49071:39;48886:231;:::o;49123:182::-;49263:34;49259:1;49251:6;49247:14;49240:58;49123:182;:::o;49311:228::-;49451:34;49447:1;49439:6;49435:14;49428:58;49520:11;49515:2;49507:6;49503:15;49496:36;49311:228;:::o;49545:181::-;49685:33;49681:1;49673:6;49669:14;49662:57;49545:181;:::o;49732:163::-;49872:15;49868:1;49860:6;49856:14;49849:39;49732:163;:::o;49901:220::-;50041:34;50037:1;50029:6;50025:14;50018:58;50110:3;50105:2;50097:6;50093:15;50086:28;49901:220;:::o;50127:236::-;50267:34;50263:1;50255:6;50251:14;50244:58;50336:19;50331:2;50323:6;50319:15;50312:44;50127:236;:::o;50369:163::-;50509:15;50505:1;50497:6;50493:14;50486:39;50369:163;:::o;50538:162::-;50678:14;50674:1;50666:6;50662:14;50655:38;50538:162;:::o;50706:159::-;50846:11;50842:1;50834:6;50830:14;50823:35;50706:159;:::o;50871:166::-;51011:18;51007:1;50999:6;50995:14;50988:42;50871:166;:::o;51043:122::-;51116:24;51134:5;51116:24;:::i;:::-;51109:5;51106:35;51096:63;;51155:1;51152;51145:12;51096:63;51043:122;:::o;51171:116::-;51241:21;51256:5;51241:21;:::i;:::-;51234:5;51231:32;51221:60;;51277:1;51274;51267:12;51221:60;51171:116;:::o;51293:120::-;51365:23;51382:5;51365:23;:::i;:::-;51358:5;51355:34;51345:62;;51403:1;51400;51393:12;51345:62;51293:120;:::o;51419:122::-;51492:24;51510:5;51492:24;:::i;:::-;51485:5;51482:35;51472:63;;51531:1;51528;51521:12;51472:63;51419:122;:::o;51547:118::-;51618:22;51634:5;51618:22;:::i;:::-;51611:5;51608:33;51598:61;;51655:1;51652;51645:12;51598:61;51547:118;:::o
Swarm Source
ipfs://b8f7235c4f59f04125eade438b2dfd779c973d19b24d1de2bcf76ebc9f0507e2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.