Source Code
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,316 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Unstake BGF Safe | 15140123 | 1313 days ago | IN | 0 ETH | 0.00092547 | ||||
| Unstake BGF Safe | 15140123 | 1313 days ago | IN | 0 ETH | 0.00102367 | ||||
| Unstake BGF Safe | 15140123 | 1313 days ago | IN | 0 ETH | 0.00107208 | ||||
| Unstake BGF Safe | 15140123 | 1313 days ago | IN | 0 ETH | 0.00107208 | ||||
| Unstake BGF Safe | 15140119 | 1313 days ago | IN | 0 ETH | 0.00094604 | ||||
| Set Bgf Vault | 15140119 | 1313 days ago | IN | 0 ETH | 0.00021916 | ||||
| Stake BGF | 15140118 | 1313 days ago | IN | 0 ETH | 0.00667589 | ||||
| Set Bgf Vault | 15140116 | 1313 days ago | IN | 0 ETH | 0.00021453 | ||||
| Unstake BGF Safe | 15140103 | 1313 days ago | IN | 0 ETH | 0.00126526 | ||||
| Unstake BGF Safe | 15140103 | 1313 days ago | IN | 0 ETH | 0.00136752 | ||||
| Unstake BGF Safe | 15140103 | 1313 days ago | IN | 0 ETH | 0.00128519 | ||||
| Unstake BGF Safe | 15140103 | 1313 days ago | IN | 0 ETH | 0.00136752 | ||||
| Unstake BGF Safe | 15140103 | 1313 days ago | IN | 0 ETH | 0.00128519 | ||||
| Set Bgf Vault | 15140099 | 1313 days ago | IN | 0 ETH | 0.00029368 | ||||
| Stake BGF | 15140099 | 1313 days ago | IN | 0 ETH | 0.00862677 | ||||
| Set Bgf Vault | 15140095 | 1313 days ago | IN | 0 ETH | 0.00033533 | ||||
| Set Bgf Vault | 15140092 | 1313 days ago | IN | 0 ETH | 0.00028603 | ||||
| Set Bgf Vault | 15140090 | 1313 days ago | IN | 0 ETH | 0.00023209 | ||||
| Unstake BGF Safe | 15140090 | 1313 days ago | IN | 0 ETH | 0.00102754 | ||||
| Unstake BGF Safe | 15140090 | 1313 days ago | IN | 0 ETH | 0.00106605 | ||||
| Unstake BGF Safe | 15140084 | 1313 days ago | IN | 0 ETH | 0.00078243 | ||||
| Unstake BGF Safe | 15140084 | 1313 days ago | IN | 0 ETH | 0.00075549 | ||||
| Unstake BGF Safe | 15140077 | 1313 days ago | IN | 0 ETH | 0.00087761 | ||||
| Set Bgf Vault | 15140077 | 1313 days ago | IN | 0 ETH | 0.0002001 | ||||
| Stake BGF | 15140068 | 1313 days ago | IN | 0 ETH | 0.00646015 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
HELLISHVAULT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-06-23
*/
/**
*Submitted for verification at Etherscan.io on 2022-06-21
*/
// SPDX-License-Identifier: MIT LICENSE
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length)
internal
pure
returns (string memory)
{
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
"Address: insufficient balance"
);
(bool success, ) = recipient.call{value: amount}("");
require(
success,
"Address: unable to send value, recipient may have reverted"
);
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"Address: low-level call with value failed"
);
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"Address: insufficient balance for call"
);
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data)
internal
view
returns (bytes memory)
{
return
functionStaticCall(
target,
data,
"Address: low-level static call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionDelegateCall(
target,
data,
"Address: low-level delegate call failed"
);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @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);
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool)
{
return interfaceId == type(IERC165).interfaceId;
}
}
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(
address indexed from,
address indexed to,
uint256 indexed tokenId
);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(
address indexed owner,
address indexed approved,
uint256 indexed tokenId
);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @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`.
*
* 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;
/**
* @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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId)
external
view
returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index)
external
view
returns (uint256);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/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}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC165, IERC165)
returns (bool)
{
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner)
public
view
virtual
override
returns (uint256)
{
require(
owner != address(0),
"ERC721: balance query for the zero address"
);
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId)
public
view
virtual
override
returns (address)
{
address owner = _owners[tokenId];
require(
owner != address(0),
"ERC721: owner query for nonexistent token"
);
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
string memory baseURI = _baseURI();
return
bytes(baseURI).length > 0
? string(abi.encodePacked(baseURI, tokenId.toString()))
: "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overridden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId)
public
view
virtual
override
returns (address)
{
require(
_exists(tokenId),
"ERC721: approved query for nonexistent token"
);
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved)
public
virtual
override
{
_setApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator)
public
view
virtual
override
returns (bool)
{
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(
_isApprovedOrOwner(_msgSender(), tokenId),
"ERC721: transfer caller is not owner nor approved"
);
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(
_isApprovedOrOwner(_msgSender(), tokenId),
"ERC721: transfer caller is not owner nor approved"
);
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(
_checkOnERC721Received(from, to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId)
internal
view
virtual
returns (bool)
{
require(
_exists(tokenId),
"ERC721: operator query for nonexistent token"
);
address owner = ERC721.ownerOf(tokenId);
return (spender == owner ||
isApprovedForAll(owner, spender) ||
getApproved(tokenId) == spender);
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
_afterTokenTransfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = 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);
_afterTokenTransfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(
ERC721.ownerOf(tokenId) == from,
"ERC721: transfer from incorrect owner"
);
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
_afterTokenTransfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Approve `operator` to operate on all of `owner` tokens
*
* Emits a {ApprovalForAll} event.
*/
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try
IERC721Receiver(to).onERC721Received(
_msgSender(),
from,
tokenId,
_data
)
returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert(
"ERC721: transfer to non ERC721Receiver implementer"
);
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(IERC165, ERC721)
returns (bool)
{
return
interfaceId == type(IERC721Enumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index)
public
view
virtual
override
returns (uint256)
{
require(
index < ERC721.balanceOf(owner),
"ERC721Enumerable: owner index out of bounds"
);
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index)
public
view
virtual
override
returns (uint256)
{
require(
index < ERC721Enumerable.totalSupply(),
"ERC721Enumerable: global index out of bounds"
);
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
private
{
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
pragma solidity 0.8.4;
contract HELLISHVAULT is Ownable, IERC721Receiver {
struct vaultInfo {
IERC721 nft;
string name;
}
struct Stake {
uint24 tokenId;
uint256 timestamp;
address owner;
uint256 tower;
uint256 familiar;
}
struct LegendaryLocked {
uint24 tokenId;
address owner;
}
struct Tower {
uint24 tokenId;
uint256 timestamp;
address owner;
}
vaultInfo[] public VaultInfo;
LegendaryLocked[] public LegendsLocked;
uint256 public totalStaked = 0;
uint256 public activatedTowers;
uint256 public bgfVault = 0;
uint256 public towerVault = 1;
uint256 public legendaryVault = 2;
address public familiars;
address public towers;
uint256 public rewardInterval = 1 days;
uint256 public rewardRegular = 10;
uint256 public rewardElite = 15;
uint256 public rewardLegendary = 25;
bool public claimingEnabled = true;
bool public stakingEnabled = false;
bool public spendingEnabled = true;
mapping(uint256 => Stake) public vault;
mapping(uint256 => LegendaryLocked) public lockedLegendaries;
mapping(uint256 => Tower) public activeTowers;
mapping(address => uint256) public bank;
mapping(address => uint256) public addrTotalStake;
mapping(address => uint256) public addrTotalTowers;
mapping(address => uint256) public addrTotalFamiliars;
event NFTStaked(address owner, uint256 tokenId, uint256 value);
event NFTUnstaked(address owner, uint256 tokenId, uint256 value);
event Claimed(address owner, uint256 amount);
function addVault(IERC721 _nft, string calldata _name) public {
VaultInfo.push(vaultInfo({nft: _nft, name: _name}));
}
function stakeBGF(uint256[] calldata tokenIds) external {
require(stakingEnabled, "Staking functions are disabled.");
_stakeBGF(tokenIds);
}
function _stakeBGF(uint256[] calldata tokenIds) internal {
uint256 tokenId;
uint256 userTowers = addrTotalTowers[msg.sender];
uint256 userStaked = addrTotalStake[msg.sender];
uint256 totalStakeInput = userStaked + tokenIds.length;
require(totalStakeInput < 12, "Max allowance is 12.");
if (totalStakeInput > 1) {
require(userTowers > 0, "Boost not found.");
if (totalStakeInput > 6) {
require(userTowers > 1, "Boost maxed out.");
}
}
totalStaked += tokenIds.length;
vaultInfo storage vaultid = VaultInfo[bgfVault];
addrTotalFamiliars[msg.sender] = IERC721(familiars).balanceOf(
msg.sender
);
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
require(
vaultid.nft.ownerOf(tokenId) == msg.sender,
"Caller is not token owner."
);
require(vault[tokenId].tokenId == 0, "NFT already staked.");
vaultid.nft.transferFrom(msg.sender, address(this), tokenId);
emit NFTStaked(msg.sender, tokenId, block.timestamp);
vault[tokenId] = Stake({
owner: msg.sender,
tokenId: uint24(tokenId),
timestamp: uint256(block.timestamp),
tower: userTowers,
familiar: addrTotalFamiliars[msg.sender]
});
addrTotalStake[msg.sender] += 1;
}
}
function unstakeBGF(uint256[] calldata tokenIds) external {
require(stakingEnabled, "Staking functions are disabled.");
_unstakeBGF(tokenIds);
}
function _unstakeBGF(uint256[] calldata tokenIds) internal {
uint256 tokenId;
vaultInfo storage vaultid = VaultInfo[bgfVault];
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
Stake memory staked = vault[tokenId];
require(staked.owner == msg.sender, "Caller is not token owner.");
delete vault[tokenId];
totalStaked -= tokenIds.length;
addrTotalStake[msg.sender] -= 1;
emit NFTUnstaked(msg.sender, tokenId, block.timestamp);
vaultid.nft.transferFrom(address(this), msg.sender, tokenId);
}
}
function activateTower(uint256 tokenId) external {
require(stakingEnabled, "Staking functions are disabled.");
_activateTower(tokenId);
}
function _activateTower(uint256 tokenId) internal {
vaultInfo storage vaultid = VaultInfo[towerVault];
uint256 totalTowers = addrTotalTowers[msg.sender]; // balanceOf(msg.sender, towerVault);
require(totalTowers < 2, "Max Towers activated.");
require(
vaultid.nft.ownerOf(tokenId) == msg.sender,
"Caller is not token owner."
);
require(activeTowers[tokenId].tokenId == 0, "NFT already staked.");
vaultid.nft.transferFrom(msg.sender, address(this), tokenId);
emit NFTStaked(msg.sender, tokenId, block.timestamp);
activeTowers[tokenId] = Tower({
tokenId: uint24(tokenId),
timestamp: uint256(block.timestamp),
owner: msg.sender
});
activatedTowers++;
addrTotalTowers[msg.sender] += 1;
}
function deactivateTower(uint256 tokenId) external {
require(stakingEnabled, "Staking functions are disabled.");
_deactivateTower(tokenId);
}
function _deactivateTower(uint256 tokenId) internal {
require(
activeTowers[tokenId].owner == msg.sender,
"Caller is not token owner."
);
uint256 userStaked = addrTotalStake[msg.sender];
uint256 userTowers = addrTotalTowers[msg.sender];
require(userStaked < 6, "Not allowed, too much at stake!");
if (userStaked <= 1) {
require(userTowers > 0, "Not allowed!");
}
if (userStaked > 1) {
require(userTowers == 2, "Not allowed while boost activated!");
}
activatedTowers--;
vaultInfo storage vaultid = VaultInfo[towerVault];
vaultid.nft.transferFrom(address(this), msg.sender, tokenId);
emit NFTUnstaked(msg.sender, tokenId, block.timestamp);
delete activeTowers[tokenId];
addrTotalTowers[msg.sender] -= 1;
}
function claim(uint256[] calldata tokenIds, bool _unstake) external {
require(stakingEnabled, "Staking functions are disabled.");
_claim(tokenIds, _unstake);
}
function _claim(uint256[] calldata tokenIds, bool _unstake) internal {
uint256 tokenId;
uint256 stakedTime;
uint256 earned = 0;
uint256 towerBoost = 0;
uint256 familiarBoost = 0;
uint256 userTokens = addrTotalStake[msg.sender];
uint256 userFamiliars = addrTotalFamiliars[msg.sender];
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
Stake memory staked = vault[tokenId];
require(staked.owner == msg.sender, "Not token owner.");
stakedTime += block.timestamp - staked.timestamp;
//Legendary Tier Rewards
if (tokenId >= 1 && tokenId <= 10) {
earned += (stakedTime / rewardInterval) * rewardLegendary;
}
//Elite Tier Rewards
else if (tokenId >= 5510 && tokenId <= 6000) {
earned += (stakedTime / rewardInterval) * rewardElite;
}
//Regular Tier Rewards
else {
earned += (stakedTime / rewardInterval) * rewardRegular;
}
vault[tokenId] = Stake({
owner: staked.owner,
tokenId: uint24(tokenId),
timestamp: uint256(block.timestamp),
tower: staked.tower,
familiar: staked.familiar
});
}
if (userTokens == 6) {
towerBoost = (3 * earned) / 100;
}
if (userTokens == 12) {
towerBoost = (6 * earned) / 100;
}
if (userFamiliars == 1) {
familiarBoost = ((20 * earned) / 100);
}
if (userFamiliars > 1) {
familiarBoost = ((35 * earned) / 100);
}
earned = earned + towerBoost + familiarBoost;
bank[msg.sender] += earned;
if (_unstake) {
_unstakeBGF(tokenIds);
}
emit Claimed(msg.sender, earned);
}
function earningInfo(uint256[] calldata tokenIds)
public
view
returns (uint256)
{
uint256 tokenId;
uint256 stakedTime;
uint256 earned = 0;
uint256 towerBoost = 0;
uint256 familiarBoost = 0;
uint256 userTokens = addrTotalStake[msg.sender];
uint256 userFamiliars = addrTotalFamiliars[msg.sender];
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
Stake memory staked = vault[tokenId];
require(staked.owner == msg.sender, "Not token owner.");
stakedTime += block.timestamp - staked.timestamp;
//Legendary Tier Rewards
if (tokenId >= 1 && tokenId <= 10) {
earned += (stakedTime / rewardInterval) * rewardLegendary;
}
//Elite Tier Rewards
else if (tokenId >= 5510 && tokenId <= 6000) {
earned += (stakedTime / rewardInterval) * rewardElite;
}
//Regular Tier Rewards
else {
earned += (stakedTime / rewardInterval) * rewardRegular;
}
}
if (userTokens == 6) {
towerBoost = (3 * earned) / 100;
}
if (userTokens == 12) {
towerBoost = (6 * earned) / 100;
}
if (userFamiliars == 1) {
familiarBoost = ((20 * earned) / 100);
}
if (userFamiliars > 1) {
familiarBoost = ((35 * earned) / 100);
}
earned = earned + towerBoost + familiarBoost;
return earned;
}
function getBankBalance(address _address) public view returns (uint256) {
return bank[_address];
}
function spendBalanceFamiliars(address _address, uint256 _amount) public {
require(spendingEnabled, "Balance spending functions are disabled.");
require(msg.sender == familiars, "Not Allowed.");
bank[_address] -= _amount;
}
function spendBalanceTowers(address _address, uint256 _amount) public {
require(spendingEnabled, "Balance spending functions are disabled.");
require(msg.sender == towers, "Not Allowed.");
bank[_address] -= _amount;
}
function addStyxBalance(address _address, uint256 _amount)
public
onlyOwner
{
bank[_address] += _amount;
}
function tokensOfOwner(address account)
public
view
returns (uint256[] memory)
{
uint256[] memory tmp = new uint256[](totalStaked);
uint256 index = 0;
for (uint256 tokenId = 1; tokenId <= totalStaked; tokenId++) {
if (vault[tokenId].owner == account) {
tmp[index] = vault[tokenId].tokenId;
index += 1;
}
}
uint256[] memory tokens = new uint256[](index);
for (uint256 i = 0; i < index; i++) {
tokens[i] = tmp[i];
}
return tokens;
}
function lockLegendary(uint256[] calldata tokenIds) public onlyOwner {
uint256 tokenId;
vaultInfo storage vaultid = VaultInfo[legendaryVault];
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
require(
lockedLegendaries[tokenId].tokenId == 0,
"NFT already locked."
);
vaultid.nft.transferFrom(msg.sender, address(this), tokenId);
emit NFTStaked(msg.sender, tokenId, block.timestamp);
lockedLegendaries[tokenId] = LegendaryLocked({
owner: msg.sender,
tokenId: uint24(tokenId)
});
}
}
function unlockLegendary(uint256 _tokenId) public {
require(spendingEnabled, "Staking functions are disabled.");
uint256 price = 0;
vaultInfo storage vaultid = VaultInfo[legendaryVault];
require(
lockedLegendaries[_tokenId].tokenId == _tokenId,
"Invalid token id."
);
if (_tokenId >= 1 && _tokenId <= 3) {
price = 600;
}
if (_tokenId >= 4 && _tokenId <= 7) {
price = 640;
}
if (_tokenId >= 4 && _tokenId <= 7) {
price = 700;
}
if (msg.sender != owner()) {
require(bank[msg.sender] >= price, "Insufficient balance.");
}
bank[msg.sender] -= price;
delete lockedLegendaries[_tokenId];
emit NFTUnstaked(msg.sender, _tokenId, block.timestamp);
vaultid.nft.transferFrom(address(this), msg.sender, _tokenId);
}
//Only Owner
function unstakeBGFSafe(uint256[] calldata tokenIds) public onlyOwner {
uint256 tokenId;
vaultInfo storage vaultid = VaultInfo[bgfVault];
for (uint256 i = 0; i < tokenIds.length; i++) {
tokenId = tokenIds[i];
delete vault[tokenId];
totalStaked -= tokenIds.length;
addrTotalStake[msg.sender] -= 1;
emit NFTUnstaked(msg.sender, tokenId, block.timestamp);
vaultid.nft.transferFrom(address(this), msg.sender, tokenId);
}
}
function unlockLegendarySafe(uint256 _tokenId) public onlyOwner {
vaultInfo storage vaultid = VaultInfo[legendaryVault];
require(
lockedLegendaries[_tokenId].tokenId == _tokenId,
"Invalid token id."
);
delete lockedLegendaries[_tokenId];
emit NFTUnstaked(msg.sender, _tokenId, block.timestamp);
vaultid.nft.transferFrom(address(this), msg.sender, _tokenId);
}
function deactivateTowerSafe(uint256 tokenId) public onlyOwner {
require(activeTowers[tokenId].tokenId == tokenId, "Invalid token id.");
activatedTowers--;
vaultInfo storage vaultid = VaultInfo[towerVault];
vaultid.nft.transferFrom(address(this), msg.sender, tokenId);
emit NFTUnstaked(msg.sender, tokenId, block.timestamp);
delete activeTowers[tokenId];
addrTotalTowers[activeTowers[tokenId].owner] -= 1;
}
function setBgfVault(uint256 _vault) public onlyOwner {
bgfVault = _vault;
}
function setTowerVault(uint256 _vault) public onlyOwner {
towerVault = _vault;
}
function setFamiliarsAddress(address _address) public onlyOwner {
familiars = _address;
}
function setTowersAddress(address _address) public onlyOwner {
towers = _address;
}
function toggleStaking(bool _state) public onlyOwner {
stakingEnabled = _state;
}
function toggleSpending(bool _state) public onlyOwner {
spendingEnabled = _state;
}
function onERC721Received(
address,
address from,
uint256,
bytes calldata
) external pure override returns (bytes4) {
require(from == address(0x0), "Cannot send Tokens to Vault directly");
return IERC721Receiver.onERC721Received.selector;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"NFTUnstaked","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"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"LegendsLocked","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"VaultInfo","outputs":[{"internalType":"contract IERC721","name":"nft","type":"address"},{"internalType":"string","name":"name","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"activateTower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activatedTowers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeTowers","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addStyxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_nft","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"addVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addrTotalFamiliars","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addrTotalStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addrTotalTowers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bank","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bgfVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_unstake","type":"bool"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deactivateTower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"deactivateTowerSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"earningInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"familiars","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getBankBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendaryVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"lockLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedLegendaries","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardElite","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardRegular","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vault","type":"uint256"}],"name":"setBgfVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setFamiliarsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_vault","type":"uint256"}],"name":"setTowerVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setTowersAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spendBalanceFamiliars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"spendBalanceTowers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spendingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeBGF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleSpending","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"toggleStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"towerVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"towers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unlockLegendary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unlockLegendarySafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeBGF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeBGFSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vault","outputs":[{"internalType":"uint24","name":"tokenId","type":"uint24"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"tower","type":"uint256"},{"internalType":"uint256","name":"familiar","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600060035560006005556001600655600260075562015180600a55600a600b55600f600c556019600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506001600e60026101000a81548160ff0219169083151502179055503480156200008c57600080fd5b50620000ad620000a1620000b360201b60201c565b620000bb60201b60201c565b6200017f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b615bd5806200018f6000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c80638da5cb5b11610182578063c605c8f5116100e9578063eaa6f6c7116100a2578063ec84b9331161007c578063ec84b933146108e3578063f2fde38b14610901578063f82d44291461091d578063f8ba85691461094e576102d6565b8063eaa6f6c714610878578063ebb081ec14610894578063ec13e8b8146108c5576102d6565b8063c605c8f5146107d0578063c76ee684146107ec578063c88995c114610808578063cc3b168414610824578063d47d40ae14610840578063da89ddf51461085c576102d6565b8063ad84a07a1161013b578063ad84a07a1461070e578063b3da171a1461072c578063b64e2d651461075e578063b8d8e63a1461077a578063bec4de3f14610796578063c50cda12146107b4576102d6565b80638da5cb5b1461064c5780638ffe573f1461066a578063966ba202146106865780639728f970146106a25780639f855d6c146106d2578063a47d010e146106f0576102d6565b8063548362f71161024157806369805981116101fa5780637a403906116101d45780637a403906146105ae578063817b1cd2146105ca57806381a36fb6146105e85780638462151c1461061c576102d6565b8063698059811461056a578063715018a61461058657806375c7462d14610590576102d6565b8063548362f7146104965780635518420a146104b257806357bd5934146104e25780635a3defc6146104fe5780635cd3d5011461051c578063636eb10c1461054c576102d6565b806329c8dae41161029357806329c8dae4146103af5780633283b5bf146103cd5780633562b086146103e957806335ba47bf14610419578063529a1baf1461044a57806354278d561461047a576102d6565b806304cdb171146102db578063070205d01461030b5780630e141a9b146103275780630e1c2e6114610345578063150b7a02146103615780631cfff51b14610391575b600080fd5b6102f560048036038101906102f09190614970565b61096c565b60405161030291906153ec565b60405180910390f35b61032560048036038101906103209190614b9c565b6109b5565b005b61032f610d4f565b60405161033c9190615073565b60405180910390f35b61035f600480360381019061035a9190614b44565b610d62565b005b61037b600480360381019061037691906149c2565b610e67565b604051610388919061508e565b60405180910390f35b610399610eea565b6040516103a69190615073565b60405180910390f35b6103b7610efd565b6040516103c491906153ec565b60405180910390f35b6103e760048036038101906103e29190614a7e565b610f03565b005b61040360048036038101906103fe9190614a7e565b6111e4565b60405161041091906153ec565b60405180910390f35b610433600480360381019061042e9190614b9c565b611597565b604051610441929190615339565b60405180910390f35b610464600480360381019061045f9190614970565b6115ea565b60405161047191906153ec565b60405180910390f35b610494600480360381019061048f9190614970565b611602565b005b6104b060048036038101906104ab9190614a42565b6116c2565b005b6104cc60048036038101906104c79190614970565b611798565b6040516104d991906153ec565b60405180910390f35b6104fc60048036038101906104f79190614b9c565b6117b0565b005b610506611ab8565b6040516105139190615073565b60405180910390f35b61053660048036038101906105319190614970565b611acb565b60405161054391906153ec565b60405180910390f35b610554611ae3565b60405161056191906153ec565b60405180910390f35b610584600480360381019061057f9190614b1b565b611ae9565b005b61058e611b82565b005b610598611c0a565b6040516105a59190614f9f565b60405180910390f35b6105c860048036038101906105c39190614970565b611c30565b005b6105d2611cf0565b6040516105df91906153ec565b60405180910390f35b61060260048036038101906105fd9190614b9c565b611cf6565b604051610613959493929190615399565b60405180910390f35b61063660048036038101906106319190614970565b611d5b565b6040516106439190615051565b60405180910390f35b610654612004565b6040516106619190614f9f565b60405180910390f35b610684600480360381019061067f9190614b9c565b61202d565b005b6106a0600480360381019061069b9190614a7e565b612288565b005b6106bc60048036038101906106b79190614970565b6125aa565b6040516106c991906153ec565b60405180910390f35b6106da6125c2565b6040516106e791906153ec565b60405180910390f35b6106f86125c8565b60405161070591906153ec565b60405180910390f35b6107166125ce565b60405161072391906153ec565b60405180910390f35b61074660048036038101906107419190614b9c565b6125d4565b60405161075593929190615362565b60405180910390f35b61077860048036038101906107739190614b9c565b61262d565b005b610794600480360381019061078f9190614a7e565b6126b3565b005b61079e612710565b6040516107ab91906153ec565b60405180910390f35b6107ce60048036038101906107c99190614ac3565b612716565b005b6107ea60048036038101906107e59190614b9c565b612775565b005b61080660048036038101906108019190614b9c565b6127d0565b005b610822600480360381019061081d9190614b9c565b612856565b005b61083e60048036038101906108399190614a42565b6128b1565b005b61085a60048036038101906108559190614a7e565b6129ea565b005b61087660048036038101906108719190614a42565b612a47565b005b610892600480360381019061088d9190614b1b565b612b80565b005b6108ae60048036038101906108a99190614b9c565b612c19565b6040516108bc929190615339565b60405180910390f35b6108cd612c78565b6040516108da9190614f9f565b60405180910390f35b6108eb612c9e565b6040516108f891906153ec565b60405180910390f35b61091b60048036038101906109169190614970565b612ca4565b005b61093760048036038101906109329190614b9c565b612d9c565b6040516109459291906150a9565b60405180910390f35b610956612e78565b60405161096391906153ec565b60405180910390f35b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60029054906101000a900460ff16610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90615279565b60405180910390fd5b600080600160075481548110610a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050826010600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906152d9565b60405180910390fd5b60018310158015610ad1575060038311155b15610adc5761025891505b60048310158015610aee575060078311155b15610af95761028091505b60048310158015610b0b575060078311155b15610b16576102bc91505b610b1e612004565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd35781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc9906151b9565b60405180910390fd5b5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c22919061553d565b9250508190555060106000848152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b338442604051610caf9392919061501a565b60405180910390a18060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b8152600401610d1893929190614fba565b600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050505050565b600e60009054906101000a900460ff1681565b600160405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190610e5f929190614771565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90615319565b60405180910390fd5b63150b7a0260e01b905095945050505050565b600e60019054906101000a900460ff1681565b600d5481565b610f0b612e7e565b73ffffffffffffffffffffffffffffffffffffffff16610f29612004565b73ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690615239565b60405180910390fd5b600080600160055481548110610fbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b848490508110156111dd57848482818110611015577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201359250600f6000848152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382016000905560048201600090555050848490506003600082825461109e919061553d565b925050819055506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f5919061553d565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b33844260405161112f9392919061501a565b60405180910390a18160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b815260040161119893929190614fba565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505080806111d5906156b9565b915050610fd1565b5050505050565b600080600080600090506000806000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8a8a90508110156114d9578a8a828181106112c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013597506000600f60008a81526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb906150d9565b60405180910390fd5b806020015142611404919061553d565b8861140f919061545c565b9750600189101580156114235750600a8911155b1561145557600d54600a548961143991906154b2565b61144391906154e3565b8761144e919061545c565b96506114c5565b611586891015801561146957506117708911155b1561149b57600c54600a548961147f91906154b2565b61148991906154e3565b87611494919061545c565b96506114c4565b600b54600a54896114ac91906154b2565b6114b691906154e3565b876114c1919061545c565b96505b5b5080806114d1906156b9565b91505061127c565b5060068214156114ff5760648560036114f291906154e3565b6114fc91906154b2565b93505b600c82141561152457606485600661151791906154e3565b61152191906154b2565b93505b600181141561154957606485601461153c91906154e3565b61154691906154b2565b92505b600181111561156e57606485602361156191906154e3565b61156b91906154b2565b92505b82848661157b919061545c565b611585919061545c565b94508497505050505050505092915050565b60106020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60126020528060005260406000206000915090505481565b61160a612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611628612004565b73ffffffffffffffffffffffffffffffffffffffff161461167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590615239565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6116ca612e7e565b73ffffffffffffffffffffffffffffffffffffffff166116e8612004565b73ffffffffffffffffffffffffffffffffffffffff161461173e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173590615239565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178d919061545c565b925050819055505050565b60156020528060005260406000206000915090505481565b6117b8612e7e565b73ffffffffffffffffffffffffffffffffffffffff166117d6612004565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390615239565b60405180910390fd5b806011600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906152d9565b60405180910390fd5b600460008154809291906118ab9061565d565b919050555060006001600654815481106118ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b815260040161195f93929190614fba565b600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3383426040516119c49392919061501a565b60405180910390a160116000838152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506001601460006011600086815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aad919061553d565b925050819055505050565b600e60029054906101000a900460ff1681565b60136020528060005260406000206000915090505481565b600b5481565b611af1612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611b0f612004565b73ffffffffffffffffffffffffffffffffffffffff1614611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90615239565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611b8a612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611ba8612004565b73ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590615239565b60405180910390fd5b611c086000612e86565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c38612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611c56612004565b73ffffffffffffffffffffffffffffffffffffffff1614611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390615239565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b600f6020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154905085565b6060600060035467ffffffffffffffff811115611da1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611dcf5781602001602082028036833780820191505090505b509050600080600190505b6003548111611ee0578473ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ecd57600f600082815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16838381518110611eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050600182611eca919061545c565b91505b8080611ed8906156b9565b915050611dda565b5060008167ffffffffffffffff811115611f23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f515781602001602082028036833780820191505090505b50905060005b82811015611ff857838181518110611f98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151828281518110611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611ff0906156b9565b915050611f57565b50809350505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612035612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612053612004565b73ffffffffffffffffffffffffffffffffffffffff16146120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090615239565b60405180910390fd5b60006001600754815481106120e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050816010600084815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a906152d9565b60405180910390fd5b60106000838152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3383426040516121e99392919061501a565b60405180910390a18060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b815260040161225293929190614fba565b600060405180830381600087803b15801561226c57600080fd5b505af1158015612280573d6000803e3d6000fd5b505050505050565b612290612e7e565b73ffffffffffffffffffffffffffffffffffffffff166122ae612004565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90615239565b60405180910390fd5b600080600160075481548110612343577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b848490508110156125a35784848281811061239a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135925060006010600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790615219565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161247193929190614fba565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d393384426040516124d69392919061501a565b60405180910390a160405180604001604052808462ffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506010600085815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050808061259b906156b9565b915050612356565b5050505050565b60146020528060005260406000206000915090505481565b60075481565b60045481565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b612635612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612653612004565b73ffffffffffffffffffffffffffffffffffffffff16146126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090615239565b60405180910390fd5b8060068190555050565b600e60019054906101000a900460ff16612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f990615279565b60405180910390fd5b61270c8282612f4a565b5050565b600a5481565b600e60019054906101000a900460ff16612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90615279565b60405180910390fd5b612770838383613655565b505050565b600e60019054906101000a900460ff166127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90615279565b60405180910390fd5b6127cd81613b8c565b50565b6127d8612e7e565b73ffffffffffffffffffffffffffffffffffffffff166127f6612004565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390615239565b60405180910390fd5b8060058190555050565b600e60019054906101000a900460ff166128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90615279565b60405180910390fd5b6128ae81613fec565b50565b600e60029054906101000a900460ff16612900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f790615139565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612987906150f9565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129df919061553d565b925050819055505050565b600e60019054906101000a900460ff16612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3090615279565b60405180910390fd5b612a4382826143e0565b5050565b600e60029054906101000a900460ff16612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90615139565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d906150f9565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b75919061553d565b925050819055505050565b612b88612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612ba6612004565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390615239565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b60028181548110612c2957600080fd5b906000526020600020016000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b612cac612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612cca612004565b73ffffffffffffffffffffffffffffffffffffffff1614612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790615239565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8790615119565b60405180910390fd5b612d9981612e86565b50565b60018181548110612dac57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001018054612df590615687565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2190615687565b8015612e6e5780601f10612e4357610100808354040283529160200191612e6e565b820191906000526020600020905b815481529060010190602001808311612e5157829003601f168201915b5050505050905082565b60065481565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008585905082612fe4919061545c565b9050600c8110613029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613020906152f9565b60405180910390fd5b60018111156130c35760008311613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c906152b9565b60405180910390fd5b60068111156130c257600183116130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b890615179565b60405180910390fd5b5b5b85859050600360008282546130d8919061545c565b92505081905550600060016005548154811061311d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016131889190614f9f565b60206040518083038186803b1580156131a057600080fd5b505afa1580156131b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d89190614bc5565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8787905081101561364b57878782818110613262577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013595503373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b81526004016132df91906153ec565b60206040518083038186803b1580156132f757600080fd5b505afa15801561330b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332f9190614999565b73ffffffffffffffffffffffffffffffffffffffff1614613385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337c90615299565b60405180910390fd5b6000600f600088815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16146133f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e990615199565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161345393929190614fba565b600060405180830381600087803b15801561346d57600080fd5b505af1158015613481573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d393387426040516134b89392919061501a565b60405180910390a16040518060a001604052808762ffffff1681526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152602001868152602001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815250600f600088815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613631919061545c565b925050819055508080613643906156b9565b91505061321e565b5050505050505050565b600080600080600080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8a8a9050811015613a32578a8a8281811061372b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013597506000600f60008a81526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161461385f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613856906150d9565b60405180910390fd5b80602001514261386f919061553d565b8861387a919061545c565b97506001891015801561388e5750600a8911155b156138c057600d54600a54896138a491906154b2565b6138ae91906154e3565b876138b9919061545c565b9650613930565b61158689101580156138d457506117708911155b1561390657600c54600a54896138ea91906154b2565b6138f491906154e3565b876138ff919061545c565b965061392f565b600b54600a548961391791906154b2565b61392191906154e3565b8761392c919061545c565b96505b5b6040518060a001604052808a62ffffff168152602001428152602001826040015173ffffffffffffffffffffffffffffffffffffffff168152602001826060015181526020018260800151815250600f60008b815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050508080613a2a906156b9565b9150506136e7565b506006821415613a58576064856003613a4b91906154e3565b613a5591906154b2565b93505b600c821415613a7d576064856006613a7091906154e3565b613a7a91906154b2565b93505b6001811415613aa2576064856014613a9591906154e3565b613a9f91906154b2565b92505b6001811115613ac7576064856023613aba91906154e3565b613ac491906154b2565b92505b828486613ad4919061545c565b613ade919061545c565b945084601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b2f919061545c565b925050819055508715613b4757613b468a8a6143e0565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a3386604051613b78929190614ff1565b60405180910390a150505050505050505050565b6000600160065481548110613bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028110613c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c58906151d9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401613cd591906153ec565b60206040518083038186803b158015613ced57600080fd5b505afa158015613d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d259190614999565b73ffffffffffffffffffffffffffffffffffffffff1614613d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7290615299565b60405180910390fd5b60006011600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614613de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ddf90615199565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401613e4993929190614fba565b600060405180830381600087803b158015613e6357600080fd5b505af1158015613e77573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d39338442604051613eae9392919061501a565b60405180910390a160405180606001604052808462ffffff1681526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152506011600085815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505060046000815480929190613f8b906156b9565b91905055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fe0919061545c565b92505081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff166011600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161408790615299565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506006821061415b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415290615259565b60405180910390fd5b600182116141a757600081116141a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419d906151f9565b60405180910390fd5b5b60018211156141f457600281146141f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141ea90615159565b60405180910390fd5b5b600460008154809291906142079061565d565b9190505550600060016006548154811061424a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033876040518463ffffffff1660e01b81526004016142bb93929190614fba565b600060405180830381600087803b1580156142d557600080fd5b505af11580156142e9573d6000803e3d6000fd5b505050507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3385426040516143209392919061501a565b60405180910390a160116000858152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143d3919061553d565b9250508190555050505050565b60008060016005548154811061441f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b8484905081101561476a57848482818110614476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013592506000600f60008581526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146145aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145a190615299565b60405180910390fd5b600f6000858152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382016000905560048201600090555050858590506003600082825461462a919061553d565b925050819055506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614681919061553d565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3385426040516146bb9392919061501a565b60405180910390a18260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033876040518463ffffffff1660e01b815260040161472493929190614fba565b600060405180830381600087803b15801561473e57600080fd5b505af1158015614752573d6000803e3d6000fd5b50505050508080614762906156b9565b915050614432565b5050505050565b82805461477d90615687565b90600052602060002090601f01602090048101928261479f57600085556147e6565b82601f106147b857805160ff19168380011785556147e6565b828001600101855582156147e6579182015b828111156147e55782518255916020019190600101906147ca565b5b5090506147f391906147f7565b5090565b5b808211156148105760008160009055506001016147f8565b5090565b60008135905061482381615b43565b92915050565b60008151905061483881615b43565b92915050565b60008083601f84011261485057600080fd5b8235905067ffffffffffffffff81111561486957600080fd5b60208301915083602082028301111561488157600080fd5b9250929050565b60008135905061489781615b5a565b92915050565b60008083601f8401126148af57600080fd5b8235905067ffffffffffffffff8111156148c857600080fd5b6020830191508360018202830111156148e057600080fd5b9250929050565b6000813590506148f681615b71565b92915050565b60008083601f84011261490e57600080fd5b8235905067ffffffffffffffff81111561492757600080fd5b60208301915083600182028301111561493f57600080fd5b9250929050565b60008135905061495581615b88565b92915050565b60008151905061496a81615b88565b92915050565b60006020828403121561498257600080fd5b600061499084828501614814565b91505092915050565b6000602082840312156149ab57600080fd5b60006149b984828501614829565b91505092915050565b6000806000806000608086880312156149da57600080fd5b60006149e888828901614814565b95505060206149f988828901614814565b9450506040614a0a88828901614946565b935050606086013567ffffffffffffffff811115614a2757600080fd5b614a338882890161489d565b92509250509295509295909350565b60008060408385031215614a5557600080fd5b6000614a6385828601614814565b9250506020614a7485828601614946565b9150509250929050565b60008060208385031215614a9157600080fd5b600083013567ffffffffffffffff811115614aab57600080fd5b614ab78582860161483e565b92509250509250929050565b600080600060408486031215614ad857600080fd5b600084013567ffffffffffffffff811115614af257600080fd5b614afe8682870161483e565b93509350506020614b1186828701614888565b9150509250925092565b600060208284031215614b2d57600080fd5b6000614b3b84828501614888565b91505092915050565b600080600060408486031215614b5957600080fd5b6000614b67868287016148e7565b935050602084013567ffffffffffffffff811115614b8457600080fd5b614b90868287016148fc565b92509250509250925092565b600060208284031215614bae57600080fd5b6000614bbc84828501614946565b91505092915050565b600060208284031215614bd757600080fd5b6000614be58482850161495b565b91505092915050565b6000614bfa8383614f81565b60208301905092915050565b614c0f81615571565b82525050565b6000614c2082615417565b614c2a818561543a565b9350614c3583615407565b8060005b83811015614c66578151614c4d8882614bee565b9750614c588361542d565b925050600181019050614c39565b5085935050505092915050565b614c7c81615583565b82525050565b614c8b8161558f565b82525050565b614c9a81615606565b82525050565b6000614cab82615422565b614cb5818561544b565b9350614cc581856020860161562a565b614cce8161578f565b840191505092915050565b6000614ce660108361544b565b9150614cf1826157a0565b602082019050919050565b6000614d09600c8361544b565b9150614d14826157c9565b602082019050919050565b6000614d2c60268361544b565b9150614d37826157f2565b604082019050919050565b6000614d4f60288361544b565b9150614d5a82615841565b604082019050919050565b6000614d7260228361544b565b9150614d7d82615890565b604082019050919050565b6000614d9560108361544b565b9150614da0826158df565b602082019050919050565b6000614db860138361544b565b9150614dc382615908565b602082019050919050565b6000614ddb60158361544b565b9150614de682615931565b602082019050919050565b6000614dfe60158361544b565b9150614e098261595a565b602082019050919050565b6000614e21600c8361544b565b9150614e2c82615983565b602082019050919050565b6000614e4460138361544b565b9150614e4f826159ac565b602082019050919050565b6000614e6760208361544b565b9150614e72826159d5565b602082019050919050565b6000614e8a601f8361544b565b9150614e95826159fe565b602082019050919050565b6000614ead601f8361544b565b9150614eb882615a27565b602082019050919050565b6000614ed0601a8361544b565b9150614edb82615a50565b602082019050919050565b6000614ef360108361544b565b9150614efe82615a79565b602082019050919050565b6000614f1660118361544b565b9150614f2182615aa2565b602082019050919050565b6000614f3960148361544b565b9150614f4482615acb565b602082019050919050565b6000614f5c60248361544b565b9150614f6782615af4565b604082019050919050565b614f7b816155ed565b82525050565b614f8a816155fc565b82525050565b614f99816155fc565b82525050565b6000602082019050614fb46000830184614c06565b92915050565b6000606082019050614fcf6000830186614c06565b614fdc6020830185614c06565b614fe96040830184614f90565b949350505050565b60006040820190506150066000830185614c06565b6150136020830184614f90565b9392505050565b600060608201905061502f6000830186614c06565b61503c6020830185614f90565b6150496040830184614f90565b949350505050565b6000602082019050818103600083015261506b8184614c15565b905092915050565b60006020820190506150886000830184614c73565b92915050565b60006020820190506150a36000830184614c82565b92915050565b60006040820190506150be6000830185614c91565b81810360208301526150d08184614ca0565b90509392505050565b600060208201905081810360008301526150f281614cd9565b9050919050565b6000602082019050818103600083015261511281614cfc565b9050919050565b6000602082019050818103600083015261513281614d1f565b9050919050565b6000602082019050818103600083015261515281614d42565b9050919050565b6000602082019050818103600083015261517281614d65565b9050919050565b6000602082019050818103600083015261519281614d88565b9050919050565b600060208201905081810360008301526151b281614dab565b9050919050565b600060208201905081810360008301526151d281614dce565b9050919050565b600060208201905081810360008301526151f281614df1565b9050919050565b6000602082019050818103600083015261521281614e14565b9050919050565b6000602082019050818103600083015261523281614e37565b9050919050565b6000602082019050818103600083015261525281614e5a565b9050919050565b6000602082019050818103600083015261527281614e7d565b9050919050565b6000602082019050818103600083015261529281614ea0565b9050919050565b600060208201905081810360008301526152b281614ec3565b9050919050565b600060208201905081810360008301526152d281614ee6565b9050919050565b600060208201905081810360008301526152f281614f09565b9050919050565b6000602082019050818103600083015261531281614f2c565b9050919050565b6000602082019050818103600083015261533281614f4f565b9050919050565b600060408201905061534e6000830185614f72565b61535b6020830184614c06565b9392505050565b60006060820190506153776000830186614f72565b6153846020830185614f90565b6153916040830184614c06565b949350505050565b600060a0820190506153ae6000830188614f72565b6153bb6020830187614f90565b6153c86040830186614c06565b6153d56060830185614f90565b6153e26080830184614f90565b9695505050505050565b60006020820190506154016000830184614f90565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615467826155fc565b9150615472836155fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154a7576154a6615702565b5b828201905092915050565b60006154bd826155fc565b91506154c8836155fc565b9250826154d8576154d7615731565b5b828204905092915050565b60006154ee826155fc565b91506154f9836155fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561553257615531615702565b5b828202905092915050565b6000615548826155fc565b9150615553836155fc565b92508282101561556657615565615702565b5b828203905092915050565b600061557c826155cd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006155c682615571565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600061561182615618565b9050919050565b6000615623826155cd565b9050919050565b60005b8381101561564857808201518184015260208101905061562d565b83811115615657576000848401525b50505050565b6000615668826155fc565b9150600082141561567c5761567b615702565b5b600182039050919050565b6000600282049050600182168061569f57607f821691505b602082108114156156b3576156b2615760565b5b50919050565b60006156c4826155fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156f7576156f6615702565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420746f6b656e206f776e65722e00000000000000000000000000000000600082015250565b7f4e6f7420416c6c6f7765642e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f42616c616e6365207370656e64696e672066756e6374696f6e7320617265206460008201527f697361626c65642e000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564207768696c6520626f6f737420616374697661746560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f426f6f7374206d61786564206f75742e00000000000000000000000000000000600082015250565b7f4e465420616c7265616479207374616b65642e00000000000000000000000000600082015250565b7f496e73756666696369656e742062616c616e63652e0000000000000000000000600082015250565b7f4d617820546f77657273206163746976617465642e0000000000000000000000600082015250565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b7f4e465420616c7265616479206c6f636b65642e00000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420616c6c6f7765642c20746f6f206d756368206174207374616b652100600082015250565b7f5374616b696e672066756e6374696f6e73206172652064697361626c65642e00600082015250565b7f43616c6c6572206973206e6f7420746f6b656e206f776e65722e000000000000600082015250565b7f426f6f7374206e6f7420666f756e642e00000000000000000000000000000000600082015250565b7f496e76616c696420746f6b656e2069642e000000000000000000000000000000600082015250565b7f4d617820616c6c6f77616e63652069732031322e000000000000000000000000600082015250565b7f43616e6e6f742073656e6420546f6b656e7320746f205661756c74206469726560008201527f63746c7900000000000000000000000000000000000000000000000000000000602082015250565b615b4c81615571565b8114615b5757600080fd5b50565b615b6381615583565b8114615b6e57600080fd5b50565b615b7a816155bb565b8114615b8557600080fd5b50565b615b91816155fc565b8114615b9c57600080fd5b5056fea264697066735822122044e717ef1e08dadeaa09595ac1b14b4fc1dffcda20d5f60f859c0cfd8e4274bc64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d65760003560e01c80638da5cb5b11610182578063c605c8f5116100e9578063eaa6f6c7116100a2578063ec84b9331161007c578063ec84b933146108e3578063f2fde38b14610901578063f82d44291461091d578063f8ba85691461094e576102d6565b8063eaa6f6c714610878578063ebb081ec14610894578063ec13e8b8146108c5576102d6565b8063c605c8f5146107d0578063c76ee684146107ec578063c88995c114610808578063cc3b168414610824578063d47d40ae14610840578063da89ddf51461085c576102d6565b8063ad84a07a1161013b578063ad84a07a1461070e578063b3da171a1461072c578063b64e2d651461075e578063b8d8e63a1461077a578063bec4de3f14610796578063c50cda12146107b4576102d6565b80638da5cb5b1461064c5780638ffe573f1461066a578063966ba202146106865780639728f970146106a25780639f855d6c146106d2578063a47d010e146106f0576102d6565b8063548362f71161024157806369805981116101fa5780637a403906116101d45780637a403906146105ae578063817b1cd2146105ca57806381a36fb6146105e85780638462151c1461061c576102d6565b8063698059811461056a578063715018a61461058657806375c7462d14610590576102d6565b8063548362f7146104965780635518420a146104b257806357bd5934146104e25780635a3defc6146104fe5780635cd3d5011461051c578063636eb10c1461054c576102d6565b806329c8dae41161029357806329c8dae4146103af5780633283b5bf146103cd5780633562b086146103e957806335ba47bf14610419578063529a1baf1461044a57806354278d561461047a576102d6565b806304cdb171146102db578063070205d01461030b5780630e141a9b146103275780630e1c2e6114610345578063150b7a02146103615780631cfff51b14610391575b600080fd5b6102f560048036038101906102f09190614970565b61096c565b60405161030291906153ec565b60405180910390f35b61032560048036038101906103209190614b9c565b6109b5565b005b61032f610d4f565b60405161033c9190615073565b60405180910390f35b61035f600480360381019061035a9190614b44565b610d62565b005b61037b600480360381019061037691906149c2565b610e67565b604051610388919061508e565b60405180910390f35b610399610eea565b6040516103a69190615073565b60405180910390f35b6103b7610efd565b6040516103c491906153ec565b60405180910390f35b6103e760048036038101906103e29190614a7e565b610f03565b005b61040360048036038101906103fe9190614a7e565b6111e4565b60405161041091906153ec565b60405180910390f35b610433600480360381019061042e9190614b9c565b611597565b604051610441929190615339565b60405180910390f35b610464600480360381019061045f9190614970565b6115ea565b60405161047191906153ec565b60405180910390f35b610494600480360381019061048f9190614970565b611602565b005b6104b060048036038101906104ab9190614a42565b6116c2565b005b6104cc60048036038101906104c79190614970565b611798565b6040516104d991906153ec565b60405180910390f35b6104fc60048036038101906104f79190614b9c565b6117b0565b005b610506611ab8565b6040516105139190615073565b60405180910390f35b61053660048036038101906105319190614970565b611acb565b60405161054391906153ec565b60405180910390f35b610554611ae3565b60405161056191906153ec565b60405180910390f35b610584600480360381019061057f9190614b1b565b611ae9565b005b61058e611b82565b005b610598611c0a565b6040516105a59190614f9f565b60405180910390f35b6105c860048036038101906105c39190614970565b611c30565b005b6105d2611cf0565b6040516105df91906153ec565b60405180910390f35b61060260048036038101906105fd9190614b9c565b611cf6565b604051610613959493929190615399565b60405180910390f35b61063660048036038101906106319190614970565b611d5b565b6040516106439190615051565b60405180910390f35b610654612004565b6040516106619190614f9f565b60405180910390f35b610684600480360381019061067f9190614b9c565b61202d565b005b6106a0600480360381019061069b9190614a7e565b612288565b005b6106bc60048036038101906106b79190614970565b6125aa565b6040516106c991906153ec565b60405180910390f35b6106da6125c2565b6040516106e791906153ec565b60405180910390f35b6106f86125c8565b60405161070591906153ec565b60405180910390f35b6107166125ce565b60405161072391906153ec565b60405180910390f35b61074660048036038101906107419190614b9c565b6125d4565b60405161075593929190615362565b60405180910390f35b61077860048036038101906107739190614b9c565b61262d565b005b610794600480360381019061078f9190614a7e565b6126b3565b005b61079e612710565b6040516107ab91906153ec565b60405180910390f35b6107ce60048036038101906107c99190614ac3565b612716565b005b6107ea60048036038101906107e59190614b9c565b612775565b005b61080660048036038101906108019190614b9c565b6127d0565b005b610822600480360381019061081d9190614b9c565b612856565b005b61083e60048036038101906108399190614a42565b6128b1565b005b61085a60048036038101906108559190614a7e565b6129ea565b005b61087660048036038101906108719190614a42565b612a47565b005b610892600480360381019061088d9190614b1b565b612b80565b005b6108ae60048036038101906108a99190614b9c565b612c19565b6040516108bc929190615339565b60405180910390f35b6108cd612c78565b6040516108da9190614f9f565b60405180910390f35b6108eb612c9e565b6040516108f891906153ec565b60405180910390f35b61091b60048036038101906109169190614970565b612ca4565b005b61093760048036038101906109329190614b9c565b612d9c565b6040516109459291906150a9565b60405180910390f35b610956612e78565b60405161096391906153ec565b60405180910390f35b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e60029054906101000a900460ff16610a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fb90615279565b60405180910390fd5b600080600160075481548110610a43577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050826010600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614610abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab6906152d9565b60405180910390fd5b60018310158015610ad1575060038311155b15610adc5761025891505b60048310158015610aee575060078311155b15610af95761028091505b60048310158015610b0b575060078311155b15610b16576102bc91505b610b1e612004565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd35781601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc9906151b9565b60405180910390fd5b5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c22919061553d565b9250508190555060106000848152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b338442604051610caf9392919061501a565b60405180910390a18060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b8152600401610d1893929190614fba565b600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050505050565b600e60009054906101000a900460ff1681565b600160405180604001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001019080519060200190610e5f929190614771565b505050505050565b60008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610ed7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ece90615319565b60405180910390fd5b63150b7a0260e01b905095945050505050565b600e60019054906101000a900460ff1681565b600d5481565b610f0b612e7e565b73ffffffffffffffffffffffffffffffffffffffff16610f29612004565b73ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7690615239565b60405180910390fd5b600080600160055481548110610fbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b848490508110156111dd57848482818110611015577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201359250600f6000848152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382016000905560048201600090555050848490506003600082825461109e919061553d565b925050819055506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110f5919061553d565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b33844260405161112f9392919061501a565b60405180910390a18160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033866040518463ffffffff1660e01b815260040161119893929190614fba565b600060405180830381600087803b1580156111b257600080fd5b505af11580156111c6573d6000803e3d6000fd5b5050505080806111d5906156b9565b915050610fd1565b5050505050565b600080600080600090506000806000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8a8a90508110156114d9578a8a828181106112c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013597506000600f60008a81526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146113f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113eb906150d9565b60405180910390fd5b806020015142611404919061553d565b8861140f919061545c565b9750600189101580156114235750600a8911155b1561145557600d54600a548961143991906154b2565b61144391906154e3565b8761144e919061545c565b96506114c5565b611586891015801561146957506117708911155b1561149b57600c54600a548961147f91906154b2565b61148991906154e3565b87611494919061545c565b96506114c4565b600b54600a54896114ac91906154b2565b6114b691906154e3565b876114c1919061545c565b96505b5b5080806114d1906156b9565b91505061127c565b5060068214156114ff5760648560036114f291906154e3565b6114fc91906154b2565b93505b600c82141561152457606485600661151791906154e3565b61152191906154b2565b93505b600181141561154957606485601461153c91906154e3565b61154691906154b2565b92505b600181111561156e57606485602361156191906154e3565b61156b91906154b2565b92505b82848661157b919061545c565b611585919061545c565b94508497505050505050505092915050565b60106020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b60126020528060005260406000206000915090505481565b61160a612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611628612004565b73ffffffffffffffffffffffffffffffffffffffff161461167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167590615239565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6116ca612e7e565b73ffffffffffffffffffffffffffffffffffffffff166116e8612004565b73ffffffffffffffffffffffffffffffffffffffff161461173e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173590615239565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178d919061545c565b925050819055505050565b60156020528060005260406000206000915090505481565b6117b8612e7e565b73ffffffffffffffffffffffffffffffffffffffff166117d6612004565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390615239565b60405180910390fd5b806011600083815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188f906152d9565b60405180910390fd5b600460008154809291906118ab9061565d565b919050555060006001600654815481106118ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b815260040161195f93929190614fba565b600060405180830381600087803b15801561197957600080fd5b505af115801561198d573d6000803e3d6000fd5b505050507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3383426040516119c49392919061501a565b60405180910390a160116000838152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506001601460006011600086815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611aad919061553d565b925050819055505050565b600e60029054906101000a900460ff1681565b60136020528060005260406000206000915090505481565b600b5481565b611af1612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611b0f612004565b73ffffffffffffffffffffffffffffffffffffffff1614611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90615239565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b611b8a612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611ba8612004565b73ffffffffffffffffffffffffffffffffffffffff1614611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590615239565b60405180910390fd5b611c086000612e86565b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611c38612e7e565b73ffffffffffffffffffffffffffffffffffffffff16611c56612004565b73ffffffffffffffffffffffffffffffffffffffff1614611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390615239565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60035481565b600f6020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154905085565b6060600060035467ffffffffffffffff811115611da1577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611dcf5781602001602082028036833780820191505090505b509050600080600190505b6003548111611ee0578473ffffffffffffffffffffffffffffffffffffffff16600f600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611ecd57600f600082815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16838381518110611eb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050600182611eca919061545c565b91505b8080611ed8906156b9565b915050611dda565b5060008167ffffffffffffffff811115611f23577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f515781602001602082028036833780820191505090505b50905060005b82811015611ff857838181518110611f98577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151828281518110611fd9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611ff0906156b9565b915050611f57565b50809350505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b612035612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612053612004565b73ffffffffffffffffffffffffffffffffffffffff16146120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090615239565b60405180910390fd5b60006001600754815481106120e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050816010600084815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614612163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215a906152d9565b60405180910390fd5b60106000838152602001908152602001600020600080820160006101000a81549062ffffff02191690556000820160036101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3383426040516121e99392919061501a565b60405180910390a18060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b815260040161225293929190614fba565b600060405180830381600087803b15801561226c57600080fd5b505af1158015612280573d6000803e3d6000fd5b505050505050565b612290612e7e565b73ffffffffffffffffffffffffffffffffffffffff166122ae612004565b73ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb90615239565b60405180910390fd5b600080600160075481548110612343577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b848490508110156125a35784848281811061239a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135925060006010600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614612410576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240790615219565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b815260040161247193929190614fba565b600060405180830381600087803b15801561248b57600080fd5b505af115801561249f573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d393384426040516124d69392919061501a565b60405180910390a160405180604001604052808462ffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152506010600085815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050808061259b906156b9565b915050612356565b5050505050565b60146020528060005260406000206000915090505481565b60075481565b60045481565b600c5481565b60116020528060005260406000206000915090508060000160009054906101000a900462ffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905083565b612635612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612653612004565b73ffffffffffffffffffffffffffffffffffffffff16146126a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a090615239565b60405180910390fd5b8060068190555050565b600e60019054906101000a900460ff16612702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f990615279565b60405180910390fd5b61270c8282612f4a565b5050565b600a5481565b600e60019054906101000a900460ff16612765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275c90615279565b60405180910390fd5b612770838383613655565b505050565b600e60019054906101000a900460ff166127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bb90615279565b60405180910390fd5b6127cd81613b8c565b50565b6127d8612e7e565b73ffffffffffffffffffffffffffffffffffffffff166127f6612004565b73ffffffffffffffffffffffffffffffffffffffff161461284c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284390615239565b60405180910390fd5b8060058190555050565b600e60019054906101000a900460ff166128a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289c90615279565b60405180910390fd5b6128ae81613fec565b50565b600e60029054906101000a900460ff16612900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f790615139565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612987906150f9565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129df919061553d565b925050819055505050565b600e60019054906101000a900460ff16612a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a3090615279565b60405180910390fd5b612a4382826143e0565b5050565b600e60029054906101000a900460ff16612a96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8d90615139565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d906150f9565b60405180910390fd5b80601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b75919061553d565b925050819055505050565b612b88612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612ba6612004565b73ffffffffffffffffffffffffffffffffffffffff1614612bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf390615239565b60405180910390fd5b80600e60026101000a81548160ff02191690831515021790555050565b60028181548110612c2957600080fd5b906000526020600020016000915090508060000160009054906101000a900462ffffff16908060000160039054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60055481565b612cac612e7e565b73ffffffffffffffffffffffffffffffffffffffff16612cca612004565b73ffffffffffffffffffffffffffffffffffffffff1614612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1790615239565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8790615119565b60405180910390fd5b612d9981612e86565b50565b60018181548110612dac57600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001018054612df590615687565b80601f0160208091040260200160405190810160405280929190818152602001828054612e2190615687565b8015612e6e5780601f10612e4357610100808354040283529160200191612e6e565b820191906000526020600020905b815481529060010190602001808311612e5157829003601f168201915b5050505050905082565b60065481565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008585905082612fe4919061545c565b9050600c8110613029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613020906152f9565b60405180910390fd5b60018111156130c35760008311613075576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306c906152b9565b60405180910390fd5b60068111156130c257600183116130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130b890615179565b60405180910390fd5b5b5b85859050600360008282546130d8919061545c565b92505081905550600060016005548154811061311d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202019050600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016131889190614f9f565b60206040518083038186803b1580156131a057600080fd5b505afa1580156131b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d89190614bc5565b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b8787905081101561364b57878782818110613262577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013595503373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b81526004016132df91906153ec565b60206040518083038186803b1580156132f757600080fd5b505afa15801561330b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332f9190614999565b73ffffffffffffffffffffffffffffffffffffffff1614613385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337c90615299565b60405180910390fd5b6000600f600088815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff16146133f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133e990615199565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b815260040161345393929190614fba565b600060405180830381600087803b15801561346d57600080fd5b505af1158015613481573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d393387426040516134b89392919061501a565b60405180910390a16040518060a001604052808762ffffff1681526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152602001868152602001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054815250600f600088815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030155608082015181600401559050506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613631919061545c565b925050819055508080613643906156b9565b91505061321e565b5050505050505050565b600080600080600080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060005b8a8a9050811015613a32578a8a8281811061372b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013597506000600f60008a81526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161461385f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613856906150d9565b60405180910390fd5b80602001514261386f919061553d565b8861387a919061545c565b97506001891015801561388e5750600a8911155b156138c057600d54600a54896138a491906154b2565b6138ae91906154e3565b876138b9919061545c565b9650613930565b61158689101580156138d457506117708911155b1561390657600c54600a54896138ea91906154b2565b6138f491906154e3565b876138ff919061545c565b965061392f565b600b54600a548961391791906154b2565b61392191906154e3565b8761392c919061545c565b96505b5b6040518060a001604052808a62ffffff168152602001428152602001826040015173ffffffffffffffffffffffffffffffffffffffff168152602001826060015181526020018260800151815250600f60008b815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040155905050508080613a2a906156b9565b9150506136e7565b506006821415613a58576064856003613a4b91906154e3565b613a5591906154b2565b93505b600c821415613a7d576064856006613a7091906154e3565b613a7a91906154b2565b93505b6001811415613aa2576064856014613a9591906154e3565b613a9f91906154b2565b92505b6001811115613ac7576064856023613aba91906154e3565b613ac491906154b2565b92505b828486613ad4919061545c565b613ade919061545c565b945084601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613b2f919061545c565b925050819055508715613b4757613b468a8a6143e0565b5b7fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a3386604051613b78929190614ff1565b60405180910390a150505050505050505050565b6000600160065481548110613bca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060028110613c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c58906151d9565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401613cd591906153ec565b60206040518083038186803b158015613ced57600080fd5b505afa158015613d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d259190614999565b73ffffffffffffffffffffffffffffffffffffffff1614613d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d7290615299565b60405180910390fd5b60006011600085815260200190815260200160002060000160009054906101000a900462ffffff1662ffffff1614613de8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ddf90615199565b60405180910390fd5b8160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401613e4993929190614fba565b600060405180830381600087803b158015613e6357600080fd5b505af1158015613e77573d6000803e3d6000fd5b505050507f36b3725f1783bad4ff05b7f4c077c3aa68eeb23a4d054ba189db4d01ac278d39338442604051613eae9392919061501a565b60405180910390a160405180606001604052808462ffffff1681526020014281526020013373ffffffffffffffffffffffffffffffffffffffff168152506011600085815260200190815260200160002060008201518160000160006101000a81548162ffffff021916908362ffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505060046000815480929190613f8b906156b9565b91905055506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fe0919061545c565b92505081905550505050565b3373ffffffffffffffffffffffffffffffffffffffff166011600083815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614614090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161408790615299565b60405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506006821061415b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161415290615259565b60405180910390fd5b600182116141a757600081116141a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161419d906151f9565b60405180910390fd5b5b60018211156141f457600281146141f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141ea90615159565b60405180910390fd5b5b600460008154809291906142079061565d565b9190505550600060016006548154811061424a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033876040518463ffffffff1660e01b81526004016142bb93929190614fba565b600060405180830381600087803b1580156142d557600080fd5b505af11580156142e9573d6000803e3d6000fd5b505050507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3385426040516143209392919061501a565b60405180910390a160116000858152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550506001601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546143d3919061553d565b9250508190555050505050565b60008060016005548154811061441f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201905060005b8484905081101561476a57848482818110614476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013592506000600f60008581526020019081526020016000206040518060a00160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff168152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152505090503373ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16146145aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016145a190615299565b60405180910390fd5b600f6000858152602001908152602001600020600080820160006101000a81549062ffffff021916905560018201600090556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600382016000905560048201600090555050858590506003600082825461462a919061553d565b925050819055506001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254614681919061553d565b925050819055507fc486b9458a8637650d84d262414833a5a457bc91ae86b7da110386c8c3fa255b3385426040516146bb9392919061501a565b60405180910390a18260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033876040518463ffffffff1660e01b815260040161472493929190614fba565b600060405180830381600087803b15801561473e57600080fd5b505af1158015614752573d6000803e3d6000fd5b50505050508080614762906156b9565b915050614432565b5050505050565b82805461477d90615687565b90600052602060002090601f01602090048101928261479f57600085556147e6565b82601f106147b857805160ff19168380011785556147e6565b828001600101855582156147e6579182015b828111156147e55782518255916020019190600101906147ca565b5b5090506147f391906147f7565b5090565b5b808211156148105760008160009055506001016147f8565b5090565b60008135905061482381615b43565b92915050565b60008151905061483881615b43565b92915050565b60008083601f84011261485057600080fd5b8235905067ffffffffffffffff81111561486957600080fd5b60208301915083602082028301111561488157600080fd5b9250929050565b60008135905061489781615b5a565b92915050565b60008083601f8401126148af57600080fd5b8235905067ffffffffffffffff8111156148c857600080fd5b6020830191508360018202830111156148e057600080fd5b9250929050565b6000813590506148f681615b71565b92915050565b60008083601f84011261490e57600080fd5b8235905067ffffffffffffffff81111561492757600080fd5b60208301915083600182028301111561493f57600080fd5b9250929050565b60008135905061495581615b88565b92915050565b60008151905061496a81615b88565b92915050565b60006020828403121561498257600080fd5b600061499084828501614814565b91505092915050565b6000602082840312156149ab57600080fd5b60006149b984828501614829565b91505092915050565b6000806000806000608086880312156149da57600080fd5b60006149e888828901614814565b95505060206149f988828901614814565b9450506040614a0a88828901614946565b935050606086013567ffffffffffffffff811115614a2757600080fd5b614a338882890161489d565b92509250509295509295909350565b60008060408385031215614a5557600080fd5b6000614a6385828601614814565b9250506020614a7485828601614946565b9150509250929050565b60008060208385031215614a9157600080fd5b600083013567ffffffffffffffff811115614aab57600080fd5b614ab78582860161483e565b92509250509250929050565b600080600060408486031215614ad857600080fd5b600084013567ffffffffffffffff811115614af257600080fd5b614afe8682870161483e565b93509350506020614b1186828701614888565b9150509250925092565b600060208284031215614b2d57600080fd5b6000614b3b84828501614888565b91505092915050565b600080600060408486031215614b5957600080fd5b6000614b67868287016148e7565b935050602084013567ffffffffffffffff811115614b8457600080fd5b614b90868287016148fc565b92509250509250925092565b600060208284031215614bae57600080fd5b6000614bbc84828501614946565b91505092915050565b600060208284031215614bd757600080fd5b6000614be58482850161495b565b91505092915050565b6000614bfa8383614f81565b60208301905092915050565b614c0f81615571565b82525050565b6000614c2082615417565b614c2a818561543a565b9350614c3583615407565b8060005b83811015614c66578151614c4d8882614bee565b9750614c588361542d565b925050600181019050614c39565b5085935050505092915050565b614c7c81615583565b82525050565b614c8b8161558f565b82525050565b614c9a81615606565b82525050565b6000614cab82615422565b614cb5818561544b565b9350614cc581856020860161562a565b614cce8161578f565b840191505092915050565b6000614ce660108361544b565b9150614cf1826157a0565b602082019050919050565b6000614d09600c8361544b565b9150614d14826157c9565b602082019050919050565b6000614d2c60268361544b565b9150614d37826157f2565b604082019050919050565b6000614d4f60288361544b565b9150614d5a82615841565b604082019050919050565b6000614d7260228361544b565b9150614d7d82615890565b604082019050919050565b6000614d9560108361544b565b9150614da0826158df565b602082019050919050565b6000614db860138361544b565b9150614dc382615908565b602082019050919050565b6000614ddb60158361544b565b9150614de682615931565b602082019050919050565b6000614dfe60158361544b565b9150614e098261595a565b602082019050919050565b6000614e21600c8361544b565b9150614e2c82615983565b602082019050919050565b6000614e4460138361544b565b9150614e4f826159ac565b602082019050919050565b6000614e6760208361544b565b9150614e72826159d5565b602082019050919050565b6000614e8a601f8361544b565b9150614e95826159fe565b602082019050919050565b6000614ead601f8361544b565b9150614eb882615a27565b602082019050919050565b6000614ed0601a8361544b565b9150614edb82615a50565b602082019050919050565b6000614ef360108361544b565b9150614efe82615a79565b602082019050919050565b6000614f1660118361544b565b9150614f2182615aa2565b602082019050919050565b6000614f3960148361544b565b9150614f4482615acb565b602082019050919050565b6000614f5c60248361544b565b9150614f6782615af4565b604082019050919050565b614f7b816155ed565b82525050565b614f8a816155fc565b82525050565b614f99816155fc565b82525050565b6000602082019050614fb46000830184614c06565b92915050565b6000606082019050614fcf6000830186614c06565b614fdc6020830185614c06565b614fe96040830184614f90565b949350505050565b60006040820190506150066000830185614c06565b6150136020830184614f90565b9392505050565b600060608201905061502f6000830186614c06565b61503c6020830185614f90565b6150496040830184614f90565b949350505050565b6000602082019050818103600083015261506b8184614c15565b905092915050565b60006020820190506150886000830184614c73565b92915050565b60006020820190506150a36000830184614c82565b92915050565b60006040820190506150be6000830185614c91565b81810360208301526150d08184614ca0565b90509392505050565b600060208201905081810360008301526150f281614cd9565b9050919050565b6000602082019050818103600083015261511281614cfc565b9050919050565b6000602082019050818103600083015261513281614d1f565b9050919050565b6000602082019050818103600083015261515281614d42565b9050919050565b6000602082019050818103600083015261517281614d65565b9050919050565b6000602082019050818103600083015261519281614d88565b9050919050565b600060208201905081810360008301526151b281614dab565b9050919050565b600060208201905081810360008301526151d281614dce565b9050919050565b600060208201905081810360008301526151f281614df1565b9050919050565b6000602082019050818103600083015261521281614e14565b9050919050565b6000602082019050818103600083015261523281614e37565b9050919050565b6000602082019050818103600083015261525281614e5a565b9050919050565b6000602082019050818103600083015261527281614e7d565b9050919050565b6000602082019050818103600083015261529281614ea0565b9050919050565b600060208201905081810360008301526152b281614ec3565b9050919050565b600060208201905081810360008301526152d281614ee6565b9050919050565b600060208201905081810360008301526152f281614f09565b9050919050565b6000602082019050818103600083015261531281614f2c565b9050919050565b6000602082019050818103600083015261533281614f4f565b9050919050565b600060408201905061534e6000830185614f72565b61535b6020830184614c06565b9392505050565b60006060820190506153776000830186614f72565b6153846020830185614f90565b6153916040830184614c06565b949350505050565b600060a0820190506153ae6000830188614f72565b6153bb6020830187614f90565b6153c86040830186614c06565b6153d56060830185614f90565b6153e26080830184614f90565b9695505050505050565b60006020820190506154016000830184614f90565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615467826155fc565b9150615472836155fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154a7576154a6615702565b5b828201905092915050565b60006154bd826155fc565b91506154c8836155fc565b9250826154d8576154d7615731565b5b828204905092915050565b60006154ee826155fc565b91506154f9836155fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561553257615531615702565b5b828202905092915050565b6000615548826155fc565b9150615553836155fc565b92508282101561556657615565615702565b5b828203905092915050565b600061557c826155cd565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006155c682615571565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062ffffff82169050919050565b6000819050919050565b600061561182615618565b9050919050565b6000615623826155cd565b9050919050565b60005b8381101561564857808201518184015260208101905061562d565b83811115615657576000848401525b50505050565b6000615668826155fc565b9150600082141561567c5761567b615702565b5b600182039050919050565b6000600282049050600182168061569f57607f821691505b602082108114156156b3576156b2615760565b5b50919050565b60006156c4826155fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156f7576156f6615702565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4e6f7420746f6b656e206f776e65722e00000000000000000000000000000000600082015250565b7f4e6f7420416c6c6f7765642e0000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f42616c616e6365207370656e64696e672066756e6374696f6e7320617265206460008201527f697361626c65642e000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564207768696c6520626f6f737420616374697661746560008201527f6421000000000000000000000000000000000000000000000000000000000000602082015250565b7f426f6f7374206d61786564206f75742e00000000000000000000000000000000600082015250565b7f4e465420616c7265616479207374616b65642e00000000000000000000000000600082015250565b7f496e73756666696369656e742062616c616e63652e0000000000000000000000600082015250565b7f4d617820546f77657273206163746976617465642e0000000000000000000000600082015250565b7f4e6f7420616c6c6f776564210000000000000000000000000000000000000000600082015250565b7f4e465420616c7265616479206c6f636b65642e00000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f7420616c6c6f7765642c20746f6f206d756368206174207374616b652100600082015250565b7f5374616b696e672066756e6374696f6e73206172652064697361626c65642e00600082015250565b7f43616c6c6572206973206e6f7420746f6b656e206f776e65722e000000000000600082015250565b7f426f6f7374206e6f7420666f756e642e00000000000000000000000000000000600082015250565b7f496e76616c696420746f6b656e2069642e000000000000000000000000000000600082015250565b7f4d617820616c6c6f77616e63652069732031322e000000000000000000000000600082015250565b7f43616e6e6f742073656e6420546f6b656e7320746f205661756c74206469726560008201527f63746c7900000000000000000000000000000000000000000000000000000000602082015250565b615b4c81615571565b8114615b5757600080fd5b50565b615b6381615583565b8114615b6e57600080fd5b50565b615b7a816155bb565b8114615b8557600080fd5b50565b615b91816155fc565b8114615b9c57600080fd5b5056fea264697066735822122044e717ef1e08dadeaa09595ac1b14b4fc1dffcda20d5f60f859c0cfd8e4274bc64736f6c63430008040033
Deployed Bytecode Sourcemap
46855:15965:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57288:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59422:951;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47830:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48531:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62511:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47871:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47788:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60399:539;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55622:1658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47998:60;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;48117:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62087:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57928:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48276:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61402:477;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47912:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48163:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47710:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62303:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45975:103;;;:::i;:::-;;47637:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62198:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47422:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47953:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;58079:620;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45324:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60946:448;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58707:707;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48219:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47566:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47459:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47750:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48065:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;61985:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48671:163;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47665:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53406:182;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51275:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61887:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52320:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57671:249;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50427:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57408:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62406:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47375:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47606:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47496:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46233:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47340:28;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;47530:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57288:112;57351:7;57378:4;:14;57383:8;57378:14;;;;;;;;;;;;;;;;57371:21;;57288:112;;;:::o;59422:951::-;59491:15;;;;;;;;;;;59483:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;59553:13;59583:25;59611:9;59621:14;;59611:25;;;;;;;;;;;;;;;;;;;;;;;;;;59583:53;;59708:8;59669:17;:27;59687:8;59669:27;;;;;;;;;;;:35;;;;;;;;;;;;:47;;;59647:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;59790:1;59778:8;:13;;:30;;;;;59807:1;59795:8;:13;;59778:30;59774:74;;;59833:3;59825:11;;59774:74;59876:1;59864:8;:13;;:30;;;;;59893:1;59881:8;:13;;59864:30;59860:74;;;59919:3;59911:11;;59860:74;59962:1;59950:8;:13;;:30;;;;;59979:1;59967:8;:13;;59950:30;59946:74;;;60005:3;59997:11;;59946:74;60050:7;:5;:7::i;:::-;60036:21;;:10;:21;;;60032:113;;60102:5;60082:4;:16;60087:10;60082:16;;;;;;;;;;;;;;;;:25;;60074:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;60032:113;60177:5;60157:4;:16;60162:10;60157:16;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;60200:17;:27;60218:8;60200:27;;;;;;;;;;;;60193:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60243:50;60255:10;60267:8;60277:15;60243:50;;;;;;;;:::i;:::-;;;;;;;;60304:7;:11;;;;;;;;;;;;:24;;;60337:4;60344:10;60356:8;60304:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59422:951;;;:::o;47830:34::-;;;;;;;;;;;;;:::o;48531:132::-;48604:9;48619:35;;;;;;;;48635:4;48619:35;;;;;;48647:5;;48619:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48604:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;48531:132;;;:::o;62511:306::-;62660:6;62703:3;62687:20;;:4;:20;;;62679:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62768:41;;;62761:48;;62511:306;;;;;;;:::o;47871:34::-;;;;;;;;;;;;;:::o;47788:35::-;;;;:::o;60399:539::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60480:15:::1;60506:25:::0;60534:9:::1;60544:8;;60534:19;;;;;;;;;;;;;;;;;;;;;;;;;;60506:47;;60571:9;60566:365;60590:8;;:15;;60586:1;:19;60566:365;;;60637:8;;60646:1;60637:11;;;;;;;;;;;;;;;;;;;;;60627:21;;60670:5;:14;60676:7;60670:14;;;;;;;;;;;;60663:21:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60714:8;;:15;;60699:11;;:30;;;;;;;:::i;:::-;;;;;;;;60774:1;60744:14;:26;60759:10;60744:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;60795:49;60807:10;60819:7;60828:15;60795:49;;;;;;;;:::i;:::-;;;;;;;;60859:7;:11;;;;;;;;;;;;:24;;;60892:4;60899:10;60911:7;60859:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;60607:3;;;;;:::i;:::-;;;;60566:365;;;;45615:1;;60399:539:::0;;:::o;55622:1658::-;55720:7;55745:15;55771:18;55800:14;55817:1;55800:18;;55829;55862:21;55898:18;55919:14;:26;55934:10;55919:26;;;;;;;;;;;;;;;;55898:47;;55956:21;55980:18;:30;55999:10;55980:30;;;;;;;;;;;;;;;;55956:54;;56028:9;56023:787;56047:8;;:15;;56043:1;:19;56023:787;;;56094:8;;56103:1;56094:11;;;;;;;;;;;;;;;;;;;;;56084:21;;56120:19;56142:5;:14;56148:7;56142:14;;;;;;;;;;;56120:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56195:10;56179:26;;:6;:12;;;:26;;;56171:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56273:6;:16;;;56255:15;:34;;;;:::i;:::-;56241:48;;;;;:::i;:::-;;;56361:1;56350:7;:12;;:29;;;;;56377:2;56366:7;:13;;56350:29;56346:453;;;56442:15;;56424:14;;56411:10;:27;;;;:::i;:::-;56410:47;;;;:::i;:::-;56400:57;;;;;:::i;:::-;;;56346:453;;;56541:4;56530:7;:15;;:34;;;;;56560:4;56549:7;:15;;56530:34;56526:273;;;56627:11;;56609:14;;56596:10;:27;;;;:::i;:::-;56595:43;;;;:::i;:::-;56585:53;;;;;:::i;:::-;;;56526:273;;;56770:13;;56752:14;;56739:10;:27;;;;:::i;:::-;56738:45;;;;:::i;:::-;56728:55;;;;;:::i;:::-;;;56526:273;56346:453;56023:787;56064:3;;;;;:::i;:::-;;;;56023:787;;;;56840:1;56826:10;:15;56822:79;;;56886:3;56876:6;56872:1;:10;;;;:::i;:::-;56871:18;;;;:::i;:::-;56858:31;;56822:79;56931:2;56917:10;:16;56913:80;;;56978:3;56968:6;56964:1;:10;;;;:::i;:::-;56963:18;;;;:::i;:::-;56950:31;;56913:80;57026:1;57009:13;:18;57005:88;;;57077:3;57067:6;57062:2;:11;;;;:::i;:::-;57061:19;;;;:::i;:::-;57044:37;;57005:88;57125:1;57109:13;:17;57105:87;;;57176:3;57166:6;57161:2;:11;;;;:::i;:::-;57160:19;;;;:::i;:::-;57143:37;;57105:87;57235:13;57222:10;57213:6;:19;;;;:::i;:::-;:35;;;;:::i;:::-;57204:44;;57266:6;57259:13;;;;;;;;;55622:1658;;;;:::o;47998:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48117:39::-;;;;;;;;;;;;;;;;;:::o;62087:103::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62174:8:::1;62162:9;;:20;;;;;;;;;;;;;;;;;;62087:103:::0;:::o;57928:143::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58056:7:::1;58038:4;:14;58043:8;58038:14;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;57928:143:::0;;:::o;48276:53::-;;;;;;;;;;;;;;;;;:::o;61402:477::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61517:7:::1;61484:12;:21;61497:7;61484:21;;;;;;;;;;;:29;;;;;;;;;;;;:40;;;61476:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;61559:15;;:17;;;;;;;;;:::i;:::-;;;;;;61587:25;61615:9;61625:10;;61615:21;;;;;;;;;;;;;;;;;;;;;;;;;;61587:49;;61647:7;:11;;;;;;;;;;;;:24;;;61680:4;61687:10;61699:7;61647:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61723:49;61735:10;61747:7;61756:15;61723:49;;;;;;;;:::i;:::-;;;;;;;;61790:12;:21;61803:7;61790:21;;;;;;;;;;;;61783:28:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61870:1;61822:15;:44;61838:12;:21;61851:7;61838:21;;;;;;;;;;;:27;;;;;;;;;;;;61822:44;;;;;;;;;;;;;;;;:49;;;;;;;:::i;:::-;;;;;;;;45615:1;61402:477:::0;:::o;47912:34::-;;;;;;;;;;;;;:::o;48163:49::-;;;;;;;;;;;;;;;;;:::o;47710:33::-;;;;:::o;62303:95::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62384:6:::1;62367:14;;:23;;;;;;;;;;;;;;;;;;62303:95:::0;:::o;45975:103::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46040:30:::1;46067:1;46040:18;:30::i;:::-;45975:103::o:0;47637:21::-;;;;;;;;;;;;;:::o;62198:97::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62279:8:::1;62270:6;;:17;;;;;;;;;;;;;;;;;;62198:97:::0;:::o;47422:30::-;;;;:::o;47953:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58079:620::-;58167:16;58201:20;58238:11;;58224:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58201:49;;58261:13;58296:15;58314:1;58296:19;;58291:223;58328:11;;58317:7;:22;58291:223;;58395:7;58371:31;;:5;:14;58377:7;58371:14;;;;;;;;;;;:20;;;;;;;;;;;;:31;;;58367:136;;;58436:5;:14;58442:7;58436:14;;;;;;;;;;;:22;;;;;;;;;;;;58423:35;;:3;58427:5;58423:10;;;;;;;;;;;;;;;;;;;;;:35;;;;;58486:1;58477:10;;;;;:::i;:::-;;;58367:136;58341:9;;;;;:::i;:::-;;;;58291:223;;;;58526:23;58566:5;58552:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58526:46;;58590:9;58585:81;58609:5;58605:1;:9;58585:81;;;58648:3;58652:1;58648:6;;;;;;;;;;;;;;;;;;;;;;58636;58643:1;58636:9;;;;;;;;;;;;;;;;;;;;;:18;;;;;58616:3;;;;;:::i;:::-;;;;58585:81;;;;58685:6;58678:13;;;;;58079:620;;;:::o;45324:87::-;45370:7;45397:6;;;;;;;;;;;45390:13;;45324:87;:::o;60946:448::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61021:25:::1;61049:9;61059:14;;61049:25;;;;;;;;;;;;;;;;;;;;;;;;;;61021:53;;61148:8;61109:17;:27;61127:8;61109:27;;;;;;;;;;;:35;;;;;;;;;;;;:47;;;61087:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;61221:17;:27;61239:8;61221:27;;;;;;;;;;;;61214:34:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61264:50;61276:10;61288:8;61298:15;61264:50;;;;;;;;:::i;:::-;;;;;;;;61325:7;:11;;;;;;;;;;;;:24;;;61358:4;61365:10;61377:8;61325:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45615:1;60946:448:::0;:::o;58707:707::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58787:15:::1;58813:25:::0;58841:9:::1;58851:14;;58841:25;;;;;;;;;;;;;;;;;;;;;;;;;;58813:53;;58884:9;58879:528;58903:8;;:15;;58899:1;:19;58879:528;;;58950:8;;58959:1;58950:11;;;;;;;;;;;;;;;;;;;;;58940:21;;59040:1;59002:17;:26;59020:7;59002:26;;;;;;;;;;;:34;;;;;;;;;;;;:39;;;58976:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;59113:7;:11;;;;;;;;;;;;:24;;;59138:10;59158:4;59165:7;59113:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59193:47;59203:10;59215:7;59224:15;59193:47;;;;;;;;:::i;:::-;;;;;;;;59284:111;;;;;;;;59371:7;59284:111;;;;;;59326:10;59284:111;;;;::::0;59255:17:::1;:26;59273:7;59255:26;;;;;;;;;;;:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58920:3;;;;;:::i;:::-;;;;58879:528;;;;45615:1;;58707:707:::0;;:::o;48219:50::-;;;;;;;;;;;;;;;;;:::o;47566:33::-;;;;:::o;47459:30::-;;;;:::o;47750:31::-;;;;:::o;48065:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61985:94::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62065:6:::1;62052:10;:19;;;;61985:94:::0;:::o;48671:163::-;48746:14;;;;;;;;;;;48738:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48807:19;48817:8;;48807:9;:19::i;:::-;48671:163;;:::o;47665:38::-;;;;:::o;53406:182::-;53493:14;;;;;;;;;;;53485:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53554:26;53561:8;;53571;53554:6;:26::i;:::-;53406:182;;;:::o;51275:160::-;51343:14;;;;;;;;;;;51335:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51404:23;51419:7;51404:14;:23::i;:::-;51275:160;:::o;61887:90::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61963:6:::1;61952:8;:17;;;;61887:90:::0;:::o;52320:164::-;52390:14;;;;;;;;;;;52382:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52451:25;52468:7;52451:16;:25::i;:::-;52320:164;:::o;57671:249::-;57760:15;;;;;;;;;;;57752:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57853:6;;;;;;;;;;;57839:20;;:10;:20;;;57831:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;57905:7;57887:4;:14;57892:8;57887:14;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;57671:249;;:::o;50427:167::-;50504:14;;;;;;;;;;;50496:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50565:21;50577:8;;50565:11;:21::i;:::-;50427:167;;:::o;57408:255::-;57500:15;;;;;;;;;;;57492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57593:9;;;;;;;;;;;57579:23;;:10;:23;;;57571:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57648:7;57630:4;:14;57635:8;57630:14;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;57408:255;;:::o;62406:97::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62489:6:::1;62471:15;;:24;;;;;;;;;;;;;;;;;;62406:97:::0;:::o;47375:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47606:24::-;;;;;;;;;;;;;:::o;47496:27::-;;;;:::o;46233:238::-;45555:12;:10;:12::i;:::-;45544:23;;:7;:5;:7::i;:::-;:23;;;45536:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46356:1:::1;46336:22;;:8;:22;;;;46314:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46435:28;46454:8;46435:18;:28::i;:::-;46233:238:::0;:::o;47340:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47530:29::-;;;;:::o;21346:98::-;21399:7;21426:10;21419:17;;21346:98;:::o;46631:191::-;46705:16;46724:6;;;;;;;;;;;46705:25;;46750:8;46741:6;;:17;;;;;;;;;;;;;;;;;;46805:8;46774:40;;46795:8;46774:40;;;;;;;;;;;;46631:191;;:::o;48842:1577::-;48910:15;48938:18;48959:15;:27;48975:10;48959:27;;;;;;;;;;;;;;;;48938:48;;48997:18;49018:14;:26;49033:10;49018:26;;;;;;;;;;;;;;;;48997:47;;49055:23;49094:8;;:15;;49081:10;:28;;;;:::i;:::-;49055:54;;49148:2;49130:15;:20;49122:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;49210:1;49192:15;:19;49188:214;;;49249:1;49236:10;:14;49228:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49310:1;49292:15;:19;49288:103;;;49353:1;49340:10;:14;49332:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49288:103;49188:214;49429:8;;:15;;49414:11;;:30;;;;;;;:::i;:::-;;;;;;;;49455:25;49483:9;49493:8;;49483:19;;;;;;;;;;;;;;;;;;;;;;;;;;49455:47;;49554:9;;;;;;;;;;;49546:28;;;49589:10;49546:64;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49513:18;:30;49532:10;49513:30;;;;;;;;;;;;;;;:97;;;;49628:9;49623:789;49647:8;;:15;;49643:1;:19;49623:789;;;49694:8;;49703:1;49694:11;;;;;;;;;;;;;;;;;;;;;49684:21;;49778:10;49746:42;;:7;:11;;;;;;;;;;;;:19;;;49766:7;49746:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;49720:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;49901:1;49875:5;:14;49881:7;49875:14;;;;;;;;;;;:22;;;;;;;;;;;;:27;;;49867:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;49941:7;:11;;;;;;;;;;;;:24;;;49966:10;49986:4;49993:7;49941:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50021:47;50031:10;50043:7;50052:15;50021:47;;;;;;;;:::i;:::-;;;;;;;;50102:250;;;;;;;;50179:7;50102:250;;;;;;50225:15;50102:250;;;;50134:10;50102:250;;;;;;50267:10;50102:250;;;;50306:18;:30;50325:10;50306:30;;;;;;;;;;;;;;;;50102:250;;;50085:5;:14;50091:7;50085:14;;;;;;;;;;;:267;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50399:1;50369:14;:26;50384:10;50369:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;49664:3;;;;;:::i;:::-;;;;49623:789;;;;48842:1577;;;;;;;:::o;53596:2018::-;53676:15;53702:18;53731:14;53760:18;53793:21;53829:18;53850:14;:26;53865:10;53850:26;;;;;;;;;;;;;;;;53829:47;;53887:21;53911:18;:30;53930:10;53911:30;;;;;;;;;;;;;;;;53887:54;;53959:9;53954:1058;53978:8;;:15;;53974:1;:19;53954:1058;;;54025:8;;54034:1;54025:11;;;;;;;;;;;;;;;;;;;;;54015:21;;54051:19;54073:5;:14;54079:7;54073:14;;;;;;;;;;;54051:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54126:10;54110:26;;:6;:12;;;:26;;;54102:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54204:6;:16;;;54186:15;:34;;;;:::i;:::-;54172:48;;;;;:::i;:::-;;;54290:1;54279:7;:12;;:29;;;;;54306:2;54295:7;:13;;54279:29;54275:453;;;54371:15;;54353:14;;54340:10;:27;;;;:::i;:::-;54339:47;;;;:::i;:::-;54329:57;;;;;:::i;:::-;;;54275:453;;;54470:4;54459:7;:15;;:34;;;;;54489:4;54478:7;:15;;54459:34;54455:273;;;54556:11;;54538:14;;54525:10;:27;;;;:::i;:::-;54524:43;;;;:::i;:::-;54514:53;;;;;:::i;:::-;;;54455:273;;;54699:13;;54681:14;;54668:10;:27;;;;:::i;:::-;54667:45;;;;:::i;:::-;54657:55;;;;;:::i;:::-;;;54455:273;54275:453;54761:239;;;;;;;;54840:7;54761:239;;;;;;54886:15;54761:239;;;;54793:6;:12;;;54761:239;;;;;;54928:6;:12;;;54761:239;;;;54969:6;:15;;;54761:239;;;54744:5;:14;54750:7;54744:14;;;;;;;;;;;:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53954:1058;53995:3;;;;;:::i;:::-;;;;53954:1058;;;;55042:1;55028:10;:15;55024:79;;;55088:3;55078:6;55074:1;:10;;;;:::i;:::-;55073:18;;;;:::i;:::-;55060:31;;55024:79;55133:2;55119:10;:16;55115:80;;;55180:3;55170:6;55166:1;:10;;;;:::i;:::-;55165:18;;;;:::i;:::-;55152:31;;55115:80;55228:1;55211:13;:18;55207:88;;;55279:3;55269:6;55264:2;:11;;;;:::i;:::-;55263:19;;;;:::i;:::-;55246:37;;55207:88;55327:1;55311:13;:17;55307:87;;;55378:3;55368:6;55363:2;:11;;;;:::i;:::-;55362:19;;;;:::i;:::-;55345:37;;55307:87;55437:13;55424:10;55415:6;:19;;;;:::i;:::-;:35;;;;:::i;:::-;55406:44;;55481:6;55461:4;:16;55466:10;55461:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;55504:8;55500:62;;;55529:21;55541:8;;55529:11;:21::i;:::-;55500:62;55579:27;55587:10;55599:6;55579:27;;;;;;;:::i;:::-;;;;;;;;53596:2018;;;;;;;;;;:::o;51443:869::-;51504:25;51532:9;51542:10;;51532:21;;;;;;;;;;;;;;;;;;;;;;;;;;51504:49;;51564:19;51586:15;:27;51602:10;51586:27;;;;;;;;;;;;;;;;51564:49;;51684:1;51670:11;:15;51662:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;51778:10;51746:42;;:7;:11;;;;;;;;;;;;:19;;;51766:7;51746:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;51724:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;51896:1;51863:12;:21;51876:7;51863:21;;;;;;;;;;;:29;;;;;;;;;;;;:34;;;51855:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51932:7;:11;;;;;;;;;;;;:24;;;51957:10;51977:4;51984:7;51932:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52008:47;52018:10;52030:7;52039:15;52008:47;;;;;;;;:::i;:::-;;;;;;;;52092:139;;;;;;;;52129:7;52092:139;;;;;;52171:15;52092:139;;;;52209:10;52092:139;;;;;52068:12;:21;52081:7;52068:21;;;;;;;;;;;:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52244:15;;:17;;;;;;;;;:::i;:::-;;;;;;52303:1;52272:15;:27;52288:10;52272:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;51443:869;;;:::o;52492:906::-;52608:10;52577:41;;:12;:21;52590:7;52577:21;;;;;;;;;;;:27;;;;;;;;;;;;:41;;;52555:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;52685:18;52706:14;:26;52721:10;52706:26;;;;;;;;;;;;;;;;52685:47;;52743:18;52764:15;:27;52780:10;52764:27;;;;;;;;;;;;;;;;52743:48;;52825:1;52812:10;:14;52804:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;52893:1;52879:10;:15;52875:87;;52932:1;52919:10;:14;52911:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;52875:87;52991:1;52978:10;:14;52974:109;;;53031:1;53017:10;:15;53009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52974:109;53095:15;;:17;;;;;;;;;:::i;:::-;;;;;;53123:25;53151:9;53161:10;;53151:21;;;;;;;;;;;;;;;;;;;;;;;;;;53123:49;;53183:7;:11;;;;;;;;;;;;:24;;;53216:4;53223:10;53235:7;53183:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53259:49;53271:10;53283:7;53292:15;53259:49;;;;;;;;:::i;:::-;;;;;;;;53326:12;:21;53339:7;53326:21;;;;;;;;;;;;53319:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53389:1;53358:15;:27;53374:10;53358:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;52492:906;;;;:::o;50602:665::-;50672:15;50698:25;50726:9;50736:8;;50726:19;;;;;;;;;;;;;;;;;;;;;;;;;;50698:47;;50763:9;50758:502;50782:8;;:15;;50778:1;:19;50758:502;;;50829:8;;50838:1;50829:11;;;;;;;;;;;;;;;;;;;;;50819:21;;50855:19;50877:5;:14;50883:7;50877:14;;;;;;;;;;;50855:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50932:10;50916:26;;:6;:12;;;:26;;;50908:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50997:5;:14;51003:7;50997:14;;;;;;;;;;;;50990:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51041:8;;:15;;51026:11;;:30;;;;;;;:::i;:::-;;;;;;;;51101:1;51071:14;:26;51086:10;51071:26;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;51124:49;51136:10;51148:7;51157:15;51124:49;;;;;;;;:::i;:::-;;;;;;;;51188:7;:11;;;;;;;;;;;;:24;;;51221:4;51228:10;51240:7;51188:60;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50758:502;50799:3;;;;;:::i;:::-;;;;50758:502;;;;50602:665;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;318:367::-;391:8;401:6;451:3;444:4;436:6;432:17;428:27;418:2;;469:1;466;459:12;418:2;505:6;492:20;482:30;;535:18;527:6;524:30;521:2;;;567:1;564;557:12;521:2;604:4;596:6;592:17;580:29;;658:3;650:4;642:6;638:17;628:8;624:32;621:41;618:2;;;675:1;672;665:12;618:2;408:277;;;;;:::o;691:133::-;734:5;772:6;759:20;750:29;;788:30;812:5;788:30;:::i;:::-;740:84;;;;:::o;843:351::-;900:8;910:6;960:3;953:4;945:6;941:17;937:27;927:2;;978:1;975;968:12;927:2;1014:6;1001:20;991:30;;1044:18;1036:6;1033:30;1030:2;;;1076:1;1073;1066:12;1030:2;1113:4;1105:6;1101:17;1089:29;;1167:3;1159:4;1151:6;1147:17;1137:8;1133:32;1130:41;1127:2;;;1184:1;1181;1174:12;1127:2;917:277;;;;;:::o;1200:169::-;1261:5;1299:6;1286:20;1277:29;;1315:48;1357:5;1315:48;:::i;:::-;1267:102;;;;:::o;1389:352::-;1447:8;1457:6;1507:3;1500:4;1492:6;1488:17;1484:27;1474:2;;1525:1;1522;1515:12;1474:2;1561:6;1548:20;1538:30;;1591:18;1583:6;1580:30;1577:2;;;1623:1;1620;1613:12;1577:2;1660:4;1652:6;1648:17;1636:29;;1714:3;1706:4;1698:6;1694:17;1684:8;1680:32;1677:41;1674:2;;;1731:1;1728;1721:12;1674:2;1464:277;;;;;:::o;1747:139::-;1793:5;1831:6;1818:20;1809:29;;1847:33;1874:5;1847:33;:::i;:::-;1799:87;;;;:::o;1892:143::-;1949:5;1980:6;1974:13;1965:22;;1996:33;2023:5;1996:33;:::i;:::-;1955:80;;;;:::o;2041:262::-;2100:6;2149:2;2137:9;2128:7;2124:23;2120:32;2117:2;;;2165:1;2162;2155:12;2117:2;2208:1;2233:53;2278:7;2269:6;2258:9;2254:22;2233:53;:::i;:::-;2223:63;;2179:117;2107:196;;;;:::o;2309:284::-;2379:6;2428:2;2416:9;2407:7;2403:23;2399:32;2396:2;;;2444:1;2441;2434:12;2396:2;2487:1;2512:64;2568:7;2559:6;2548:9;2544:22;2512:64;:::i;:::-;2502:74;;2458:128;2386:207;;;;:::o;2599:829::-;2696:6;2704;2712;2720;2728;2777:3;2765:9;2756:7;2752:23;2748:33;2745:2;;;2794:1;2791;2784:12;2745:2;2837:1;2862:53;2907:7;2898:6;2887:9;2883:22;2862:53;:::i;:::-;2852:63;;2808:117;2964:2;2990:53;3035:7;3026:6;3015:9;3011:22;2990:53;:::i;:::-;2980:63;;2935:118;3092:2;3118:53;3163:7;3154:6;3143:9;3139:22;3118:53;:::i;:::-;3108:63;;3063:118;3248:2;3237:9;3233:18;3220:32;3279:18;3271:6;3268:30;3265:2;;;3311:1;3308;3301:12;3265:2;3347:64;3403:7;3394:6;3383:9;3379:22;3347:64;:::i;:::-;3329:82;;;;3191:230;2735:693;;;;;;;;:::o;3434:407::-;3502:6;3510;3559:2;3547:9;3538:7;3534:23;3530:32;3527:2;;;3575:1;3572;3565:12;3527:2;3618:1;3643:53;3688:7;3679:6;3668:9;3664:22;3643:53;:::i;:::-;3633:63;;3589:117;3745:2;3771:53;3816:7;3807:6;3796:9;3792:22;3771:53;:::i;:::-;3761:63;;3716:118;3517:324;;;;;:::o;3847:425::-;3933:6;3941;3990:2;3978:9;3969:7;3965:23;3961:32;3958:2;;;4006:1;4003;3996:12;3958:2;4077:1;4066:9;4062:17;4049:31;4107:18;4099:6;4096:30;4093:2;;;4139:1;4136;4129:12;4093:2;4175:80;4247:7;4238:6;4227:9;4223:22;4175:80;:::i;:::-;4157:98;;;;4020:245;3948:324;;;;;:::o;4278:564::-;4370:6;4378;4386;4435:2;4423:9;4414:7;4410:23;4406:32;4403:2;;;4451:1;4448;4441:12;4403:2;4522:1;4511:9;4507:17;4494:31;4552:18;4544:6;4541:30;4538:2;;;4584:1;4581;4574:12;4538:2;4620:80;4692:7;4683:6;4672:9;4668:22;4620:80;:::i;:::-;4602:98;;;;4465:245;4749:2;4775:50;4817:7;4808:6;4797:9;4793:22;4775:50;:::i;:::-;4765:60;;4720:115;4393:449;;;;;:::o;4848:256::-;4904:6;4953:2;4941:9;4932:7;4928:23;4924:32;4921:2;;;4969:1;4966;4959:12;4921:2;5012:1;5037:50;5079:7;5070:6;5059:9;5055:22;5037:50;:::i;:::-;5027:60;;4983:114;4911:193;;;;:::o;5110:570::-;5205:6;5213;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:2;;;5286:1;5283;5276:12;5238:2;5329:1;5354:68;5414:7;5405:6;5394:9;5390:22;5354:68;:::i;:::-;5344:78;;5300:132;5499:2;5488:9;5484:18;5471:32;5530:18;5522:6;5519:30;5516:2;;;5562:1;5559;5552:12;5516:2;5598:65;5655:7;5646:6;5635:9;5631:22;5598:65;:::i;:::-;5580:83;;;;5442:231;5228:452;;;;;:::o;5686:262::-;5745:6;5794:2;5782:9;5773:7;5769:23;5765:32;5762:2;;;5810:1;5807;5800:12;5762:2;5853:1;5878:53;5923:7;5914:6;5903:9;5899:22;5878:53;:::i;:::-;5868:63;;5824:117;5752:196;;;;:::o;5954:284::-;6024:6;6073:2;6061:9;6052:7;6048:23;6044:32;6041:2;;;6089:1;6086;6079:12;6041:2;6132:1;6157:64;6213:7;6204:6;6193:9;6189:22;6157:64;:::i;:::-;6147:74;;6103:128;6031:207;;;;:::o;6244:179::-;6313:10;6334:46;6376:3;6368:6;6334:46;:::i;:::-;6412:4;6407:3;6403:14;6389:28;;6324:99;;;;:::o;6429:118::-;6516:24;6534:5;6516:24;:::i;:::-;6511:3;6504:37;6494:53;;:::o;6583:732::-;6702:3;6731:54;6779:5;6731:54;:::i;:::-;6801:86;6880:6;6875:3;6801:86;:::i;:::-;6794:93;;6911:56;6961:5;6911:56;:::i;:::-;6990:7;7021:1;7006:284;7031:6;7028:1;7025:13;7006:284;;;7107:6;7101:13;7134:63;7193:3;7178:13;7134:63;:::i;:::-;7127:70;;7220:60;7273:6;7220:60;:::i;:::-;7210:70;;7066:224;7053:1;7050;7046:9;7041:14;;7006:284;;;7010:14;7306:3;7299:10;;6707:608;;;;;;;:::o;7321:109::-;7402:21;7417:5;7402:21;:::i;:::-;7397:3;7390:34;7380:50;;:::o;7436:115::-;7521:23;7538:5;7521:23;:::i;:::-;7516:3;7509:36;7499:52;;:::o;7557:161::-;7659:52;7705:5;7659:52;:::i;:::-;7654:3;7647:65;7637:81;;:::o;7724:364::-;7812:3;7840:39;7873:5;7840:39;:::i;:::-;7895:71;7959:6;7954:3;7895:71;:::i;:::-;7888:78;;7975:52;8020:6;8015:3;8008:4;8001:5;7997:16;7975:52;:::i;:::-;8052:29;8074:6;8052:29;:::i;:::-;8047:3;8043:39;8036:46;;7816:272;;;;;:::o;8094:366::-;8236:3;8257:67;8321:2;8316:3;8257:67;:::i;:::-;8250:74;;8333:93;8422:3;8333:93;:::i;:::-;8451:2;8446:3;8442:12;8435:19;;8240:220;;;:::o;8466:366::-;8608:3;8629:67;8693:2;8688:3;8629:67;:::i;:::-;8622:74;;8705:93;8794:3;8705:93;:::i;:::-;8823:2;8818:3;8814:12;8807:19;;8612:220;;;:::o;8838:366::-;8980:3;9001:67;9065:2;9060:3;9001:67;:::i;:::-;8994:74;;9077:93;9166:3;9077:93;:::i;:::-;9195:2;9190:3;9186:12;9179:19;;8984:220;;;:::o;9210:366::-;9352:3;9373:67;9437:2;9432:3;9373:67;:::i;:::-;9366:74;;9449:93;9538:3;9449:93;:::i;:::-;9567:2;9562:3;9558:12;9551:19;;9356:220;;;:::o;9582:366::-;9724:3;9745:67;9809:2;9804:3;9745:67;:::i;:::-;9738:74;;9821:93;9910:3;9821:93;:::i;:::-;9939:2;9934:3;9930:12;9923:19;;9728:220;;;:::o;9954:366::-;10096:3;10117:67;10181:2;10176:3;10117:67;:::i;:::-;10110:74;;10193:93;10282:3;10193:93;:::i;:::-;10311:2;10306:3;10302:12;10295:19;;10100:220;;;:::o;10326:366::-;10468:3;10489:67;10553:2;10548:3;10489:67;:::i;:::-;10482:74;;10565:93;10654:3;10565:93;:::i;:::-;10683:2;10678:3;10674:12;10667:19;;10472:220;;;:::o;10698:366::-;10840:3;10861:67;10925:2;10920:3;10861:67;:::i;:::-;10854:74;;10937:93;11026:3;10937:93;:::i;:::-;11055:2;11050:3;11046:12;11039:19;;10844:220;;;:::o;11070:366::-;11212:3;11233:67;11297:2;11292:3;11233:67;:::i;:::-;11226:74;;11309:93;11398:3;11309:93;:::i;:::-;11427:2;11422:3;11418:12;11411:19;;11216:220;;;:::o;11442:366::-;11584:3;11605:67;11669:2;11664:3;11605:67;:::i;:::-;11598:74;;11681:93;11770:3;11681:93;:::i;:::-;11799:2;11794:3;11790:12;11783:19;;11588:220;;;:::o;11814:366::-;11956:3;11977:67;12041:2;12036:3;11977:67;:::i;:::-;11970:74;;12053:93;12142:3;12053:93;:::i;:::-;12171:2;12166:3;12162:12;12155:19;;11960:220;;;:::o;12186:366::-;12328:3;12349:67;12413:2;12408:3;12349:67;:::i;:::-;12342:74;;12425:93;12514:3;12425:93;:::i;:::-;12543:2;12538:3;12534:12;12527:19;;12332:220;;;:::o;12558:366::-;12700:3;12721:67;12785:2;12780:3;12721:67;:::i;:::-;12714:74;;12797:93;12886:3;12797:93;:::i;:::-;12915:2;12910:3;12906:12;12899:19;;12704:220;;;:::o;12930:366::-;13072:3;13093:67;13157:2;13152:3;13093:67;:::i;:::-;13086:74;;13169:93;13258:3;13169:93;:::i;:::-;13287:2;13282:3;13278:12;13271:19;;13076:220;;;:::o;13302:366::-;13444:3;13465:67;13529:2;13524:3;13465:67;:::i;:::-;13458:74;;13541:93;13630:3;13541:93;:::i;:::-;13659:2;13654:3;13650:12;13643:19;;13448:220;;;:::o;13674:366::-;13816:3;13837:67;13901:2;13896:3;13837:67;:::i;:::-;13830:74;;13913:93;14002:3;13913:93;:::i;:::-;14031:2;14026:3;14022:12;14015:19;;13820:220;;;:::o;14046:366::-;14188:3;14209:67;14273:2;14268:3;14209:67;:::i;:::-;14202:74;;14285:93;14374:3;14285:93;:::i;:::-;14403:2;14398:3;14394:12;14387:19;;14192:220;;;:::o;14418:366::-;14560:3;14581:67;14645:2;14640:3;14581:67;:::i;:::-;14574:74;;14657:93;14746:3;14657:93;:::i;:::-;14775:2;14770:3;14766:12;14759:19;;14564:220;;;:::o;14790:366::-;14932:3;14953:67;15017:2;15012:3;14953:67;:::i;:::-;14946:74;;15029:93;15118:3;15029:93;:::i;:::-;15147:2;15142:3;15138:12;15131:19;;14936:220;;;:::o;15162:115::-;15247:23;15264:5;15247:23;:::i;:::-;15242:3;15235:36;15225:52;;:::o;15283:108::-;15360:24;15378:5;15360:24;:::i;:::-;15355:3;15348:37;15338:53;;:::o;15397:118::-;15484:24;15502:5;15484:24;:::i;:::-;15479:3;15472:37;15462:53;;:::o;15521:222::-;15614:4;15652:2;15641:9;15637:18;15629:26;;15665:71;15733:1;15722:9;15718:17;15709:6;15665:71;:::i;:::-;15619:124;;;;:::o;15749:442::-;15898:4;15936:2;15925:9;15921:18;15913:26;;15949:71;16017:1;16006:9;16002:17;15993:6;15949:71;:::i;:::-;16030:72;16098:2;16087:9;16083:18;16074:6;16030:72;:::i;:::-;16112;16180:2;16169:9;16165:18;16156:6;16112:72;:::i;:::-;15903:288;;;;;;:::o;16197:332::-;16318:4;16356:2;16345:9;16341:18;16333:26;;16369:71;16437:1;16426:9;16422:17;16413:6;16369:71;:::i;:::-;16450:72;16518:2;16507:9;16503:18;16494:6;16450:72;:::i;:::-;16323:206;;;;;:::o;16535:442::-;16684:4;16722:2;16711:9;16707:18;16699:26;;16735:71;16803:1;16792:9;16788:17;16779:6;16735:71;:::i;:::-;16816:72;16884:2;16873:9;16869:18;16860:6;16816:72;:::i;:::-;16898;16966:2;16955:9;16951:18;16942:6;16898:72;:::i;:::-;16689:288;;;;;;:::o;16983:373::-;17126:4;17164:2;17153:9;17149:18;17141:26;;17213:9;17207:4;17203:20;17199:1;17188:9;17184:17;17177:47;17241:108;17344:4;17335:6;17241:108;:::i;:::-;17233:116;;17131:225;;;;:::o;17362:210::-;17449:4;17487:2;17476:9;17472:18;17464:26;;17500:65;17562:1;17551:9;17547:17;17538:6;17500:65;:::i;:::-;17454:118;;;;:::o;17578:218::-;17669:4;17707:2;17696:9;17692:18;17684:26;;17720:69;17786:1;17775:9;17771:17;17762:6;17720:69;:::i;:::-;17674:122;;;;:::o;17802:453::-;17958:4;17996:2;17985:9;17981:18;17973:26;;18009:86;18092:1;18081:9;18077:17;18068:6;18009:86;:::i;:::-;18142:9;18136:4;18132:20;18127:2;18116:9;18112:18;18105:48;18170:78;18243:4;18234:6;18170:78;:::i;:::-;18162:86;;17963:292;;;;;:::o;18261:419::-;18427:4;18465:2;18454:9;18450:18;18442:26;;18514:9;18508:4;18504:20;18500:1;18489:9;18485:17;18478:47;18542:131;18668:4;18542:131;:::i;:::-;18534:139;;18432:248;;;:::o;18686:419::-;18852:4;18890:2;18879:9;18875:18;18867:26;;18939:9;18933:4;18929:20;18925:1;18914:9;18910:17;18903:47;18967:131;19093:4;18967:131;:::i;:::-;18959:139;;18857:248;;;:::o;19111:419::-;19277:4;19315:2;19304:9;19300:18;19292:26;;19364:9;19358:4;19354:20;19350:1;19339:9;19335:17;19328:47;19392:131;19518:4;19392:131;:::i;:::-;19384:139;;19282:248;;;:::o;19536:419::-;19702:4;19740:2;19729:9;19725:18;19717:26;;19789:9;19783:4;19779:20;19775:1;19764:9;19760:17;19753:47;19817:131;19943:4;19817:131;:::i;:::-;19809:139;;19707:248;;;:::o;19961:419::-;20127:4;20165:2;20154:9;20150:18;20142:26;;20214:9;20208:4;20204:20;20200:1;20189:9;20185:17;20178:47;20242:131;20368:4;20242:131;:::i;:::-;20234:139;;20132:248;;;:::o;20386:419::-;20552:4;20590:2;20579:9;20575:18;20567:26;;20639:9;20633:4;20629:20;20625:1;20614:9;20610:17;20603:47;20667:131;20793:4;20667:131;:::i;:::-;20659:139;;20557:248;;;:::o;20811:419::-;20977:4;21015:2;21004:9;21000:18;20992:26;;21064:9;21058:4;21054:20;21050:1;21039:9;21035:17;21028:47;21092:131;21218:4;21092:131;:::i;:::-;21084:139;;20982:248;;;:::o;21236:419::-;21402:4;21440:2;21429:9;21425:18;21417:26;;21489:9;21483:4;21479:20;21475:1;21464:9;21460:17;21453:47;21517:131;21643:4;21517:131;:::i;:::-;21509:139;;21407:248;;;:::o;21661:419::-;21827:4;21865:2;21854:9;21850:18;21842:26;;21914:9;21908:4;21904:20;21900:1;21889:9;21885:17;21878:47;21942:131;22068:4;21942:131;:::i;:::-;21934:139;;21832:248;;;:::o;22086:419::-;22252:4;22290:2;22279:9;22275:18;22267:26;;22339:9;22333:4;22329:20;22325:1;22314:9;22310:17;22303:47;22367:131;22493:4;22367:131;:::i;:::-;22359:139;;22257:248;;;:::o;22511:419::-;22677:4;22715:2;22704:9;22700:18;22692:26;;22764:9;22758:4;22754:20;22750:1;22739:9;22735:17;22728:47;22792:131;22918:4;22792:131;:::i;:::-;22784:139;;22682:248;;;:::o;22936:419::-;23102:4;23140:2;23129:9;23125:18;23117:26;;23189:9;23183:4;23179:20;23175:1;23164:9;23160:17;23153:47;23217:131;23343:4;23217:131;:::i;:::-;23209:139;;23107:248;;;:::o;23361:419::-;23527:4;23565:2;23554:9;23550:18;23542:26;;23614:9;23608:4;23604:20;23600:1;23589:9;23585:17;23578:47;23642:131;23768:4;23642:131;:::i;:::-;23634:139;;23532:248;;;:::o;23786:419::-;23952:4;23990:2;23979:9;23975:18;23967:26;;24039:9;24033:4;24029:20;24025:1;24014:9;24010:17;24003:47;24067:131;24193:4;24067:131;:::i;:::-;24059:139;;23957:248;;;:::o;24211:419::-;24377:4;24415:2;24404:9;24400:18;24392:26;;24464:9;24458:4;24454:20;24450:1;24439:9;24435:17;24428:47;24492:131;24618:4;24492:131;:::i;:::-;24484:139;;24382:248;;;:::o;24636:419::-;24802:4;24840:2;24829:9;24825:18;24817:26;;24889:9;24883:4;24879:20;24875:1;24864:9;24860:17;24853:47;24917:131;25043:4;24917:131;:::i;:::-;24909:139;;24807:248;;;:::o;25061:419::-;25227:4;25265:2;25254:9;25250:18;25242:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25342:131;25468:4;25342:131;:::i;:::-;25334:139;;25232:248;;;:::o;25486:419::-;25652:4;25690:2;25679:9;25675:18;25667:26;;25739:9;25733:4;25729:20;25725:1;25714:9;25710:17;25703:47;25767:131;25893:4;25767:131;:::i;:::-;25759:139;;25657:248;;;:::o;25911:419::-;26077:4;26115:2;26104:9;26100:18;26092:26;;26164:9;26158:4;26154:20;26150:1;26139:9;26135:17;26128:47;26192:131;26318:4;26192:131;:::i;:::-;26184:139;;26082:248;;;:::o;26336:328::-;26455:4;26493:2;26482:9;26478:18;26470:26;;26506:69;26572:1;26561:9;26557:17;26548:6;26506:69;:::i;:::-;26585:72;26653:2;26642:9;26638:18;26629:6;26585:72;:::i;:::-;26460:204;;;;;:::o;26670:438::-;26817:4;26855:2;26844:9;26840:18;26832:26;;26868:69;26934:1;26923:9;26919:17;26910:6;26868:69;:::i;:::-;26947:72;27015:2;27004:9;27000:18;26991:6;26947:72;:::i;:::-;27029;27097:2;27086:9;27082:18;27073:6;27029:72;:::i;:::-;26822:286;;;;;;:::o;27114:660::-;27317:4;27355:3;27344:9;27340:19;27332:27;;27369:69;27435:1;27424:9;27420:17;27411:6;27369:69;:::i;:::-;27448:72;27516:2;27505:9;27501:18;27492:6;27448:72;:::i;:::-;27530;27598:2;27587:9;27583:18;27574:6;27530:72;:::i;:::-;27612;27680:2;27669:9;27665:18;27656:6;27612:72;:::i;:::-;27694:73;27762:3;27751:9;27747:19;27738:6;27694:73;:::i;:::-;27322:452;;;;;;;;:::o;27780:222::-;27873:4;27911:2;27900:9;27896:18;27888:26;;27924:71;27992:1;27981:9;27977:17;27968:6;27924:71;:::i;:::-;27878:124;;;;:::o;28008:132::-;28075:4;28098:3;28090:11;;28128:4;28123:3;28119:14;28111:22;;28080:60;;;:::o;28146:114::-;28213:6;28247:5;28241:12;28231:22;;28220:40;;;:::o;28266:99::-;28318:6;28352:5;28346:12;28336:22;;28325:40;;;:::o;28371:113::-;28441:4;28473;28468:3;28464:14;28456:22;;28446:38;;;:::o;28490:184::-;28589:11;28623:6;28618:3;28611:19;28663:4;28658:3;28654:14;28639:29;;28601:73;;;;:::o;28680:169::-;28764:11;28798:6;28793:3;28786:19;28838:4;28833:3;28829:14;28814:29;;28776:73;;;;:::o;28855:305::-;28895:3;28914:20;28932:1;28914:20;:::i;:::-;28909:25;;28948:20;28966:1;28948:20;:::i;:::-;28943:25;;29102:1;29034:66;29030:74;29027:1;29024:81;29021:2;;;29108:18;;:::i;:::-;29021:2;29152:1;29149;29145:9;29138:16;;28899:261;;;;:::o;29166:185::-;29206:1;29223:20;29241:1;29223:20;:::i;:::-;29218:25;;29257:20;29275:1;29257:20;:::i;:::-;29252:25;;29296:1;29286:2;;29301:18;;:::i;:::-;29286:2;29343:1;29340;29336:9;29331:14;;29208:143;;;;:::o;29357:348::-;29397:7;29420:20;29438:1;29420:20;:::i;:::-;29415:25;;29454:20;29472:1;29454:20;:::i;:::-;29449:25;;29642:1;29574:66;29570:74;29567:1;29564:81;29559:1;29552:9;29545:17;29541:105;29538:2;;;29649:18;;:::i;:::-;29538:2;29697:1;29694;29690:9;29679:20;;29405:300;;;;:::o;29711:191::-;29751:4;29771:20;29789:1;29771:20;:::i;:::-;29766:25;;29805:20;29823:1;29805:20;:::i;:::-;29800:25;;29844:1;29841;29838:8;29835:2;;;29849:18;;:::i;:::-;29835:2;29894:1;29891;29887:9;29879:17;;29756:146;;;;:::o;29908:96::-;29945:7;29974:24;29992:5;29974:24;:::i;:::-;29963:35;;29953:51;;;:::o;30010:90::-;30044:7;30087:5;30080:13;30073:21;30062:32;;30052:48;;;:::o;30106:149::-;30142:7;30182:66;30175:5;30171:78;30160:89;;30150:105;;;:::o;30261:111::-;30313:7;30342:24;30360:5;30342:24;:::i;:::-;30331:35;;30321:51;;;:::o;30378:126::-;30415:7;30455:42;30448:5;30444:54;30433:65;;30423:81;;;:::o;30510:91::-;30546:7;30586:8;30579:5;30575:20;30564:31;;30554:47;;;:::o;30607:77::-;30644:7;30673:5;30662:16;;30652:32;;;:::o;30690:156::-;30755:9;30788:52;30834:5;30788:52;:::i;:::-;30775:65;;30765:81;;;:::o;30852:128::-;30917:9;30950:24;30968:5;30950:24;:::i;:::-;30937:37;;30927:53;;;:::o;30986:307::-;31054:1;31064:113;31078:6;31075:1;31072:13;31064:113;;;31163:1;31158:3;31154:11;31148:18;31144:1;31139:3;31135:11;31128:39;31100:2;31097:1;31093:10;31088:15;;31064:113;;;31195:6;31192:1;31189:13;31186:2;;;31275:1;31266:6;31261:3;31257:16;31250:27;31186:2;31035:258;;;;:::o;31299:171::-;31338:3;31361:24;31379:5;31361:24;:::i;:::-;31352:33;;31407:4;31400:5;31397:15;31394:2;;;31415:18;;:::i;:::-;31394:2;31462:1;31455:5;31451:13;31444:20;;31342:128;;;:::o;31476:320::-;31520:6;31557:1;31551:4;31547:12;31537:22;;31604:1;31598:4;31594:12;31625:18;31615:2;;31681:4;31673:6;31669:17;31659:27;;31615:2;31743;31735:6;31732:14;31712:18;31709:38;31706:2;;;31762:18;;:::i;:::-;31706:2;31527:269;;;;:::o;31802:233::-;31841:3;31864:24;31882:5;31864:24;:::i;:::-;31855:33;;31910:66;31903:5;31900:77;31897:2;;;31980:18;;:::i;:::-;31897:2;32027:1;32020:5;32016:13;32009:20;;31845:190;;;:::o;32041:180::-;32089:77;32086:1;32079:88;32186:4;32183:1;32176:15;32210:4;32207:1;32200:15;32227:180;32275:77;32272:1;32265:88;32372:4;32369:1;32362:15;32396:4;32393:1;32386:15;32413:180;32461:77;32458:1;32451:88;32558:4;32555:1;32548:15;32582:4;32579:1;32572:15;32599:102;32640:6;32691:2;32687:7;32682:2;32675:5;32671:14;32667:28;32657:38;;32647:54;;;:::o;32707:166::-;32847:18;32843:1;32835:6;32831:14;32824:42;32813:60;:::o;32879:162::-;33019:14;33015:1;33007:6;33003:14;32996:38;32985:56;:::o;33047:225::-;33187:34;33183:1;33175:6;33171:14;33164:58;33256:8;33251:2;33243:6;33239:15;33232:33;33153:119;:::o;33278:227::-;33418:34;33414:1;33406:6;33402:14;33395:58;33487:10;33482:2;33474:6;33470:15;33463:35;33384:121;:::o;33511:221::-;33651:34;33647:1;33639:6;33635:14;33628:58;33720:4;33715:2;33707:6;33703:15;33696:29;33617:115;:::o;33738:166::-;33878:18;33874:1;33866:6;33862:14;33855:42;33844:60;:::o;33910:169::-;34050:21;34046:1;34038:6;34034:14;34027:45;34016:63;:::o;34085:171::-;34225:23;34221:1;34213:6;34209:14;34202:47;34191:65;:::o;34262:171::-;34402:23;34398:1;34390:6;34386:14;34379:47;34368:65;:::o;34439:162::-;34579:14;34575:1;34567:6;34563:14;34556:38;34545:56;:::o;34607:169::-;34747:21;34743:1;34735:6;34731:14;34724:45;34713:63;:::o;34782:182::-;34922:34;34918:1;34910:6;34906:14;34899:58;34888:76;:::o;34970:181::-;35110:33;35106:1;35098:6;35094:14;35087:57;35076:75;:::o;35157:181::-;35297:33;35293:1;35285:6;35281:14;35274:57;35263:75;:::o;35344:176::-;35484:28;35480:1;35472:6;35468:14;35461:52;35450:70;:::o;35526:166::-;35666:18;35662:1;35654:6;35650:14;35643:42;35632:60;:::o;35698:167::-;35838:19;35834:1;35826:6;35822:14;35815:43;35804:61;:::o;35871:170::-;36011:22;36007:1;35999:6;35995:14;35988:46;35977:64;:::o;36047:223::-;36187:34;36183:1;36175:6;36171:14;36164:58;36256:6;36251:2;36243:6;36239:15;36232:31;36153:117;:::o;36276:122::-;36349:24;36367:5;36349:24;:::i;:::-;36342:5;36339:35;36329:2;;36388:1;36385;36378:12;36329:2;36319:79;:::o;36404:116::-;36474:21;36489:5;36474:21;:::i;:::-;36467:5;36464:32;36454:2;;36510:1;36507;36500:12;36454:2;36444:76;:::o;36526:152::-;36614:39;36647:5;36614:39;:::i;:::-;36607:5;36604:50;36594:2;;36668:1;36665;36658:12;36594:2;36584:94;:::o;36684:122::-;36757:24;36775:5;36757:24;:::i;:::-;36750:5;36747:35;36737:2;;36796:1;36793;36786:12;36737:2;36727:79;:::o
Swarm Source
ipfs://44e717ef1e08dadeaa09595ac1b14b4fc1dffcda20d5f60f859c0cfd8e4274bc
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.