More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Earn | 12105880 | 2 hrs ago | IN | 0 S | 0.04886794 | ||||
Earn | 12033599 | 10 hrs ago | IN | 0 S | 0.04527248 | ||||
Earn | 12032653 | 10 hrs ago | IN | 0 S | 0.10380936 | ||||
Earn | 12032645 | 10 hrs ago | IN | 0 S | 0.01295239 | ||||
Transfer | 12032383 | 10 hrs ago | IN | 20 S | 0.00121588 | ||||
Earn | 12030834 | 10 hrs ago | IN | 0 S | 0.01106407 | ||||
Set Main Paths | 12019147 | 11 hrs ago | IN | 0 S | 0.0123316 | ||||
Set Strategist | 12019085 | 11 hrs ago | IN | 0 S | 0.00159659 |
Latest 8 internal transactions
Loading...
Loading
Contract Name:
StrategySnake
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-03-06 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.12; // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } interface IStrategy { // Total want tokens managed by strategy function wantLockedTotal() external view returns (uint256); // Sum of all shares of users to wantLockedTotal function sharesTotal() external view returns (uint256); function wantAddress() external view returns (address); function token0Address() external view returns (address); function token1Address() external view returns (address); function earnedAddress() external view returns (address); function getPricePerFullShare() external view returns (uint256); // Main want token compounding function function earn() external; // Transfer want tokens autoFarm -> strategy function deposit(address _userAddress, uint256 _wantAmt) external returns (uint256); // Transfer want tokens strategy -> autoFarm function withdraw(address _userAddress, uint256 _wantAmt) external returns (uint256); function migrateFrom(address _oldStrategy, uint256 _oldWantLockedTotal, uint256 _oldSharesTotal) external; function inCaseTokensGetStuck(address _token, uint256 _amount) external; function inFarmBalance() external view returns (uint256); function totalBalance() external view returns (uint256); } interface IOracle { function update() external; function consult(address _token, uint256 _amountIn) external view returns (uint256 amountOut); function twap(address _token, uint256 _amountIn) external view returns (uint256 _amountOut); } interface IFarmChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingShare(uint256 _pid, address _user) external view returns (uint256); function pendingShareAndPendingRewards(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt); function harvest(uint256 _pid) external payable; function gsnakeOracle() external view returns (address); function pegStabilityModuleFeeEnabled() external view returns (bool); function pegStabilityModuleFee() external view returns (uint256); } interface IRouter { struct Route { address from; address to; bool stable; } function getAmountsOut(uint256 amountIn, Route[] memory routes) external view returns (uint256[] memory amounts); function addLiquidity( address tokenA, address tokenB, bool stable, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external; function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external; } contract StrategySnake is IStrategy, Ownable, ReentrancyGuard, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; address public farmContractAddress = address(0xe6E0A10eb298F0aC4170f2502cF7b201375BBc85); address public dexRouterAddress = address(0x1D368773735ee1E678950B7A97bcA2CafB330CDc); //Shadow uint256 public pid; address public override wantAddress; address public override token0Address; address public override token1Address; address public override earnedAddress; bool public stable; mapping(address => mapping(address => IRouter.Route[])) public tokenRoutes; address public constant WS = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); address public controller; address public strategist; address public timelock; uint256 public lastFeePaid = 0; uint256 public lastEarnTime = 0; uint256 public autoEarnLimit = 10 * 1e18; // 10 S uint256 public override wantLockedTotal = 0; uint256 public override sharesTotal = 0; uint256 public totalEarned = 0; uint256 public minSReserved = 100 * 1e18; //100 S reserved uint256 public adjustSlippageFee = 10; //1% uint256 public adjustSlippageFeeMax = 100; //10% uint256 public controllerFee = 50; //5% uint256 public constant controllerFeeMax = 100; // 10 = 1% uint256 public constant domination = 1000; address public treasuryAddress; event Deposit(uint256 amount); event Withdraw(uint256 amount); event Farm(uint256 amount); event Compound(address token0Address, uint256 token0Amt, address token1Address, uint256 token1Amt); event Earned(address earnedAddress, uint256 earnedAmt); event InCaseTokensGetStuck(address tokenAddress, uint256 tokenAmt, address receiver); event ExecuteTransaction(address indexed target, uint256 value, string signature, bytes data); event WithdrawS(address indexed user, uint256 amount); event Fees(uint256 collateralFee, uint256 collectedFee); constructor( address _controller, address _timelock, address _treasuryAddress, uint256 _pid, address _wantAddress, address _earnedAddress, address _token0, address _token1, bool _stable ) { controller = _controller; strategist = msg.sender; timelock = _timelock; treasuryAddress = _treasuryAddress; // to call earn if public not allowed wantAddress = _wantAddress; token0Address = _token0; token1Address = _token1; pid = _pid; earnedAddress = _earnedAddress; stable = _stable; } modifier onlyController() { require(controller == msg.sender, "caller is not the controller"); _; } modifier onlyStrategist() { require(strategist == msg.sender || owner() == msg.sender, "Strategy: caller is not the strategist"); _; } modifier onlyTimelock() { require(timelock == msg.sender, "Strategy: caller is not timelock"); _; } function isAuthorised(address _account) public view returns (bool) { return (_account == owner()) || (_account == strategist) || (_account == timelock); } function requiredSToHarvest() public view returns (uint256) { uint256 _pending = pendingHarvest(); bool pegStabilityModuleFeeEnabled = IFarmChef(farmContractAddress).pegStabilityModuleFeeEnabled(); if (pegStabilityModuleFeeEnabled) { IOracle oracle = IOracle(IFarmChef(farmContractAddress).gsnakeOracle()); // Calculate the required Sonic (S) amount to cover PSM fee (15% of pending reward value) uint256 currentGSNAKEPriceInSonic = oracle.twap(earnedAddress, 1e18); uint256 _pendingHarvestSValue = _pending.mul(currentGSNAKEPriceInSonic).div(1e18); uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); return _pendingHarvestSValue.mul(pegStabilityModuleFee + adjustSlippageFee).div(domination); } return 0; } function autoEarn() public onlyStrategist { uint256 _pendingHarvestSValue = pendingHarvestSValue(); require(_pendingHarvestSValue >= autoEarnLimit, "too small"); uint256 requiredS = requiredSToHarvest(); require(address(this).balance >= requiredS, "not enough S collateral"); earn(); } function inFarmBalance() public override view returns (uint256) { (uint256 amount,) = IFarmChef(farmContractAddress).userInfo(pid, address(this)); return amount; } function totalBalance() external override view returns (uint256) { return IERC20(wantAddress).balanceOf(address(this)) + inFarmBalance(); } function getPricePerFullShare() external override view returns (uint256) { return (sharesTotal == 0) ? 1e18 : wantLockedTotal.mul(1e18).div(sharesTotal); } function increaseAllowance(address token, address spender, uint256 addedValue) internal { // increase allowance IERC20(token).safeIncreaseAllowance(spender, addedValue); } // Receives new deposits from user function deposit(address, uint256 _wantAmt) external override onlyController nonReentrant whenNotPaused returns (uint256) { IERC20(wantAddress).safeTransferFrom(address(msg.sender), address(this), _wantAmt); uint256 sharesAdded = _wantAmt; if (wantLockedTotal > 0 && sharesTotal > 0) { sharesAdded = _wantAmt.mul(sharesTotal).div(wantLockedTotal); } sharesTotal = sharesTotal.add(sharesAdded); _farm(); emit Deposit(_wantAmt); return sharesAdded; } function farm() public onlyOwner { _farm(); } function harvestReward() public onlyOwner { _harvest(); } function compound() public onlyOwner { _compound(); } function payFees() public onlyOwner { _payFees(); } function _farm() internal { IERC20 _want = IERC20(wantAddress); uint256 wantAmt = _want.balanceOf(address(this)); wantLockedTotal = wantLockedTotal.add(wantAmt); if (wantAmt > 0) { increaseAllowance(wantAddress, farmContractAddress, wantAmt); IFarmChef(farmContractAddress).deposit(pid, wantAmt); emit Farm(wantAmt); } } function withdraw(address, uint256 _wantAmt) external override onlyController nonReentrant returns (uint256) { require(_wantAmt > 0, "Strategy: !_wantAmt"); IFarmChef(farmContractAddress).withdraw(pid, _wantAmt); uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); if (_wantAmt > wantAmt) { _wantAmt = wantAmt; } if (wantLockedTotal < _wantAmt) { _wantAmt = wantLockedTotal; } uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); wantLockedTotal = wantLockedTotal.sub(_wantAmt); IERC20(wantAddress).safeTransfer(address(msg.sender), _wantAmt); emit Withdraw(_wantAmt); return sharesRemoved; } function _harvest() internal { uint256 sBalanceBefore = address(this).balance; // Harvest farm tokens // Get pending rewards from farm contract uint256 pendingReward = IFarmChef(farmContractAddress).pendingShareAndPendingRewards(pid, address(this)); bool pegStabilityModuleFeeEnabled = IFarmChef(farmContractAddress).pegStabilityModuleFeeEnabled(); uint256 amountSonicToPay = 0; if (pegStabilityModuleFeeEnabled) { uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); IOracle oracle = IOracle(IFarmChef(farmContractAddress).gsnakeOracle()); // Calculate the required Sonic (S) amount to cover PSM fee (15% of pending reward value) uint256 currentGSNAKEPriceInSonic = oracle.twap(earnedAddress, 1e18); require(currentGSNAKEPriceInSonic > 0, "Oracle price error"); //add 1% to make sure enough Sonic to cover fee amountSonicToPay = (currentGSNAKEPriceInSonic.mul(pendingReward).div(1e18)).mul(pegStabilityModuleFee + adjustSlippageFee).div(domination); } require(sBalanceBefore >= amountSonicToPay, "Not enough sonic collateral"); // Harvest farm rewards before compounding, sending required Sonic (S) IFarmChef(farmContractAddress).harvest{value: amountSonicToPay}(pid); lastFeePaid = sBalanceBefore - address(this).balance; } function _payFees() internal { uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); if (earnedAmount <= 0) { return; } emit Earned(earnedAddress, earnedAmount); uint256 estimateEarnedInS = exchangeRate(earnedAddress, WS, earnedAmount); if (estimateEarnedInS <= 0) { return; } uint256 percentEarnedNeedToSwapForFees = controllerFee; if (lastFeePaid > 0) { percentEarnedNeedToSwapForFees += (lastFeePaid.mul(domination).div(estimateEarnedInS)) + adjustSlippageFee; } _swapTokenToS(earnedAddress, earnedAmount.mul(percentEarnedNeedToSwapForFees).div(domination), address(this)); uint256 sBalance = address(this).balance; uint256 collectedFee = 0; if (sBalance > minSReserved) { collectedFee = sBalance - minSReserved; (bool success, ) = payable(treasuryAddress).call{value: collectedFee}(""); require(success, "transfer fee failed!"); } emit Fees(lastFeePaid, collectedFee); } function _compound() internal { //1. Convert earned token into want token uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); // track totalEarned in S totalEarned = totalEarned.add(exchangeRate(earnedAddress, WS, earnedAmount)); if (earnedAddress != token0Address) { _swapTokenToToken(earnedAddress, token0Address, earnedAmount.div(2), address(this)); } if (earnedAddress != token1Address) { _swapTokenToToken(earnedAddress, token1Address, earnedAmount.div(2), address(this)); } // Get want tokens, ie. add liquidity uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { _addLiquidity(token0Address, token1Address, stable, token0Amt, token1Amt); emit Compound(token0Address, token0Amt, token1Address, token1Amt); } } // 1. Harvest farm tokens // 2. Converts farm tokens into want tokens // 3. Deposits want tokens function earn() public override whenNotPaused onlyStrategist { _harvest(); _payFees(); _compound(); _farm(); lastEarnTime = block.timestamp; } function exchangeRate(address _inputToken, address _outputToken, uint256 _tokenAmount) public view returns (uint256) { uint256[] memory amounts = IRouter(dexRouterAddress).getAmountsOut(_tokenAmount, tokenRoutes[_inputToken][_outputToken]); return amounts[amounts.length - 1]; } function pendingHarvest() public view returns (uint256) { uint256 _earnedBal = IERC20(earnedAddress).balanceOf(address(this)); return IFarmChef(farmContractAddress).pendingShareAndPendingRewards(pid, address(this)).add(_earnedBal); } function pendingHarvestSValue() public view returns (uint256) { uint256 _pending = pendingHarvest(); return (_pending == 0) ? 0 : exchangeRate(earnedAddress, WS, _pending); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setStrategist(address _strategist) external onlyOwner { strategist = _strategist; } function setMinSReserved(uint256 _minSReserved) external onlyOwner { minSReserved = _minSReserved; } function setFees(uint256 _controllerFee, uint256 _adjustSlippageFee) external onlyOwner { require(_controllerFee <= controllerFeeMax, "Strategy: value too high"); controllerFee = _controllerFee; require(adjustSlippageFee <= adjustSlippageFeeMax, "Strategy: value too high"); adjustSlippageFee = _adjustSlippageFee; } function setTreasuryAddress(address _treasuryAddress) external onlyOwner { require(_treasuryAddress != address(0), "zero"); treasuryAddress = _treasuryAddress; } function setDexRouterAddress(address _routerAddress) external onlyOwner { require(_routerAddress != address(0), "zero"); dexRouterAddress = _routerAddress; } function setAutoEarnLimit(uint256 _autoEarnLimit) external onlyOwner { autoEarnLimit = _autoEarnLimit; } function setMainPaths( IRouter.Route[] memory _earnedToToken0Path, IRouter.Route[] memory _earnedToToken1Path, IRouter.Route[] memory _earnedToWSPath ) external onlyOwner { setTokenRoute(earnedAddress, token0Address, _earnedToToken0Path); setTokenRoute(earnedAddress, token1Address, _earnedToToken1Path); setTokenRoute(earnedAddress, WS, _earnedToWSPath); } function setTokenRoute( address from, address to, IRouter.Route[] memory routes ) public onlyOwner { delete tokenRoutes[from][to]; for (uint256 i = 0; i < routes.length; i++) { tokenRoutes[from][to].push(routes[i]); } } function _swapTokenToS(address _inputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != WS) { IRouter(dexRouterAddress).swapExactTokensForETH(_amount, 0, tokenRoutes[_inputToken][WS], to, block.timestamp.add(1800)); } } function _swapTokenToToken(address _inputToken, address _outputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != _outputToken) { IRouter(dexRouterAddress).swapExactTokensForTokens(_amount, 0, tokenRoutes[_inputToken][_outputToken], to, block.timestamp.add(1800)); } } function _addLiquidity(address _tokenA, address _tokenB, bool _stable, uint256 _amountADesired, uint256 _amountBDesired) internal { increaseAllowance(_tokenA, dexRouterAddress, _amountADesired); increaseAllowance(_tokenB, dexRouterAddress, _amountBDesired); IRouter(dexRouterAddress).addLiquidity(_tokenA, _tokenB, _stable, _amountADesired, _amountBDesired, 0, 0, address(this), block.timestamp.add(1800)); } receive() external payable { } fallback() external payable { } function withdrawS(uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than zero"); require(address(this).balance >= amount, "Insufficient S balance in contract"); (bool success, ) = payable(treasuryAddress).call{value: amount}(""); require(success, "Withdraw failed"); emit WithdrawS(msg.sender, amount); } function inCaseTokensGetStuck(address _token, uint256 _amount) external override onlyOwner { require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); address _controller = controller; IERC20(_token).safeTransfer(_controller, _amount); emit InCaseTokensGetStuck(_token, _amount, _controller); } function togglePause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function migrateFrom(address, uint256, uint256) external override onlyController { } /* ========== EMERGENCY ========== */ function setController(address _controller) external { require(_controller != address(0), "invalidAddress"); require(controller == msg.sender || timelock == msg.sender, "caller is not the controller nor timelock"); controller = _controller; } function setTimelock(address _timelock) external { require(timelock == msg.sender || (timelock == address(0) && owner() == msg.sender), "!timelock"); timelock = _timelock; } /** * @dev This is from Timelock contract. */ function executeTransaction(address target, uint256 value, string memory signature, bytes memory data) external onlyTimelock returns (bytes memory) { bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, "Strategy::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(target, value, signature, data); return returnData; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_earnedAddress","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"bool","name":"_stable","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token0Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amt","type":"uint256"},{"indexed":false,"internalType":"address","name":"token1Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token1Amt","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnedAmt","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Farm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"collateralFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collectedFee","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"InCaseTokensGetStuck","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawS","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoEarn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoEarnLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dexRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"domination","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earnedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inFarmBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAuthorised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFeePaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migrateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minSReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestSValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredSToHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoEarnLimit","type":"uint256"}],"name":"setAutoEarnLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setDexRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controllerFee","type":"uint256"},{"internalType":"uint256","name":"_adjustSlippageFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToToken0Path","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToToken1Path","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"_earnedToWSPath","type":"tuple[]"}],"name":"setMainPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minSReserved","type":"uint256"}],"name":"setMinSReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IRouter.Route[]","name":"routes","type":"tuple[]"}],"name":"setTokenRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRoutes","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526002805474e6e0a10eb298f0ac4170f2502cf7b201375bbc8500610100600160a81b0319909116179055600380546001600160a01b031916731d368773735ee1e678950b7a97bca2cafb330cdc1790556000600d819055600e819055678ac7230489e80000600f556010819055601181905560125568056bc75e2d63100000601355600a60145560646015556032601655348015620000a257600080fd5b5060405162003dce38038062003dce833981016040819052620000c591620001f5565b620000d03362000188565b600180556002805460ff19169055600a80546001600160a01b03199081166001600160a01b039b8c1617909155600b805433908316179055600c80548216998b1699909917909855601780548916978a169790971790965560058054881694891694909417909355600680548716918816919091179055600780549095169186169190911790935560045560088054929093166001600160a81b031990921691909117600160a01b91151591909102179055620002af565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001f057600080fd5b919050565b60008060008060008060008060006101208a8c0312156200021557600080fd5b620002208a620001d8565b98506200023060208b01620001d8565b97506200024060408b01620001d8565b965060608a015195506200025760808b01620001d8565b94506200026760a08b01620001d8565b93506200027760c08b01620001d8565b92506200028760e08b01620001d8565b91506101008a015180151581146200029e57600080fd5b809150509295985092959850929598565b613b0f80620002bf6000396000f3fe60806040526004361061038c5760003560e01c806385f02dd6116101da578063c7b9d53011610101578063e77601b91161009a578063f2fde38b1161006c578063f2fde38b14610a41578063f3fef3a314610a61578063f69e204614610a81578063f77c479114610a9657005b8063e77601b9146109d5578063e7a03679146109eb578063e7f67fb114610a0b578063f106845414610a2b57005b8063d7cb416f116100d3578063d7cb416f1461096b578063db7a3c0f1461098b578063e68b5364146109a0578063e7198474146109b557005b8063c7b9d530146108ce578063cfc2b550146108ee578063d33219b414610936578063d389800f1461095657005b8063ae33569511610173578063c0762e5e11610145578063c0762e5e14610859578063c4ae316814610879578063c5f956af1461088e578063c6d758cb146108ae57005b8063ae335695146107f9578063ba0c108f1461080e578063bb97517e14610824578063bdacb3031461083957005b8063a0fab119116101ac578063a0fab119146107a2578063a84fd93f146107b8578063a9ad8422146107ce578063ad7a672f146107e457005b806385f02dd6146107295780638da5cb5b1461073f57806392eefe9b1461075d5780639fc33a9f1461077d57005b8063593eda62116102be5780636978d92711610257578063715018a611610229578063715018a6146106ca57806377c7b8fc146106df5780637ff36fbe146106f45780638456cb591461071457005b80636978d9271461065e5780636dfa8d9914610674578063701f66041461068a57806370a3cb11146106aa57005b80635d409359116102905780635d409359146105ec57806362779e15146106145780636605bfda1461062957806367d03db81461064957005b8063593eda62146105895780635a34928e146105a95780635afbbaab146105be5780635c975abb146105d457005b806325d5f7331161033057806342da4eb31161030257806342da4eb31461051d57806344a3955e1461053357806347e7ef241461054957806351b699cd1461056957005b806325d5f733146104b05780632717eff3146104d057806336e9332d146104f35780633f4ba83a1461050857005b8063202a034c11610369578063202a034c146104125780632224fa251461043257806322be3de11461045f57806325baef531461049057005b80630b78f9c0146103955780631a2315b8146103b55780631fe4a686146103d557005b3661039357005b005b3480156103a157600080fd5b506103936103b0366004613286565b610ab6565b3480156103c157600080fd5b506103936103d03660046132a8565b610b69565b3480156103e157600080fd5b50600b546103f5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041e57600080fd5b5061039361042d36600461342c565b610cea565b34801561043e57600080fd5b5061045261044d3660046134e6565b610def565b60405161040991906135e9565b34801561046b57600080fd5b5060085461048090600160a01b900460ff1681565b6040519015158152602001610409565b34801561049c57600080fd5b506103936104ab3660046135fc565b610fb3565b3480156104bc57600080fd5b506103936104cb366004613631565b610fe2565b3480156104dc57600080fd5b506104e5606481565b604051908152602001610409565b3480156104ff57600080fd5b5061039361104f565b34801561051457600080fd5b50610393611061565b34801561052957600080fd5b506104e560105481565b34801561053f57600080fd5b506104e560115481565b34801561055557600080fd5b506104e56105643660046136af565b611071565b34801561057557600080fd5b506104806105843660046136db565b611160565b34801561059557600080fd5b506103936105a43660046132a8565b6111a5565b3480156105b557600080fd5b506103936111b2565b3480156105ca57600080fd5b506104e560145481565b3480156105e057600080fd5b5060025460ff16610480565b3480156105f857600080fd5b506103f573039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b34801561062057600080fd5b506103936111c2565b34801561063557600080fd5b506103936106443660046136db565b6111d2565b34801561065557600080fd5b506104e561123b565b34801561066a57600080fd5b506104e560135481565b34801561068057600080fd5b506104e560125481565b34801561069657600080fd5b506104e56106a53660046136f8565b611287565b3480156106b657600080fd5b506103936106c53660046132a8565b611350565b3480156106d657600080fd5b5061039361135d565b3480156106eb57600080fd5b506104e561136f565b34801561070057600080fd5b506006546103f5906001600160a01b031681565b34801561072057600080fd5b506103936113b0565b34801561073557600080fd5b506104e560165481565b34801561074b57600080fd5b506000546001600160a01b03166103f5565b34801561076957600080fd5b506103936107783660046136db565b6113c0565b34801561078957600080fd5b506002546103f59061010090046001600160a01b031681565b3480156107ae57600080fd5b506104e5600f5481565b3480156107c457600080fd5b506104e560155481565b3480156107da57600080fd5b506104e56103e881565b3480156107f057600080fd5b506104e56114aa565b34801561080557600080fd5b5061039361152a565b34801561081a57600080fd5b506104e5600e5481565b34801561083057600080fd5b506104e561162a565b34801561084557600080fd5b506103936108543660046136db565b6116ad565b34801561086557600080fd5b506103936108743660046136db565b61174d565b34801561088557600080fd5b506103936117b6565b34801561089a57600080fd5b506017546103f5906001600160a01b031681565b3480156108ba57600080fd5b506103936108c93660046136af565b6117d1565b3480156108da57600080fd5b506103936108e93660046136db565b6118d5565b3480156108fa57600080fd5b5061090e6109093660046136f8565b6118ff565b604080516001600160a01b039485168152939092166020840152151590820152606001610409565b34801561094257600080fd5b50600c546103f5906001600160a01b031681565b34801561096257600080fd5b50610393611960565b34801561097757600080fd5b506007546103f5906001600160a01b031681565b34801561099757600080fd5b506104e56119dc565b3480156109ac57600080fd5b506104e5611ad3565b3480156109c157600080fd5b506008546103f5906001600160a01b031681565b3480156109e157600080fd5b506104e5600d5481565b3480156109f757600080fd5b506005546103f5906001600160a01b031681565b348015610a1757600080fd5b506003546103f5906001600160a01b031681565b348015610a3757600080fd5b506104e560045481565b348015610a4d57600080fd5b50610393610a5c3660046136db565b611d25565b348015610a6d57600080fd5b506104e5610a7c3660046136af565b611d9e565b348015610a8d57600080fd5b50610393611fb4565b348015610aa257600080fd5b50600a546103f5906001600160a01b031681565b610abe611fc4565b6064821115610b0f5760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b60448201526064015b60405180910390fd5b60168290556015546014541115610b635760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b6044820152606401610b06565b60145550565b610b71611fc4565b60008111610bc15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610b06565b80471015610c1c5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610b06565b6017546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610c69576040519150601f19603f3d011682016040523d82523d6000602084013e610c6e565b606091505b5050905080610cb15760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610b06565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b610cf2611fc4565b6001600160a01b0380841660009081526009602090815260408083209386168352929052908120610d2291613235565b60005b8151811015610de9576001600160a01b0380851660009081526009602090815260408083209387168352929052208251839083908110610d6757610d67613739565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0392831617815592820151929093018054604090920151929093166001600160a81b031990911617600160a01b9115159190910217905580610de181613765565b915050610d25565b50505050565b600c546060906001600160a01b03163314610e4c5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610b06565b6060835160001415610e5f575081610e8b565b838051906020012083604051602001610e79929190613780565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610ea791906137b1565b60006040518083038185875af1925050503d8060008114610ee4576040519150601f19603f3d011682016040523d82523d6000602084013e610ee9565b606091505b509150915081610f615760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610b06565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610f9e939291906137cd565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610fdd5760405162461bcd60e51b8152600401610b0690613802565b505050565b610fea611fc4565b600854600654611007916001600160a01b03908116911685610cea565b600854600754611024916001600160a01b03908116911684610cea565b600854610fdd906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610cea565b611057611fc4565b61105f61201e565b565b611069611fc4565b61105f612171565b600a546000906001600160a01b0316331461109e5760405162461bcd60e51b8152600401610b0690613802565b6110a66121c3565b6110ae61221d565b6005546110c6906001600160a01b0316333085612263565b6010548290158015906110db57506000601154115b15611104576111016010546110fb601154866122ce90919063ffffffff16565b906122e1565b90505b60115461111190826122ed565b60115561111c61201e565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061115a60018055565b92915050565b600080546001600160a01b038381169116148061118a5750600b546001600160a01b038381169116145b8061115a575050600c546001600160a01b0390811691161490565b6111ad611fc4565b601355565b6111ba611fc4565b61105f6122f9565b6111ca611fc4565b61105f6126bb565b6111da611fc4565b6001600160a01b0381166112195760405162461bcd60e51b8152600401610b06906020808252600490820152637a65726f60e01b604082015260600190565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806112466119dc565b9050801561127e57600854611279906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883611287565b611281565b60005b91505090565b6003546001600160a01b038481166000908152600960209081526040808320878516845290915280822090516326207f2d60e21b8152919384931691639881fcb4916112d8918791906004016138a3565b600060405180830381865afa1580156112f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261131d91908101906138bc565b9050806001825161132e9190613942565b8151811061133e5761133e613739565b60200260200101519150509392505050565b611358611fc4565b600f55565b611365611fc4565b61105f600061291d565b60006011546000146113a35761139e6011546110fb670de0b6b3a76400006010546122ce90919063ffffffff16565b905090565b50670de0b6b3a764000090565b6113b8611fc4565b61105f61296d565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610b06565b600a546001600160a01b031633148061142a5750600c546001600160a01b031633145b6114885760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610b06565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006114b461162a565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613959565b61139e9190613972565b600b546001600160a01b031633148061155c5750336115516000546001600160a01b031690565b6001600160a01b0316145b6115785760405162461bcd60e51b8152600401610b069061398a565b600061158261123b565b9050600f548110156115c25760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610b06565b60006115cc611ad3565b90508047101561161e5760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610b06565b611626611960565b5050565b600254600480546040516393f1a40b60e01b81529182015230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a691906139d0565b5092915050565b600c546001600160a01b03163314806116f35750600c546001600160a01b03161580156116f35750336116e86000546001600160a01b031690565b6001600160a01b0316145b61172b5760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610b06565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611755611fc4565b6001600160a01b0381166117945760405162461bcd60e51b8152600401610b06906020808252600490820152637a65726f60e01b604082015260600190565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6117be611fc4565b60025460ff16156113b85761105f612171565b6117d9611fc4565b6008546001600160a01b038381169116141561181f5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610b06565b6005546001600160a01b03838116911614156118655760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610b06565b600a546001600160a01b039081169061188190841682846129aa565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b6118dd611fc4565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061192757600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821694509081169250600160a01b900460ff16905083565b61196861221d565b600b546001600160a01b031633148061199a57503361198f6000546001600160a01b031690565b6001600160a01b0316145b6119b65760405162461bcd60e51b8152600401610b069061398a565b6119be6122f9565b6119c66126bb565b6119ce6129da565b6119d661201e565b42600e55565b6008546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d9190613959565b60025460048054604051636b2681c560e01b81529182015230602482015291925061128191839161010090046001600160a01b031690636b2681c590604401602060405180830381865afa158015611aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acd9190613959565b906122ed565b600080611ade6119dc565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663717478026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906139f4565b90508015611d1c576000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda9190613a11565b600854604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190613959565b90506000611c76670de0b6b3a76400006110fb87856122ce565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190613959565b9050611d116103e86110fb60145484611d0a9190613972565b85906122ce565b965050505050505090565b60009250505090565b611d2d611fc4565b6001600160a01b038116611d925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b06565b611d9b8161291d565b50565b600a546000906001600160a01b03163314611dcb5760405162461bcd60e51b8152600401610b0690613802565b611dd36121c3565b60008211611e195760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610b06565b60025460048054604051630441a3e760e41b815291820152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611e6b57600080fd5b505af1158015611e7f573d6000803e3d6000fd5b50506005546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef29190613959565b905080831115611f00578092505b826010541015611f105760105492505b6000611f2d6010546110fb601154876122ce90919063ffffffff16565b9050601154811115611f3e57506011545b601154611f4b9082612c78565b601155601054611f5b9085612c78565b601055600554611f75906001600160a01b031633866129aa565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061115a60018055565b611fbc611fc4565b61105f6129da565b6000546001600160a01b0316331461105f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6005546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f9190613959565b60105490915061209f90826122ed565b6010558015611626576005546002546120ca916001600160a01b039081169161010090041683612c84565b60025460048054604051631c57762b60e31b815291820152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561211c57600080fd5b505af1158015612130573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f8160405161216591815260200190565b60405180910390a15050565b612179612c98565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156122165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b6002600155565b60025460ff161561105f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b06565b6040516001600160a01b0380851660248301528316604482015260648101829052610de99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ce1565b60006122da8284613a2e565b9392505050565b60006122da8284613a4d565b60006122da8284613972565b60025460048054604051636b2681c560e01b81529182015230602482015247916000916101009091046001600160a01b031690636b2681c590604401602060405180830381865afa158015612352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123769190613959565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663717478026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f191906139f4565b9050600081156125f1576000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124749190613959565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190613a11565b600854604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa15801561254d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125719190613959565b9050600081116125b85760405162461bcd60e51b815260206004820152601260248201527127b930b1b63290383934b1b29032b93937b960711b6044820152606401610b06565b6125eb6103e86110fb601454866125cf9190613972565b6125e5670de0b6b3a76400006110fb878d6122ce565b906122ce565b93505050505b808410156126415760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820736f6e696320636f6c6c61746572616c00000000006044820152606401610b06565b60025460048054604051636ee3193160e11b8152918201526101009091046001600160a01b03169063ddc632629083906024016000604051808303818588803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050505047846126b29190613942565b600d5550505050565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127289190613959565b9050600081116127355750565b600854604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16008546000906127a9906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611287565b9050600081116127b7575050565b601654600d54156127f7576014546127e0836110fb6103e8600d546122ce90919063ffffffff16565b6127ea9190613972565b6127f49082613972565b90505b60085461281d906001600160a01b03166128176103e86110fb87866122ce565b30612db6565b60135447906000908211156128da576013546128399083613942565b6017546040519192506000916001600160a01b039091169083908381818185875af1925050503d806000811461288b576040519150601f19603f3d011682016040523d82523d6000602084013e612890565b606091505b50509050806128d85760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610b06565b505b600d5460408051918252602082018390527f2cc59d6e1281c9f122c4f6930ae083db22762e74c7aacbfeded26fcbb367936b910160405180910390a15050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61297561221d565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121a63390565b6040516001600160a01b038316602482015260448101829052610fdd90849063a9059cbb60e01b90606401612297565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a479190613959565b600854909150612a8290612a79906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611287565b601254906122ed565b6012556006546008546001600160a01b03908116911614612ac557600854600654612ac5916001600160a01b039081169116612abf8460026122e1565b30612e9f565b6007546008546001600160a01b03908116911614612aff57600854600754612aff916001600160a01b039081169116612abf8460026122e1565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6c9190613959565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613959565b9050600082118015612bf05750600081115b15610fdd57600654600754600854612c21926001600160a01b03908116921690600160a01b900460ff168585612f6c565b600654600754604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f906080016118c8565b60006122da8284613942565b610fdd6001600160a01b0384168383613068565b60025460ff1661105f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b06565b6000612d36826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131159092919063ffffffff16565b9050805160001480612d57575080806020019051810190612d5791906139f4565b610fdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b06565b600354612dce9084906001600160a01b031684612c84565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610fdd576003546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452909152812091909216916318a130869185919085612e48426107086122ed565b6040518663ffffffff1660e01b8152600401612e68959493929190613a6f565b600060405180830381600087803b158015612e8257600080fd5b505af1158015612e96573d6000803e3d6000fd5b50505050505050565b600354612eb79085906001600160a01b031684612c84565b826001600160a01b0316846001600160a01b031614610de9576003546001600160a01b03858116600090815260096020908152604080832088851684529091528120919092169163f41766d89185919085612f14426107086122ed565b6040518663ffffffff1660e01b8152600401612f34959493929190613a6f565b600060405180830381600087803b158015612f4e57600080fd5b505af1158015612f62573d6000803e3d6000fd5b5050505050505050565b600354612f849086906001600160a01b031684612c84565b600354612f9c9085906001600160a01b031683612c84565b6003546001600160a01b0316635a47ddc3868686868660008030612fc2426107086122ed565b60405160e08b901b6001600160e01b03191681526001600160a01b03998a166004820152978916602489015295151560448801526064870194909452608486019290925260a485015260c484015290921660e4820152610104810191909152610124016060604051808303816000875af1158015613044573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f629190613aab565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156130b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130dc9190613959565b9050610de98463095ea7b360e01b856130f58686613972565b6040516001600160a01b0390921660248301526044820152606401612297565b6060610fab848460008585600080866001600160a01b0316858760405161313c91906137b1565b60006040518083038185875af1925050503d8060008114613179576040519150601f19603f3d011682016040523d82523d6000602084013e61317e565b606091505b509150915061318f8783838761319a565b979650505050505050565b606083156132065782516131ff576001600160a01b0385163b6131ff5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b06565b5081610fab565b610fab838381511561321b5781518083602001fd5b8060405162461bcd60e51b8152600401610b0691906135e9565b5080546000825560020290600052602060002090810190611d9b91905b808211156132825780546001600160a01b03191681556001810180546001600160a81b0319169055600201613252565b5090565b6000806040838503121561329957600080fd5b50508035926020909101359150565b6000602082840312156132ba57600080fd5b5035919050565b6001600160a01b0381168114611d9b57600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561330f5761330f6132d6565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561333e5761333e6132d6565b604052919050565b600067ffffffffffffffff821115613360576133606132d6565b5060051b60200190565b8015158114611d9b57600080fd5b600082601f83011261338957600080fd5b8135602061339e61339983613346565b613315565b828152606092830285018201928282019190878511156133bd57600080fd5b8387015b8581101561341f5781818a0312156133d95760008081fd5b6133e16132ec565b81356133ec816132c1565b8152818601356133fb816132c1565b8187015260408281013561340e8161336a565b9082015284529284019281016133c1565b5090979650505050505050565b60008060006060848603121561344157600080fd5b833561344c816132c1565b9250602084013561345c816132c1565b9150604084013567ffffffffffffffff81111561347857600080fd5b61348486828701613378565b9150509250925092565b600067ffffffffffffffff8311156134a8576134a86132d6565b6134bb601f8401601f1916602001613315565b90508281528383830111156134cf57600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156134fc57600080fd5b8435613507816132c1565b935060208501359250604085013567ffffffffffffffff8082111561352b57600080fd5b818701915087601f83011261353f57600080fd5b61354e8883356020850161348e565b9350606087013591508082111561356457600080fd5b508501601f8101871361357657600080fd5b6135858782356020840161348e565b91505092959194509250565b60005b838110156135ac578181015183820152602001613594565b83811115610de95750506000910152565b600081518084526135d5816020860160208601613591565b601f01601f19169290920160200192915050565b6020815260006122da60208301846135bd565b60008060006060848603121561361157600080fd5b833561361c816132c1565b95602085013595506040909401359392505050565b60008060006060848603121561364657600080fd5b833567ffffffffffffffff8082111561365e57600080fd5b61366a87838801613378565b9450602086013591508082111561368057600080fd5b61368c87838801613378565b935060408601359150808211156136a257600080fd5b5061348486828701613378565b600080604083850312156136c257600080fd5b82356136cd816132c1565b946020939093013593505050565b6000602082840312156136ed57600080fd5b81356122da816132c1565b60008060006060848603121561370d57600080fd5b8335613718816132c1565b92506020840135613728816132c1565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156137795761377961374f565b5060010190565b6001600160e01b03198316815281516000906137a3816004850160208701613591565b919091016004019392505050565b600082516137c3818460208701613591565b9190910192915050565b8381526060602082015260006137e660608301856135bd565b82810360408401526137f881856135bd565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156138985781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff161515604089015260609097019660029092019101613852565b509495945050505050565b828152604060208201526000610fab6040830184613839565b600060208083850312156138cf57600080fd5b825167ffffffffffffffff8111156138e657600080fd5b8301601f810185136138f757600080fd5b805161390561339982613346565b81815260059190911b8201830190838101908783111561392457600080fd5b928401925b8284101561318f57835182529284019290840190613929565b6000828210156139545761395461374f565b500390565b60006020828403121561396b57600080fd5b5051919050565b600082198211156139855761398561374f565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b600080604083850312156139e357600080fd5b505080516020909101519092909150565b600060208284031215613a0657600080fd5b81516122da8161336a565b600060208284031215613a2357600080fd5b81516122da816132c1565b6000816000190483118215151615613a4857613a4861374f565b500290565b600082613a6a57634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a060408201526000613a8e60a0830186613839565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ac057600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122040f13427bf31105ffed69b7163ca19b9af9cfc969d3b81ccc555284ec947d64a64736f6c634300080c00330000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287c6882de298665977787e268f3dba052a6e251000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad380000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x60806040526004361061038c5760003560e01c806385f02dd6116101da578063c7b9d53011610101578063e77601b91161009a578063f2fde38b1161006c578063f2fde38b14610a41578063f3fef3a314610a61578063f69e204614610a81578063f77c479114610a9657005b8063e77601b9146109d5578063e7a03679146109eb578063e7f67fb114610a0b578063f106845414610a2b57005b8063d7cb416f116100d3578063d7cb416f1461096b578063db7a3c0f1461098b578063e68b5364146109a0578063e7198474146109b557005b8063c7b9d530146108ce578063cfc2b550146108ee578063d33219b414610936578063d389800f1461095657005b8063ae33569511610173578063c0762e5e11610145578063c0762e5e14610859578063c4ae316814610879578063c5f956af1461088e578063c6d758cb146108ae57005b8063ae335695146107f9578063ba0c108f1461080e578063bb97517e14610824578063bdacb3031461083957005b8063a0fab119116101ac578063a0fab119146107a2578063a84fd93f146107b8578063a9ad8422146107ce578063ad7a672f146107e457005b806385f02dd6146107295780638da5cb5b1461073f57806392eefe9b1461075d5780639fc33a9f1461077d57005b8063593eda62116102be5780636978d92711610257578063715018a611610229578063715018a6146106ca57806377c7b8fc146106df5780637ff36fbe146106f45780638456cb591461071457005b80636978d9271461065e5780636dfa8d9914610674578063701f66041461068a57806370a3cb11146106aa57005b80635d409359116102905780635d409359146105ec57806362779e15146106145780636605bfda1461062957806367d03db81461064957005b8063593eda62146105895780635a34928e146105a95780635afbbaab146105be5780635c975abb146105d457005b806325d5f7331161033057806342da4eb31161030257806342da4eb31461051d57806344a3955e1461053357806347e7ef241461054957806351b699cd1461056957005b806325d5f733146104b05780632717eff3146104d057806336e9332d146104f35780633f4ba83a1461050857005b8063202a034c11610369578063202a034c146104125780632224fa251461043257806322be3de11461045f57806325baef531461049057005b80630b78f9c0146103955780631a2315b8146103b55780631fe4a686146103d557005b3661039357005b005b3480156103a157600080fd5b506103936103b0366004613286565b610ab6565b3480156103c157600080fd5b506103936103d03660046132a8565b610b69565b3480156103e157600080fd5b50600b546103f5906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561041e57600080fd5b5061039361042d36600461342c565b610cea565b34801561043e57600080fd5b5061045261044d3660046134e6565b610def565b60405161040991906135e9565b34801561046b57600080fd5b5060085461048090600160a01b900460ff1681565b6040519015158152602001610409565b34801561049c57600080fd5b506103936104ab3660046135fc565b610fb3565b3480156104bc57600080fd5b506103936104cb366004613631565b610fe2565b3480156104dc57600080fd5b506104e5606481565b604051908152602001610409565b3480156104ff57600080fd5b5061039361104f565b34801561051457600080fd5b50610393611061565b34801561052957600080fd5b506104e560105481565b34801561053f57600080fd5b506104e560115481565b34801561055557600080fd5b506104e56105643660046136af565b611071565b34801561057557600080fd5b506104806105843660046136db565b611160565b34801561059557600080fd5b506103936105a43660046132a8565b6111a5565b3480156105b557600080fd5b506103936111b2565b3480156105ca57600080fd5b506104e560145481565b3480156105e057600080fd5b5060025460ff16610480565b3480156105f857600080fd5b506103f573039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b34801561062057600080fd5b506103936111c2565b34801561063557600080fd5b506103936106443660046136db565b6111d2565b34801561065557600080fd5b506104e561123b565b34801561066a57600080fd5b506104e560135481565b34801561068057600080fd5b506104e560125481565b34801561069657600080fd5b506104e56106a53660046136f8565b611287565b3480156106b657600080fd5b506103936106c53660046132a8565b611350565b3480156106d657600080fd5b5061039361135d565b3480156106eb57600080fd5b506104e561136f565b34801561070057600080fd5b506006546103f5906001600160a01b031681565b34801561072057600080fd5b506103936113b0565b34801561073557600080fd5b506104e560165481565b34801561074b57600080fd5b506000546001600160a01b03166103f5565b34801561076957600080fd5b506103936107783660046136db565b6113c0565b34801561078957600080fd5b506002546103f59061010090046001600160a01b031681565b3480156107ae57600080fd5b506104e5600f5481565b3480156107c457600080fd5b506104e560155481565b3480156107da57600080fd5b506104e56103e881565b3480156107f057600080fd5b506104e56114aa565b34801561080557600080fd5b5061039361152a565b34801561081a57600080fd5b506104e5600e5481565b34801561083057600080fd5b506104e561162a565b34801561084557600080fd5b506103936108543660046136db565b6116ad565b34801561086557600080fd5b506103936108743660046136db565b61174d565b34801561088557600080fd5b506103936117b6565b34801561089a57600080fd5b506017546103f5906001600160a01b031681565b3480156108ba57600080fd5b506103936108c93660046136af565b6117d1565b3480156108da57600080fd5b506103936108e93660046136db565b6118d5565b3480156108fa57600080fd5b5061090e6109093660046136f8565b6118ff565b604080516001600160a01b039485168152939092166020840152151590820152606001610409565b34801561094257600080fd5b50600c546103f5906001600160a01b031681565b34801561096257600080fd5b50610393611960565b34801561097757600080fd5b506007546103f5906001600160a01b031681565b34801561099757600080fd5b506104e56119dc565b3480156109ac57600080fd5b506104e5611ad3565b3480156109c157600080fd5b506008546103f5906001600160a01b031681565b3480156109e157600080fd5b506104e5600d5481565b3480156109f757600080fd5b506005546103f5906001600160a01b031681565b348015610a1757600080fd5b506003546103f5906001600160a01b031681565b348015610a3757600080fd5b506104e560045481565b348015610a4d57600080fd5b50610393610a5c3660046136db565b611d25565b348015610a6d57600080fd5b506104e5610a7c3660046136af565b611d9e565b348015610a8d57600080fd5b50610393611fb4565b348015610aa257600080fd5b50600a546103f5906001600160a01b031681565b610abe611fc4565b6064821115610b0f5760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b60448201526064015b60405180910390fd5b60168290556015546014541115610b635760405162461bcd60e51b81526020600482015260186024820152770a6e8e4c2e8cacef27440ecc2d8eaca40e8dede40d0d2ced60431b6044820152606401610b06565b60145550565b610b71611fc4565b60008111610bc15760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610b06565b80471015610c1c5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610b06565b6017546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610c69576040519150601f19603f3d011682016040523d82523d6000602084013e610c6e565b606091505b5050905080610cb15760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610b06565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b610cf2611fc4565b6001600160a01b0380841660009081526009602090815260408083209386168352929052908120610d2291613235565b60005b8151811015610de9576001600160a01b0380851660009081526009602090815260408083209387168352929052208251839083908110610d6757610d67613739565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0392831617815592820151929093018054604090920151929093166001600160a81b031990911617600160a01b9115159190910217905580610de181613765565b915050610d25565b50505050565b600c546060906001600160a01b03163314610e4c5760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610b06565b6060835160001415610e5f575081610e8b565b838051906020012083604051602001610e79929190613780565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610ea791906137b1565b60006040518083038185875af1925050503d8060008114610ee4576040519150601f19603f3d011682016040523d82523d6000602084013e610ee9565b606091505b509150915081610f615760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610b06565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610f9e939291906137cd565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610fdd5760405162461bcd60e51b8152600401610b0690613802565b505050565b610fea611fc4565b600854600654611007916001600160a01b03908116911685610cea565b600854600754611024916001600160a01b03908116911684610cea565b600854610fdd906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883610cea565b611057611fc4565b61105f61201e565b565b611069611fc4565b61105f612171565b600a546000906001600160a01b0316331461109e5760405162461bcd60e51b8152600401610b0690613802565b6110a66121c3565b6110ae61221d565b6005546110c6906001600160a01b0316333085612263565b6010548290158015906110db57506000601154115b15611104576111016010546110fb601154866122ce90919063ffffffff16565b906122e1565b90505b60115461111190826122ed565b60115561111c61201e565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061115a60018055565b92915050565b600080546001600160a01b038381169116148061118a5750600b546001600160a01b038381169116145b8061115a575050600c546001600160a01b0390811691161490565b6111ad611fc4565b601355565b6111ba611fc4565b61105f6122f9565b6111ca611fc4565b61105f6126bb565b6111da611fc4565b6001600160a01b0381166112195760405162461bcd60e51b8152600401610b06906020808252600490820152637a65726f60e01b604082015260600190565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b6000806112466119dc565b9050801561127e57600854611279906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883611287565b611281565b60005b91505090565b6003546001600160a01b038481166000908152600960209081526040808320878516845290915280822090516326207f2d60e21b8152919384931691639881fcb4916112d8918791906004016138a3565b600060405180830381865afa1580156112f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261131d91908101906138bc565b9050806001825161132e9190613942565b8151811061133e5761133e613739565b60200260200101519150509392505050565b611358611fc4565b600f55565b611365611fc4565b61105f600061291d565b60006011546000146113a35761139e6011546110fb670de0b6b3a76400006010546122ce90919063ffffffff16565b905090565b50670de0b6b3a764000090565b6113b8611fc4565b61105f61296d565b6001600160a01b0381166114075760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610b06565b600a546001600160a01b031633148061142a5750600c546001600160a01b031633145b6114885760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610b06565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006114b461162a565b6005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613959565b61139e9190613972565b600b546001600160a01b031633148061155c5750336115516000546001600160a01b031690565b6001600160a01b0316145b6115785760405162461bcd60e51b8152600401610b069061398a565b600061158261123b565b9050600f548110156115c25760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610b06565b60006115cc611ad3565b90508047101561161e5760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610b06565b611626611960565b5050565b600254600480546040516393f1a40b60e01b81529182015230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a691906139d0565b5092915050565b600c546001600160a01b03163314806116f35750600c546001600160a01b03161580156116f35750336116e86000546001600160a01b031690565b6001600160a01b0316145b61172b5760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610b06565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611755611fc4565b6001600160a01b0381166117945760405162461bcd60e51b8152600401610b06906020808252600490820152637a65726f60e01b604082015260600190565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6117be611fc4565b60025460ff16156113b85761105f612171565b6117d9611fc4565b6008546001600160a01b038381169116141561181f5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610b06565b6005546001600160a01b03838116911614156118655760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610b06565b600a546001600160a01b039081169061188190841682846129aa565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b6118dd611fc4565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061192757600080fd5b6000918252602090912060029091020180546001909101546001600160a01b0391821694509081169250600160a01b900460ff16905083565b61196861221d565b600b546001600160a01b031633148061199a57503361198f6000546001600160a01b031690565b6001600160a01b0316145b6119b65760405162461bcd60e51b8152600401610b069061398a565b6119be6122f9565b6119c66126bb565b6119ce6129da565b6119d661201e565b42600e55565b6008546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d9190613959565b60025460048054604051636b2681c560e01b81529182015230602482015291925061128191839161010090046001600160a01b031690636b2681c590604401602060405180830381865afa158015611aa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acd9190613959565b906122ed565b600080611ade6119dc565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663717478026040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b5991906139f4565b90508015611d1c576000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bda9190613a11565b600854604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa158015611c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5c9190613959565b90506000611c76670de0b6b3a76400006110fb87856122ce565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190613959565b9050611d116103e86110fb60145484611d0a9190613972565b85906122ce565b965050505050505090565b60009250505090565b611d2d611fc4565b6001600160a01b038116611d925760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b06565b611d9b8161291d565b50565b600a546000906001600160a01b03163314611dcb5760405162461bcd60e51b8152600401610b0690613802565b611dd36121c3565b60008211611e195760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610b06565b60025460048054604051630441a3e760e41b815291820152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611e6b57600080fd5b505af1158015611e7f573d6000803e3d6000fd5b50506005546040516370a0823160e01b8152306004820152600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa158015611ece573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef29190613959565b905080831115611f00578092505b826010541015611f105760105492505b6000611f2d6010546110fb601154876122ce90919063ffffffff16565b9050601154811115611f3e57506011545b601154611f4b9082612c78565b601155601054611f5b9085612c78565b601055600554611f75906001600160a01b031633866129aa565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061115a60018055565b611fbc611fc4565b61105f6129da565b6000546001600160a01b0316331461105f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b06565b6005546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa15801561206b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208f9190613959565b60105490915061209f90826122ed565b6010558015611626576005546002546120ca916001600160a01b039081169161010090041683612c84565b60025460048054604051631c57762b60e31b815291820152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b15801561211c57600080fd5b505af1158015612130573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f8160405161216591815260200190565b60405180910390a15050565b612179612c98565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156122165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b06565b6002600155565b60025460ff161561105f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b06565b6040516001600160a01b0380851660248301528316604482015260648101829052610de99085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ce1565b60006122da8284613a2e565b9392505050565b60006122da8284613a4d565b60006122da8284613972565b60025460048054604051636b2681c560e01b81529182015230602482015247916000916101009091046001600160a01b031690636b2681c590604401602060405180830381865afa158015612352573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123769190613959565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663717478026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f191906139f4565b9050600081156125f1576000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612450573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124749190613959565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316632760f89b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190613a11565b600854604051630d01142560e31b81526001600160a01b039182166004820152670de0b6b3a7640000602482015291925060009190831690636808a12890604401602060405180830381865afa15801561254d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125719190613959565b9050600081116125b85760405162461bcd60e51b815260206004820152601260248201527127b930b1b63290383934b1b29032b93937b960711b6044820152606401610b06565b6125eb6103e86110fb601454866125cf9190613972565b6125e5670de0b6b3a76400006110fb878d6122ce565b906122ce565b93505050505b808410156126415760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820736f6e696320636f6c6c61746572616c00000000006044820152606401610b06565b60025460048054604051636ee3193160e11b8152918201526101009091046001600160a01b03169063ddc632629083906024016000604051808303818588803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b505050505047846126b29190613942565b600d5550505050565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127289190613959565b9050600081116127355750565b600854604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16008546000906127a9906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611287565b9050600081116127b7575050565b601654600d54156127f7576014546127e0836110fb6103e8600d546122ce90919063ffffffff16565b6127ea9190613972565b6127f49082613972565b90505b60085461281d906001600160a01b03166128176103e86110fb87866122ce565b30612db6565b60135447906000908211156128da576013546128399083613942565b6017546040519192506000916001600160a01b039091169083908381818185875af1925050503d806000811461288b576040519150601f19603f3d011682016040523d82523d6000602084013e612890565b606091505b50509050806128d85760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610b06565b505b600d5460408051918252602082018390527f2cc59d6e1281c9f122c4f6930ae083db22762e74c7aacbfeded26fcbb367936b910160405180910390a15050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61297561221d565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121a63390565b6040516001600160a01b038316602482015260448101829052610fdd90849063a9059cbb60e01b90606401612297565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612a23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a479190613959565b600854909150612a8290612a79906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611287565b601254906122ed565b6012556006546008546001600160a01b03908116911614612ac557600854600654612ac5916001600160a01b039081169116612abf8460026122e1565b30612e9f565b6007546008546001600160a01b03908116911614612aff57600854600754612aff916001600160a01b039081169116612abf8460026122e1565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6c9190613959565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015612bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bde9190613959565b9050600082118015612bf05750600081115b15610fdd57600654600754600854612c21926001600160a01b03908116921690600160a01b900460ff168585612f6c565b600654600754604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f906080016118c8565b60006122da8284613942565b610fdd6001600160a01b0384168383613068565b60025460ff1661105f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b06565b6000612d36826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166131159092919063ffffffff16565b9050805160001480612d57575080806020019051810190612d5791906139f4565b610fdd5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b06565b600354612dce9084906001600160a01b031684612c84565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610fdd576003546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad388452909152812091909216916318a130869185919085612e48426107086122ed565b6040518663ffffffff1660e01b8152600401612e68959493929190613a6f565b600060405180830381600087803b158015612e8257600080fd5b505af1158015612e96573d6000803e3d6000fd5b50505050505050565b600354612eb79085906001600160a01b031684612c84565b826001600160a01b0316846001600160a01b031614610de9576003546001600160a01b03858116600090815260096020908152604080832088851684529091528120919092169163f41766d89185919085612f14426107086122ed565b6040518663ffffffff1660e01b8152600401612f34959493929190613a6f565b600060405180830381600087803b158015612f4e57600080fd5b505af1158015612f62573d6000803e3d6000fd5b5050505050505050565b600354612f849086906001600160a01b031684612c84565b600354612f9c9085906001600160a01b031683612c84565b6003546001600160a01b0316635a47ddc3868686868660008030612fc2426107086122ed565b60405160e08b901b6001600160e01b03191681526001600160a01b03998a166004820152978916602489015295151560448801526064870194909452608486019290925260a485015260c484015290921660e4820152610104810191909152610124016060604051808303816000875af1158015613044573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f629190613aab565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa1580156130b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130dc9190613959565b9050610de98463095ea7b360e01b856130f58686613972565b6040516001600160a01b0390921660248301526044820152606401612297565b6060610fab848460008585600080866001600160a01b0316858760405161313c91906137b1565b60006040518083038185875af1925050503d8060008114613179576040519150601f19603f3d011682016040523d82523d6000602084013e61317e565b606091505b509150915061318f8783838761319a565b979650505050505050565b606083156132065782516131ff576001600160a01b0385163b6131ff5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b06565b5081610fab565b610fab838381511561321b5781518083602001fd5b8060405162461bcd60e51b8152600401610b0691906135e9565b5080546000825560020290600052602060002090810190611d9b91905b808211156132825780546001600160a01b03191681556001810180546001600160a81b0319169055600201613252565b5090565b6000806040838503121561329957600080fd5b50508035926020909101359150565b6000602082840312156132ba57600080fd5b5035919050565b6001600160a01b0381168114611d9b57600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561330f5761330f6132d6565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561333e5761333e6132d6565b604052919050565b600067ffffffffffffffff821115613360576133606132d6565b5060051b60200190565b8015158114611d9b57600080fd5b600082601f83011261338957600080fd5b8135602061339e61339983613346565b613315565b828152606092830285018201928282019190878511156133bd57600080fd5b8387015b8581101561341f5781818a0312156133d95760008081fd5b6133e16132ec565b81356133ec816132c1565b8152818601356133fb816132c1565b8187015260408281013561340e8161336a565b9082015284529284019281016133c1565b5090979650505050505050565b60008060006060848603121561344157600080fd5b833561344c816132c1565b9250602084013561345c816132c1565b9150604084013567ffffffffffffffff81111561347857600080fd5b61348486828701613378565b9150509250925092565b600067ffffffffffffffff8311156134a8576134a86132d6565b6134bb601f8401601f1916602001613315565b90508281528383830111156134cf57600080fd5b828260208301376000602084830101529392505050565b600080600080608085870312156134fc57600080fd5b8435613507816132c1565b935060208501359250604085013567ffffffffffffffff8082111561352b57600080fd5b818701915087601f83011261353f57600080fd5b61354e8883356020850161348e565b9350606087013591508082111561356457600080fd5b508501601f8101871361357657600080fd5b6135858782356020840161348e565b91505092959194509250565b60005b838110156135ac578181015183820152602001613594565b83811115610de95750506000910152565b600081518084526135d5816020860160208601613591565b601f01601f19169290920160200192915050565b6020815260006122da60208301846135bd565b60008060006060848603121561361157600080fd5b833561361c816132c1565b95602085013595506040909401359392505050565b60008060006060848603121561364657600080fd5b833567ffffffffffffffff8082111561365e57600080fd5b61366a87838801613378565b9450602086013591508082111561368057600080fd5b61368c87838801613378565b935060408601359150808211156136a257600080fd5b5061348486828701613378565b600080604083850312156136c257600080fd5b82356136cd816132c1565b946020939093013593505050565b6000602082840312156136ed57600080fd5b81356122da816132c1565b60008060006060848603121561370d57600080fd5b8335613718816132c1565b92506020840135613728816132c1565b929592945050506040919091013590565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156137795761377961374f565b5060010190565b6001600160e01b03198316815281516000906137a3816004850160208701613591565b919091016004019392505050565b600082516137c3818460208701613591565b9190910192915050565b8381526060602082015260006137e660608301856135bd565b82810360408401526137f881856135bd565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156138985781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff161515604089015260609097019660029092019101613852565b509495945050505050565b828152604060208201526000610fab6040830184613839565b600060208083850312156138cf57600080fd5b825167ffffffffffffffff8111156138e657600080fd5b8301601f810185136138f757600080fd5b805161390561339982613346565b81815260059190911b8201830190838101908783111561392457600080fd5b928401925b8284101561318f57835182529284019290840190613929565b6000828210156139545761395461374f565b500390565b60006020828403121561396b57600080fd5b5051919050565b600082198211156139855761398561374f565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b600080604083850312156139e357600080fd5b505080516020909101519092909150565b600060208284031215613a0657600080fd5b81516122da8161336a565b600060208284031215613a2357600080fd5b81516122da816132c1565b6000816000190483118215151615613a4857613a4861374f565b500290565b600082613a6a57634e487b7160e01b600052601260045260246000fd5b500490565b85815284602082015260a060408201526000613a8e60a0830186613839565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215613ac057600080fd5b835192506020840151915060408401519050925092509256fea264697066735822122040f13427bf31105ffed69b7163ca19b9af9cfc969d3b81ccc555284ec947d64a64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000287c6882de298665977787e268f3dba052a6e251000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad380000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _controller (address): 0x8Ae21A4f5b99f18De502FCeb3174C74229ab326C
Arg [1] : _timelock (address): 0x71FD21a764eF295fB7BFBdf4D2EBfFE862e76fBf
Arg [2] : _treasuryAddress (address): 0xc547E8dD3844fb5BC178120a121b365Ea790774E
Arg [3] : _pid (uint256): 0
Arg [4] : _wantAddress (address): 0x287c6882dE298665977787e268f3dba052A6e251
Arg [5] : _earnedAddress (address): 0x674a430f531847a6f8976A900f8ace765f896a1b
Arg [6] : _token0 (address): 0x3a516e01f82c1e18916ED69a81Dd498eF64bB157
Arg [7] : _token1 (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [8] : _stable (bool): True
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ae21a4f5b99f18de502fceb3174c74229ab326c
Arg [1] : 00000000000000000000000071fd21a764ef295fb7bfbdf4d2ebffe862e76fbf
Arg [2] : 000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 000000000000000000000000287c6882de298665977787e268f3dba052a6e251
Arg [5] : 000000000000000000000000674a430f531847a6f8976a900f8ace765f896a1b
Arg [6] : 0000000000000000000000003a516e01f82c1e18916ed69a81dd498ef64bb157
Arg [7] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
42526:17847:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55188:357;;;;;;;;;;-1:-1:-1;55188:357:0;;;;;:::i;:::-;;:::i;58068:388::-;;;;;;;;;;-1:-1:-1;58068:388:0;;;;;:::i;:::-;;:::i;43297:25::-;;;;;;;;;;-1:-1:-1;43297:25:0;;;;-1:-1:-1;;;;;43297:25:0;;;;;;-1:-1:-1;;;;;616:32:1;;;598:51;;586:2;571:18;43297:25:0;;;;;;;;56488:296;;;;;;;;;;-1:-1:-1;56488:296:0;;;;;:::i;:::-;;:::i;59650:720::-;;;;;;;;;;-1:-1:-1;59650:720:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43068:18::-;;;;;;;;;;-1:-1:-1;43068:18:0;;;;-1:-1:-1;;;43068:18:0;;;;;;;;;6070:14:1;;6063:22;6045:41;;6033:2;6018:18;43068::0;5905:187:1;58959:89:0;;;;;;;;;;-1:-1:-1;58959:89:0;;;;;:::i;:::-;;:::i;56059:421::-;;;;;;;;;;-1:-1:-1;56059:421:0;;;;;:::i;:::-;;:::i;43840:46::-;;;;;;;;;;;;43883:3;43840:46;;;;;7541:25:1;;;7529:2;7514:18;43840:46:0;7395:177:1;48417:59:0;;;;;;;;;;;;;:::i;54877:67::-;;;;;;;;;;;;;:::i;43493:43::-;;;;;;;;;;;;;;;;43543:39;;;;;;;;;;;;;;;;47863:546;;;;;;;;;;-1:-1:-1;47863:546:0;;;;;:::i;:::-;;:::i;45687:168::-;;;;;;;;;;-1:-1:-1;45687:168:0;;;;;:::i;:::-;;:::i;55066:114::-;;;;;;;;;;-1:-1:-1;55066:114:0;;;;;:::i;:::-;;:::i;48484:71::-;;;;;;;;;;;;;:::i;43692:37::-;;;;;;;;;;;;;;;;38230:86;;;;;;;;;;-1:-1:-1;38301:7:0;;;;38230:86;;43176:80;;;;;;;;;;;;43213:42;43176:80;;48638:65;;;;;;;;;;;;;:::i;55553:184::-;;;;;;;;;;-1:-1:-1;55553:184:0;;;;;:::i;:::-;;:::i;54601:197::-;;;;;;;;;;;;;:::i;43628:40::-;;;;;;;;;;;;;;;;43589:30;;;;;;;;;;;;;;;;54028:301;;;;;;;;;;-1:-1:-1;54028:301:0;;;;;:::i;:::-;;:::i;55933:118::-;;;;;;;;;;-1:-1:-1;55933:118:0;;;;;:::i;:::-;;:::i;32683:103::-;;;;;;;;;;;;;:::i;47444:169::-;;;;;;;;;;;;;:::i;42936:37::-;;;;;;;;;;-1:-1:-1;42936:37:0;;;;-1:-1:-1;;;;;42936:37:0;;;54806:63;;;;;;;;;;;;;:::i;43795:33::-;;;;;;;;;;;;;;;;32042:87;;;;;;;;;;-1:-1:-1;32088:7:0;32115:6;-1:-1:-1;;;;;32115:6:0;32042:87;;59101:274;;;;;;;;;;-1:-1:-1;59101:274:0;;;;;:::i;:::-;;:::i;42673:88::-;;;;;;;;;;-1:-1:-1;42673:88:0;;;;;;;-1:-1:-1;;;;;42673:88:0;;;43436:40;;;;;;;;;;;;;;;;43741:41;;;;;;;;;;;;;;;;43904;;;;;;;;;;;;43941:4;43904:41;;47283:153;;;;;;;;;;;;;:::i;46743:338::-;;;;;;;;;;;;;:::i;43398:31::-;;;;;;;;;;;;;;;;47089:186;;;;;;;;;;;;;:::i;59383:196::-;;;;;;;;;;-1:-1:-1;59383:196:0;;;;;:::i;:::-;;:::i;55745:180::-;;;;;;;;;;-1:-1:-1;55745:180:0;;;;;:::i;:::-;;:::i;58842:109::-;;;;;;;;;;;;;:::i;43956:30::-;;;;;;;;;;-1:-1:-1;43956:30:0;;;;-1:-1:-1;;;;;43956:30:0;;;58464:370;;;;;;;;;;-1:-1:-1;58464:370:0;;;;;:::i;:::-;;:::i;54952:106::-;;;;;;;;;;-1:-1:-1;54952:106:0;;;;;:::i;:::-;;:::i;43093:74::-;;;;;;;;;;-1:-1:-1;43093:74:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8862:15:1;;;8844:34;;8914:15;;;;8909:2;8894:18;;8887:43;8973:14;8966:22;8946:18;;;8939:50;8794:2;8779:18;43093:74:0;8610:385:1;43329:23:0;;;;;;;;;;-1:-1:-1;43329:23:0;;;;-1:-1:-1;;;;;43329:23:0;;;53820:200;;;;;;;;;;;;;:::i;42980:37::-;;;;;;;;;;-1:-1:-1;42980:37:0;;;;-1:-1:-1;;;;;42980:37:0;;;54337:256;;;;;;;;;;;;;:::i;45863:872::-;;;;;;;;;;;;;:::i;43024:37::-;;;;;;;;;;-1:-1:-1;43024:37:0;;;;-1:-1:-1;;;;;43024:37:0;;;43361:30;;;;;;;;;;;;;;;;42894:35;;;;;;;;;;-1:-1:-1;42894:35:0;;;;-1:-1:-1;;;;;42894:35:0;;;42768:85;;;;;;;;;;-1:-1:-1;42768:85:0;;;;-1:-1:-1;;;;;42768:85:0;;;42869:18;;;;;;;;;;;;;;;;32941:201;;;;;;;;;;-1:-1:-1;32941:201:0;;;;;:::i;:::-;;:::i;49128:928::-;;;;;;;;;;-1:-1:-1;49128:928:0;;;;;:::i;:::-;;:::i;48563:67::-;;;;;;;;;;;;;:::i;43265:25::-;;;;;;;;;;-1:-1:-1;43265:25:0;;;;-1:-1:-1;;;;;43265:25:0;;;55188:357;31928:13;:11;:13::i;:::-;43883:3:::1;55295:14;:34;;55287:71;;;::::0;-1:-1:-1;;;55287:71:0;;9202:2:1;55287:71:0::1;::::0;::::1;9184:21:1::0;9241:2;9221:18;;;9214:30;-1:-1:-1;;;9260:18:1;;;9253:54;9324:18;;55287:71:0::1;;;;;;;;;55369:13;:30:::0;;;55439:20:::1;::::0;55418:17:::1;::::0;:41:::1;;55410:78;;;::::0;-1:-1:-1;;;55410:78:0;;9202:2:1;55410:78:0::1;::::0;::::1;9184:21:1::0;9241:2;9221:18;;;9214:30;-1:-1:-1;;;9260:18:1;;;9253:54;9324:18;;55410:78:0::1;9000:348:1::0;55410:78:0::1;55499:17;:38:::0;-1:-1:-1;55188:357:0:o;58068:388::-;31928:13;:11;:13::i;:::-;58150:1:::1;58141:6;:10;58133:55;;;::::0;-1:-1:-1;;;58133:55:0;;9555:2:1;58133:55:0::1;::::0;::::1;9537:21:1::0;;;9574:18;;;9567:30;9633:34;9613:18;;;9606:62;9685:18;;58133:55:0::1;9353:356:1::0;58133:55:0::1;58232:6;58207:21;:31;;58199:78;;;::::0;-1:-1:-1;;;58199:78:0;;9916:2:1;58199:78:0::1;::::0;::::1;9898:21:1::0;9955:2;9935:18;;;9928:30;9994:34;9974:18;;;9967:62;-1:-1:-1;;;10045:18:1;;;10038:32;10087:19;;58199:78:0::1;9714:398:1::0;58199:78:0::1;58317:15;::::0;58309:48:::1;::::0;58291:12:::1;::::0;-1:-1:-1;;;;;58317:15:0::1;::::0;58346:6;;58291:12;58309:48;58291:12;58309:48;58346:6;58317:15;58309:48:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58290:67;;;58376:7;58368:35;;;::::0;-1:-1:-1;;;58368:35:0;;10529:2:1;58368:35:0::1;::::0;::::1;10511:21:1::0;10568:2;10548:18;;;10541:30;-1:-1:-1;;;10587:18:1;;;10580:45;10642:18;;58368:35:0::1;10327:339:1::0;58368:35:0::1;58419:29;::::0;7541:25:1;;;58429:10:0::1;::::0;58419:29:::1;::::0;7529:2:1;7514:18;58419:29:0::1;;;;;;;58122:334;58068:388:::0;:::o;56488:296::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;56637:17:0;;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;:21;;::::1;::::0;;;;;;;;56630:28:::1;::::0;::::1;:::i;:::-;56674:9;56669:108;56693:6;:13;56689:1;:17;56669:108;;;-1:-1:-1::0;;;;;56728:17:0;;::::1;;::::0;;;:11:::1;:17;::::0;;;;;;;:21;;::::1;::::0;;;;;;56755:9;;:6;;56762:1;;56755:9;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;56728:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;56728:37:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;56728:37:0::1;-1:-1:-1::0;;;;;56728:37:0;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;56728:37:0;;;;-1:-1:-1;;;56728:37:0;::::1;;::::0;;;::::1;;::::0;;56708:3;::::1;::::0;::::1;:::i;:::-;;;;56669:108;;;;56488:296:::0;;;:::o;59650:720::-;45600:8;;59784:12;;-1:-1:-1;;;;;45600:8:0;45612:10;45600:22;45592:67;;;;-1:-1:-1;;;45592:67:0;;11277:2:1;45592:67:0;;;11259:21:1;;;11296:18;;;11289:30;11355:34;11335:18;;;11328:62;11407:18;;45592:67:0;11075:356:1;45592:67:0;59809:21:::1;59853:9;59847:23;59874:1;59847:28;59843:179;;;-1:-1:-1::0;59903:4:0;59843:179:::1;;;59991:9;59975:27;;;;;;60005:4;59951:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;59940:70;;59843:179;60095:12;60109:23:::0;60136:6:::1;-1:-1:-1::0;;;;;60136:11:0::1;60156:5;60163:8;60136:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60094:78;;;;60191:7;60183:81;;;::::0;-1:-1:-1;;;60183:81:0;;12293:2:1;60183:81:0::1;::::0;::::1;12275:21:1::0;12332:2;12312:18;;;12305:30;12371:34;12351:18;;;12344:62;12442:31;12422:18;;;12415:59;12491:19;;60183:81:0::1;12091:425:1::0;60183:81:0::1;60301:6;-1:-1:-1::0;;;;;60282:50:0::1;;60309:5;60316:9;60327:4;60282:50;;;;;;;;:::i;:::-;;;;;;;;60352:10:::0;-1:-1:-1;;;45670:1:0::1;59650:720:::0;;;;;;:::o;58959:89::-;45307:10;;-1:-1:-1;;;;;45307:10:0;45321;45307:24;45299:65;;;;-1:-1:-1;;;45299:65:0;;;;;;;:::i;:::-;58959:89;;;:::o;56059:421::-;31928:13;:11;:13::i;:::-;56287::::1;::::0;56302::::1;::::0;56273:64:::1;::::0;-1:-1:-1;;;;;56287:13:0;;::::1;::::0;56302::::1;56317:19:::0;56273:13:::1;:64::i;:::-;56362:13;::::0;56377::::1;::::0;56348:64:::1;::::0;-1:-1:-1;;;;;56362:13:0;;::::1;::::0;56377::::1;56392:19:::0;56348:13:::1;:64::i;:::-;56437:13;::::0;56423:49:::1;::::0;-1:-1:-1;;;;;56437:13:0::1;43213:42;56456:15:::0;56423:13:::1;:49::i;48417:59::-:0;31928:13;:11;:13::i;:::-;48461:7:::1;:5;:7::i;:::-;48417:59::o:0;54877:67::-;31928:13;:11;:13::i;:::-;54926:10:::1;:8;:10::i;47863:546::-:0;45307:10;;47976:7;;-1:-1:-1;;;;;45307:10:0;45321;45307:24;45299:65;;;;-1:-1:-1;;;45299:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;37835:19:::2;:17;:19::i;:::-;48003:11:::3;::::0;47996:82:::3;::::0;-1:-1:-1;;;;;48003:11:0::3;48041:10;48062:4;48069:8:::0;47996:36:::3;:82::i;:::-;48136:15;::::0;48113:8;;48136:19;;;;:38:::3;;;48173:1;48159:11;;:15;48136:38;48132:131;;;48205:46;48235:15;;48205:25;48218:11;;48205:8;:12;;:25;;;;:::i;:::-;:29:::0;::::3;:46::i;:::-;48191:60;;48132:131;48287:11;::::0;:28:::3;::::0;48303:11;48287:15:::3;:28::i;:::-;48273:11;:42:::0;48328:7:::3;:5;:7::i;:::-;48353:17;::::0;7541:25:1;;;48353:17:0::3;::::0;7529:2:1;7514:18;48353:17:0::3;;;;;;;48390:11:::0;-1:-1:-1;35795:20:0::1;35189:1:::0;36315:22;;36132:213;35795:20:::1;47863:546:::0;;;;:::o;45687:168::-;45748:4;32115:6;;-1:-1:-1;;;;;45773:19:0;;;32115:6;;45773:19;;45772:49;;-1:-1:-1;45810:10:0;;-1:-1:-1;;;;;45798:22:0;;;45810:10;;45798:22;45772:49;:75;;;-1:-1:-1;;45838:8:0;;-1:-1:-1;;;;;45838:8:0;;;45826:20;;;;45687:168::o;55066:114::-;31928:13;:11;:13::i;:::-;55144:12:::1;:28:::0;55066:114::o;48484:71::-;31928:13;:11;:13::i;:::-;48537:10:::1;:8;:10::i;48638:65::-:0;31928:13;:11;:13::i;:::-;48685:10:::1;:8;:10::i;55553:184::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;55645:30:0;::::1;55637:47;;;;-1:-1:-1::0;;;55637:47:0::1;;;;;;13535:2:1::0;13517:21;;;13574:1;13554:18;;;13547:29;-1:-1:-1;;;13607:2:1;13592:18;;13585:34;13651:2;13636:18;;13333:327;55637:47:0::1;55695:15;:34:::0;;-1:-1:-1;;;;;;55695:34:0::1;-1:-1:-1::0;;;;;55695:34:0;;;::::1;::::0;;;::::1;::::0;;55553:184::o;54601:197::-;54654:7;54674:16;54693;:14;:16::i;:::-;54674:35;-1:-1:-1;54728:13:0;;54727:63;;54762:13;;54749:41;;-1:-1:-1;;;;;54762:13:0;43213:42;54781:8;54749:12;:41::i;:::-;54727:63;;;54745:1;54727:63;54720:70;;;54601:197;:::o;54028:301::-;54191:16;;-1:-1:-1;;;;;54237:24:0;;;54136:7;54237:24;;;:11;:24;;;;;;;;:38;;;;;;;;;;;54183:93;;-1:-1:-1;;;54183:93:0;;54136:7;;;;54191:16;;54183:39;;:93;;54223:12;;54237:38;54183:93;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54183:93:0;;;;;;;;;;;;:::i;:::-;54156:120;;54294:7;54319:1;54302:7;:14;:18;;;;:::i;:::-;54294:27;;;;;;;;:::i;:::-;;;;;;;54287:34;;;54028:301;;;;;:::o;55933:118::-;31928:13;:11;:13::i;:::-;56013::::1;:30:::0;55933:118::o;32683:103::-;31928:13;:11;:13::i;:::-;32748:30:::1;32775:1;32748:18;:30::i;47444:169::-:0;47508:7;47536:11;;47551:1;47536:16;47535:70;;47563:42;47593:11;;47563:25;47583:4;47563:15;;:19;;:25;;;;:::i;:42::-;47528:77;;47444:169;:::o;47535:70::-;-1:-1:-1;47556:4:0;;47444:169::o;54806:63::-;31928:13;:11;:13::i;:::-;54853:8:::1;:6;:8::i;59101:274::-:0;-1:-1:-1;;;;;59173:25:0;;59165:52;;;;-1:-1:-1;;;59165:52:0;;16000:2:1;59165:52:0;;;15982:21:1;16039:2;16019:18;;;16012:30;-1:-1:-1;;;16058:18:1;;;16051:44;16112:18;;59165:52:0;15798:338:1;59165:52:0;59236:10;;-1:-1:-1;;;;;59236:10:0;59250;59236:24;;:50;;-1:-1:-1;59264:8:0;;-1:-1:-1;;;;;59264:8:0;59276:10;59264:22;59236:50;59228:104;;;;-1:-1:-1;;;59228:104:0;;16343:2:1;59228:104:0;;;16325:21:1;16382:2;16362:18;;;16355:30;16421:34;16401:18;;;16394:62;-1:-1:-1;;;16472:18:1;;;16465:39;16521:19;;59228:104:0;16141:405:1;59228:104:0;59343:10;:24;;-1:-1:-1;;;;;;59343:24:0;-1:-1:-1;;;;;59343:24:0;;;;;;;;;;59101:274::o;47283:153::-;47339:7;47413:15;:13;:15::i;:::-;47373:11;;47366:44;;-1:-1:-1;;;47366:44:0;;47404:4;47366:44;;;598:51:1;-1:-1:-1;;;;;47373:11:0;;;;47366:29;;571:18:1;;47366:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;46743:338::-;45437:10;;-1:-1:-1;;;;;45437:10:0;45451;45437:24;;:49;;-1:-1:-1;45476:10:0;45465:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45465:7;-1:-1:-1;;;;;45465:21:0;;45437:49;45429:100;;;;-1:-1:-1;;;45429:100:0;;;;;;;:::i;:::-;46796:29:::1;46828:22;:20;:22::i;:::-;46796:54;;46894:13;;46869:21;:38;;46861:60;;;::::0;-1:-1:-1;;;46861:60:0;;17482:2:1;46861:60:0::1;::::0;::::1;17464:21:1::0;17521:1;17501:18;;;17494:29;-1:-1:-1;;;17539:18:1;;;17532:39;17588:18;;46861:60:0::1;17280:332:1::0;46861:60:0::1;46932:17;46953:20;:18;:20::i;:::-;46932:41;;47019:9;46994:21;:34;;46986:70;;;::::0;-1:-1:-1;;;46986:70:0;;17819:2:1;46986:70:0::1;::::0;::::1;17801:21:1::0;17858:2;17838:18;;;17831:30;17897:25;17877:18;;;17870:53;17940:18;;46986:70:0::1;17617:347:1::0;46986:70:0::1;47067:6;:4;:6::i;:::-;46785:296;;46743:338::o:0;47089:186::-;47194:19;;47224:3;;;47184:59;;-1:-1:-1;;;47184:59:0;;;;;18143:25:1;47237:4:0;18184:18:1;;;18177:60;47144:7:0;;;;47194:19;;;;-1:-1:-1;;;;;47194:19:0;;47184:39;;18116:18:1;;47184:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;47164:79:0;47089:186;-1:-1:-1;;47089:186:0:o;59383:196::-;59451:8;;-1:-1:-1;;;;;59451:8:0;59463:10;59451:22;;:75;;-1:-1:-1;59478:8:0;;-1:-1:-1;;;;;59478:8:0;:22;:47;;;;-1:-1:-1;59515:10:0;59504:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;59504:7;-1:-1:-1;;;;;59504:21:0;;59478:47;59443:97;;;;-1:-1:-1;;;59443:97:0;;18700:2:1;59443:97:0;;;18682:21:1;18739:1;18719:18;;;18712:29;-1:-1:-1;;;18757:18:1;;;18750:39;18806:18;;59443:97:0;18498:332:1;59443:97:0;59551:8;:20;;-1:-1:-1;;;;;;59551:20:0;-1:-1:-1;;;;;59551:20:0;;;;;;;;;;59383:196::o;55745:180::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;55836:28:0;::::1;55828:45;;;;-1:-1:-1::0;;;55828:45:0::1;;;;;;13535:2:1::0;13517:21;;;13574:1;13554:18;;;13547:29;-1:-1:-1;;;13607:2:1;13592:18;;13585:34;13651:2;13636:18;;13333:327;55828:45:0::1;55884:16;:33:::0;;-1:-1:-1;;;;;;55884:33:0::1;-1:-1:-1::0;;;;;55884:33:0;;;::::1;::::0;;;::::1;::::0;;55745:180::o;58842:109::-;31928:13;:11;:13::i;:::-;38301:7;;;;58895:48:::1;;;58909:10;:8;:10::i;58464:370::-:0;31928:13;:11;:13::i;:::-;58584::::1;::::0;-1:-1:-1;;;;;58574:23:0;;::::1;58584:13:::0;::::1;58574:23;;58566:41;;;::::0;-1:-1:-1;;;58566:41:0;;19037:2:1;58566:41:0::1;::::0;::::1;19019:21:1::0;19076:1;19056:18;;;19049:29;-1:-1:-1;;;19094:18:1;;;19087:35;19139:18;;58566:41:0::1;18835:328:1::0;58566:41:0::1;58636:11;::::0;-1:-1:-1;;;;;58626:21:0;;::::1;58636:11:::0;::::1;58626:21;;58618:39;;;::::0;-1:-1:-1;;;58618:39:0;;19037:2:1;58618:39:0::1;::::0;::::1;19019:21:1::0;19076:1;19056:18;;;19049:29;-1:-1:-1;;;19094:18:1;;;19087:35;19139:18;;58618:39:0::1;18835:328:1::0;58618:39:0::1;58690:10;::::0;-1:-1:-1;;;;;58690:10:0;;::::1;::::0;58711:49:::1;::::0;:27;::::1;58690:10:::0;58752:7;58711:27:::1;:49::i;:::-;58776:50;::::0;;-1:-1:-1;;;;;19426:15:1;;;19408:34;;19473:2;19458:18;;19451:34;;;19521:15;;19501:18;;;19494:43;;;;58776:50:0::1;::::0;19358:2:1;19343:18;58776:50:0::1;;;;;;;;58555:279;58464:370:::0;;:::o;54952:106::-;31928:13;:11;:13::i;:::-;55026:10:::1;:24:::0;;-1:-1:-1;;;;;;55026:24:0::1;-1:-1:-1::0;;;;;55026:24:0;;;::::1;::::0;;;::::1;::::0;;54952:106::o;43093:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43093:74:0;;;;-1:-1:-1;43093:74:0;;;;-1:-1:-1;;;;43093:74:0;;;;;-1:-1:-1;43093:74:0;:::o;53820:200::-;37835:19;:17;:19::i;:::-;45437:10:::1;::::0;-1:-1:-1;;;;;45437:10:0::1;45451;45437:24;::::0;:49:::1;;-1:-1:-1::0;45476:10:0::1;45465:7;32088::::0;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45465:7:::1;-1:-1:-1::0;;;;;45465:21:0::1;;45437:49;45429:100;;;;-1:-1:-1::0;;;45429:100:0::1;;;;;;;:::i;:::-;53892:10:::2;:8;:10::i;:::-;53915;:8;:10::i;:::-;53938:11;:9;:11::i;:::-;53962:7;:5;:7::i;:::-;53997:15;53982:12;:30:::0;53820:200::o;54337:256::-;54432:13;;54425:46;;-1:-1:-1;;;54425:46:0;;54465:4;54425:46;;;598:51:1;54384:7:0;;;;-1:-1:-1;;;;;54432:13:0;;;;54425:31;;571:18:1;;54425:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54499:19;;54550:3;;;54489:80;;-1:-1:-1;;;54489:80:0;;;;;18143:25:1;54563:4:0;18184:18:1;;;18177:60;54404:67:0;;-1:-1:-1;54489:96:0;;54404:67;;54499:19;;;-1:-1:-1;;;;;54499:19:0;;54489:60;;18116:18:1;;54489:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:84;;:96::i;45863:872::-;45914:7;45934:16;45953;:14;:16::i;:::-;45934:35;;45980:33;46026:19;;;;;;;;;-1:-1:-1;;;;;46026:19:0;-1:-1:-1;;;;;46016:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45980:97;;46092:28;46088:621;;;46137:14;46172:19;;;;;;;;;-1:-1:-1;;;;;46172:19:0;-1:-1:-1;;;;;46162:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46374:13;;46362:32;;-1:-1:-1;;;46362:32:0;;-1:-1:-1;;;;;46374:13:0;;;46362:32;;;20254:51:1;46389:4:0;20321:18:1;;;20314:34;46137:71:0;;-1:-1:-1;46326:33:0;;46362:11;;;;;;20227:18:1;;46362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46326:68;-1:-1:-1;46409:29:0;46441:49;46485:4;46441:39;:8;46326:68;46441:12;:39::i;:49::-;46409:81;;46505:29;46547:19;;;;;;;;;-1:-1:-1;;;;;46547:19:0;-1:-1:-1;;;;;46537:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46505:86;;46613:84;43941:4;46613:68;46663:17;;46639:21;:41;;;;:::i;:::-;46613:21;;:25;:68::i;:84::-;46606:91;;;;;;;;45863:872;:::o;46088:621::-;46726:1;46719:8;;;;45863:872;:::o;32941:201::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;33030:22:0;::::1;33022:73;;;::::0;-1:-1:-1;;;33022:73:0;;20561:2:1;33022:73:0::1;::::0;::::1;20543:21:1::0;20600:2;20580:18;;;20573:30;20639:34;20619:18;;;20612:62;-1:-1:-1;;;20690:18:1;;;20683:36;20736:19;;33022:73:0::1;20359:402:1::0;33022:73:0::1;33106:28;33125:8;33106:18;:28::i;:::-;32941:201:::0;:::o;49128:928::-;45307:10;;49228:7;;-1:-1:-1;;;;;45307:10:0;45321;45307:24;45299:65;;;;-1:-1:-1;;;45299:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;49267:1:::2;49256:8;:12;49248:44;;;::::0;-1:-1:-1;;;49248:44:0;;20968:2:1;49248:44:0::2;::::0;::::2;20950:21:1::0;21007:2;20987:18;;;20980:30;-1:-1:-1;;;21026:18:1;;;21019:49;21085:18;;49248:44:0::2;20766:343:1::0;49248:44:0::2;49315:19;::::0;49345:3:::2;::::0;;49305:54:::2;::::0;-1:-1:-1;;;49305:54:0;;;;::::2;21288:25:1::0;21329:18;;;21322:34;;;49315:19:0::2;::::0;;::::2;-1:-1:-1::0;;;;;49315:19:0::2;::::0;49305:39:::2;::::0;21261:18:1;;49305:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;49397:11:0::2;::::0;49390:44:::2;::::0;-1:-1:-1;;;49390:44:0;;49428:4:::2;49390:44;::::0;::::2;598:51:1::0;49372:15:0::2;::::0;-1:-1:-1;;;;;;49397:11:0;;::::2;::::0;-1:-1:-1;49390:29:0::2;::::0;571:18:1;;49390:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49372:62;;49460:7;49449:8;:18;49445:69;;;49495:7;49484:18;;49445:69;49548:8;49530:15;;:26;49526:85;;;49584:15;;49573:26;;49526:85;49623:21;49647:46;49677:15;;49647:25;49660:11;;49647:8;:12;;:25;;;;:::i;:46::-;49623:70;;49724:11;;49708:13;:27;49704:87;;;-1:-1:-1::0;49768:11:0::2;::::0;49704:87:::2;49815:11;::::0;:30:::2;::::0;49831:13;49815:15:::2;:30::i;:::-;49801:11;:44:::0;49874:15:::2;::::0;:29:::2;::::0;49894:8;49874:19:::2;:29::i;:::-;49856:15;:47:::0;49923:11:::2;::::0;49916:63:::2;::::0;-1:-1:-1;;;;;49923:11:0::2;49957:10;49970:8:::0;49916:32:::2;:63::i;:::-;49997:18;::::0;7541:25:1;;;49997:18:0::2;::::0;7529:2:1;7514:18;49997::0::2;;;;;;;50035:13:::0;-1:-1:-1;;35795:20:0::1;35189:1:::0;36315:22;;36132:213;48563:67;31928:13;:11;:13::i;:::-;48611:11:::1;:9;:11::i;32207:132::-:0;32088:7;32115:6;-1:-1:-1;;;;;32115:6:0;30652:10;32271:23;32263:68;;;;-1:-1:-1;;;32263:68:0;;21569:2:1;32263:68:0;;;21551:21:1;;;21588:18;;;21581:30;21647:34;21627:18;;;21620:62;21699:18;;32263:68:0;21367:356:1;48711:409:0;48770:11;;48811:30;;-1:-1:-1;;;48811:30:0;;48835:4;48811:30;;;598:51:1;-1:-1:-1;;;;;48770:11:0;;;;48748:12;;48770:11;;48811:15;;571:18:1;;48811:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48870:15;;48793:48;;-1:-1:-1;48870:28:0;;48793:48;48870:19;:28::i;:::-;48852:15;:46;48913:11;;48909:204;;48959:11;;48972:19;;48941:60;;-1:-1:-1;;;;;48959:11:0;;;;;48972:19;;;48993:7;48941:17;:60::i;:::-;49026:19;;49055:3;;;49016:52;;-1:-1:-1;;;49016:52:0;;;;;21288:25:1;21329:18;;;21322:34;;;49026:19:0;;;;-1:-1:-1;;;;;49026:19:0;;49016:38;;21261:18:1;;49016:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49088:13;49093:7;49088:13;;;;7541:25:1;;7529:2;7514:18;;7395:177;49088:13:0;;;;;;;;48737:383;;48711:409::o;39085:120::-;38094:16;:14;:16::i;:::-;39144:7:::1;:15:::0;;-1:-1:-1;;39144:15:0::1;::::0;;39175:22:::1;30652:10:::0;39184:12:::1;39175:22;::::0;-1:-1:-1;;;;;616:32:1;;;598:51;;586:2;571:18;39175:22:0::1;;;;;;;39085:120::o:0;35831:293::-;35233:1;35965:7;;:19;;35957:63;;;;-1:-1:-1;;;35957:63:0;;21930:2:1;35957:63:0;;;21912:21:1;21969:2;21949:18;;;21942:30;22008:33;21988:18;;;21981:61;22059:18;;35957:63:0;21728:355:1;35957:63:0;35233:1;36098:7;:18;35831:293::o;38389:108::-;38301:7;;;;38459:9;38451:38;;;;-1:-1:-1;;;38451:38:0;;22290:2:1;38451:38:0;;;22272:21:1;22329:2;22309:18;;;22302:30;-1:-1:-1;;;22348:18:1;;;22341:46;22404:18;;38451:38:0;22088:340:1;17420:205:0;17548:68;;-1:-1:-1;;;;;22691:15:1;;;17548:68:0;;;22673:34:1;22743:15;;22723:18;;;22716:43;22775:18;;;22768:34;;;17521:96:0;;17541:5;;-1:-1:-1;;;17571:27:0;22608:18:1;;17548:68:0;;;;-1:-1:-1;;17548:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:68:0;-1:-1:-1;;;;;;17548:68:0;;;;;;;;;;17521:19;:96::i;26636:98::-;26694:7;26721:5;26725:1;26721;:5;:::i;:::-;26714:12;26636:98;-1:-1:-1;;;26636:98:0:o;27035:::-;27093:7;27120:5;27124:1;27120;:5;:::i;25898:98::-;25956:7;25983:5;25987:1;25983;:5;:::i;50062:1464::-;50276:19;;50327:3;;;50266:80;;-1:-1:-1;;;50266:80:0;;;;;18143:25:1;50340:4:0;18184:18:1;;;18177:60;50127:21:0;;50102:22;;50276:19;;;;-1:-1:-1;;;;;50276:19:0;;50266:60;;18116:18:1;;50266:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50242:104;;50357:33;50403:19;;;;;;;;;-1:-1:-1;;;;;50403:19:0;-1:-1:-1;;;;;50393:59:0;;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50357:97;;50465:24;50508:28;50504:708;;;50553:29;50595:19;;;;;;;;;-1:-1:-1;;;;;50595:19:0;-1:-1:-1;;;;;50585:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50553:86;;50654:14;50689:19;;;;;;;;;-1:-1:-1;;;;;50689:19:0;-1:-1:-1;;;;;50679:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50891:13;;50879:32;;-1:-1:-1;;;50879:32:0;;-1:-1:-1;;;;;50891:13:0;;;50879:32;;;20254:51:1;50906:4:0;20321:18:1;;;20314:34;50654:71:0;;-1:-1:-1;50843:33:0;;50879:11;;;;;;20227:18:1;;50879:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50843:68;;50962:1;50934:25;:29;50926:60;;;;-1:-1:-1;;;50926:60:0;;23410:2:1;50926:60:0;;;23392:21:1;23449:2;23429:18;;;23422:30;-1:-1:-1;;;23468:18:1;;;23461:48;23526:18;;50926:60:0;23208:342:1;50926:60:0;51081:119;43941:4;51081:103;51166:17;;51142:21;:41;;;;:::i;:::-;51082:54;51131:4;51082:44;:25;51112:13;51082:29;:44::i;:54::-;51081:60;;:103::i;:119::-;51062:138;;50538:674;;;50504:708;51248:16;51230:14;:34;;51222:74;;;;-1:-1:-1;;;51222:74:0;;23757:2:1;51222:74:0;;;23739:21:1;23796:2;23776:18;;;23769:30;23835:29;23815:18;;;23808:57;23882:18;;51222:74:0;23555:351:1;51222:74:0;51397:19;;51451:3;;;51387:68;;-1:-1:-1;;;51387:68:0;;;;;7541:25:1;51397:19:0;;;;-1:-1:-1;;;;;51397:19:0;;51387:38;;51433:16;;7514:18:1;;51387:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51497:21;51480:14;:38;;;;:::i;:::-;51466:11;:52;-1:-1:-1;;;;50062:1464:0:o;51534:1122::-;51604:13;;51597:46;;-1:-1:-1;;;51597:46:0;;51637:4;51597:46;;;598:51:1;51574:20:0;;-1:-1:-1;;;;;51604:13:0;;51597:31;;571:18:1;;51597:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51574:69;;51674:1;51658:12;:17;51654:56;;51692:7;51534:1122::o;51654:56::-;51732:13;;51725:35;;;-1:-1:-1;;;;;51732:13:0;;;20254:51:1;;20336:2;20321:18;;20314:34;;;51725:35:0;;20227:18:1;51725:35:0;;;;;;;51814:13;;51773:25;;51801:45;;-1:-1:-1;;;;;51814:13:0;43213:42;51833:12;51801;:45::i;:::-;51773:73;;51882:1;51861:17;:22;51857:61;;51900:7;;51534:1122::o;51857:61::-;51969:13;;51997:11;;:15;51993:154;;52118:17;;52064:50;52096:17;52064:27;43941:4;52064:11;;:15;;:27;;;;:::i;:50::-;52063:72;;;;:::i;:::-;52029:106;;;;:::i;:::-;;;51993:154;52173:13;;52159:109;;-1:-1:-1;;;;;52173:13:0;52188:64;43941:4;52188:48;:12;52205:30;52188:16;:48::i;:64::-;52262:4;52159:13;:109::i;:::-;52380:12;;52298:21;;52279:16;;52369:23;;52365:237;;;52435:12;;52424:23;;:8;:23;:::i;:::-;52489:15;;52481:54;;52409:38;;-1:-1:-1;52463:12:0;;-1:-1:-1;;;;;52489:15:0;;;;52409:38;;52463:12;52481:54;52463:12;52481:54;52409:38;52489:15;52481:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52462:73;;;52558:7;52550:40;;;;-1:-1:-1;;;52550:40:0;;24392:2:1;52550:40:0;;;24374:21:1;24431:2;24411:18;;;24404:30;-1:-1:-1;;;24450:18:1;;;24443:50;24510:18;;52550:40:0;24190:344:1;52550:40:0;52394:208;52365:237;52622:11;;52617:31;;;21288:25:1;;;21344:2;21329:18;;21322:34;;;52617:31:0;;21261:18:1;52617:31:0;;;;;;;51563:1093;;;;;51534:1122::o;33302:191::-;33376:16;33395:6;;-1:-1:-1;;;;;33412:17:0;;;-1:-1:-1;;;;;;33412:17:0;;;;;;33445:40;;33395:6;;;;;;;33445:40;;33376:16;33445:40;33365:128;33302:191;:::o;38826:118::-;37835:19;:17;:19::i;:::-;38886:7:::1;:14:::0;;-1:-1:-1;;38886:14:0::1;38896:4;38886:14;::::0;;38916:20:::1;38923:12;30652:10:::0;;30572:98;16998:177;17108:58;;-1:-1:-1;;;;;20272:32:1;;17108:58:0;;;20254:51:1;20321:18;;;20314:34;;;17081:86:0;;17101:5;;-1:-1:-1;;;17131:23:0;20227:18:1;;17108:58:0;20054:300:1;52664:1038:0;52786:13;;52779:46;;-1:-1:-1;;;52779:46:0;;52819:4;52779:46;;;598:51:1;52756:20:0;;-1:-1:-1;;;;;52786:13:0;;52779:31;;571:18:1;;52779:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52916:13;;52756:69;;-1:-1:-1;52887:62:0;;52903:45;;-1:-1:-1;;;;;52916:13:0;43213:42;52756:69;52903:12;:45::i;:::-;52887:11;;;:15;:62::i;:::-;52873:11;:76;52983:13;;52966;;-1:-1:-1;;;;;52966:13:0;;;52983;;52966:30;52962:146;;53031:13;;53046;;53013:83;;-1:-1:-1;;;;;53031:13:0;;;;53046;53061:19;:12;53078:1;53061:16;:19::i;:::-;53090:4;53013:17;:83::i;:::-;53141:13;;53124;;-1:-1:-1;;;;;53124:13:0;;;53141;;53124:30;53120:146;;53189:13;;53204;;53171:83;;-1:-1:-1;;;;;53189:13:0;;;;53204;53219:19;:12;53236:1;53219:16;:19::i;53171:83::-;53352:13;;53345:46;;-1:-1:-1;;;53345:46:0;;53385:4;53345:46;;;598:51:1;53325:17:0;;-1:-1:-1;;;;;53352:13:0;;53345:31;;571:18:1;;53345:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53429:13;;53422:46;;-1:-1:-1;;;53422:46:0;;53462:4;53422:46;;;598:51:1;53325:66:0;;-1:-1:-1;53402:17:0;;-1:-1:-1;;;;;53429:13:0;;;;53422:31;;571:18:1;;53422:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53402:66;;53495:1;53483:9;:13;:30;;;;;53512:1;53500:9;:13;53483:30;53479:216;;;53544:13;;53559;;53574:6;;53530:73;;-1:-1:-1;;;;;53544:13:0;;;;53559;;-1:-1:-1;;;53574:6:0;;;;53582:9;53593;53530:13;:73::i;:::-;53632:13;;53658;;53623:60;;;-1:-1:-1;;;;;53632:13:0;;;24808:34:1;;24873:2;24858:18;;24851:34;;;53658:13:0;;;;24901:18:1;;;24894:43;24968:2;24953:18;;24946:34;;;53623:60:0;;24757:3:1;24742:19;53623:60:0;24539:447:1;26279:98:0;26337:7;26364:5;26368:1;26364;:5;:::i;47621:194::-;47751:56;-1:-1:-1;;;;;47751:35:0;;47787:7;47796:10;47751:35;:56::i;38574:108::-;38301:7;;;;38633:41;;;;-1:-1:-1;;;38633:41:0;;25193:2:1;38633:41:0;;;25175:21:1;25232:2;25212:18;;;25205:30;-1:-1:-1;;;25251:18:1;;;25244:50;25311:18;;38633:41:0;24991:344:1;21344:649:0;21768:23;21794:69;21822:4;21794:69;;;;;;;;;;;;;;;;;21802:5;-1:-1:-1;;;;;21794:27:0;;;:69;;;;;:::i;:::-;21768:95;;21882:10;:17;21903:1;21882:22;:56;;;;21919:10;21908:30;;;;;;;;;;;;:::i;:::-;21874:111;;;;-1:-1:-1;;;21874:111:0;;25542:2:1;21874:111:0;;;25524:21:1;25581:2;25561:18;;;25554:30;25620:34;25600:18;;;25593:62;-1:-1:-1;;;25671:18:1;;;25664:40;25721:19;;21874:111:0;25340:406:1;56792:338:0;56916:16;;56885:57;;56903:11;;-1:-1:-1;;;;;56916:16:0;56934:7;56885:17;:57::i;:::-;-1:-1:-1;;;;;56957:17:0;;43213:42;56957:17;56953:170;;56999:16;;-1:-1:-1;;;;;57051:24:0;;;56999:16;57051:24;;;:11;:24;;;;;;;;43213:42;57051:28;;;;;;;56999:16;;;;;56991:47;;57039:7;;56999:16;57081:2;57085:25;:15;57105:4;57085:19;:25::i;:::-;56991:120;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56792:338;;;:::o;57138:387::-;57288:16;;57257:57;;57275:11;;-1:-1:-1;;;;;57288:16:0;57306:7;57257:17;:57::i;:::-;57344:12;-1:-1:-1;;;;;57329:27:0;:11;-1:-1:-1;;;;;57329:27:0;;57325:193;;57381:16;;-1:-1:-1;;;;;57436:24:0;;;57381:16;57436:24;;;:11;:24;;;;;;;;:38;;;;;;;;;;57381:16;;;;;57373:50;;57424:7;;57381:16;57476:2;57480:25;:15;57500:4;57480:19;:25::i;:::-;57373:133;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57138:387;;;;:::o;57533:440::-;57701:16;;57674:61;;57692:7;;-1:-1:-1;;;;;57701:16:0;57719:15;57674:17;:61::i;:::-;57773:16;;57746:61;;57764:7;;-1:-1:-1;;;;;57773:16:0;57791:15;57746:17;:61::i;:::-;57826:16;;-1:-1:-1;;;;;57826:16:0;57818:38;57857:7;57866;57875;57884:15;57901;57826:16;;57932:4;57939:25;:15;57959:4;57939:19;:25::i;:::-;57818:147;;;;;;-1:-1:-1;;;;;;57818:147:0;;;-1:-1:-1;;;;;26828:15:1;;;57818:147:0;;;26810:34:1;26880:15;;;26860:18;;;26853:43;26939:14;;26932:22;26912:18;;;26905:50;26971:18;;;26964:34;;;;27014:19;;;27007:35;;;;27058:19;;;27051:35;27102:19;;;27095:35;27167:15;;;27146:19;;;27139:44;27199:19;;;27192:35;;;;26744:19;;57818:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18673:283::-;18793:39;;-1:-1:-1;;;18793:39:0;;18817:4;18793:39;;;27761:34:1;-1:-1:-1;;;;;27831:15:1;;;27811:18;;;27804:43;18770:20:0;;18793:15;;;;;;27696:18:1;;18793:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18770:62;-1:-1:-1;18843:105:0;18863:5;-1:-1:-1;;;18917:7:0;18926:20;18941:5;18770:62;18926:20;:::i;:::-;18870:77;;-1:-1:-1;;;;;20272:32:1;;;18870:77:0;;;20254:51:1;20321:18;;;20314:34;20227:18;;18870:77:0;20054:300:1;10795:229:0;10932:12;10964:52;10986:6;10994:4;11000:1;11003:12;10932;12169;12183:23;12210:6;-1:-1:-1;;;;;12210:11:0;12229:5;12236:4;12210:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12168:73;;;;12259:69;12286:6;12294:7;12303:10;12315:12;12259:26;:69::i;:::-;12252:76;11881:455;-1:-1:-1;;;;;;;11881:455:0:o;14454:644::-;14639:12;14668:7;14664:427;;;14696:17;;14692:290;;-1:-1:-1;;;;;8335:19:0;;;14906:60;;;;-1:-1:-1;;;14906:60:0;;28467:2:1;14906:60:0;;;28449:21:1;28506:2;28486:18;;;28479:30;28545:31;28525:18;;;28518:59;28594:18;;14906:60:0;28265:353:1;14906:60:0;-1:-1:-1;15003:10:0;14996:17;;14664:427;15046:33;15054:10;15066:12;15801:17;;:21;15797:388;;16033:10;16027:17;16090:15;16077:10;16073:2;16069:19;16062:44;15797:388;16160:12;16153:20;;-1:-1:-1;;;16153:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:248:1:-;82:6;90;143:2;131:9;122:7;118:23;114:32;111:52;;;159:1;156;149:12;111:52;-1:-1:-1;;182:23:1;;;252:2;237:18;;;224:32;;-1:-1:-1;14:248:1:o;267:180::-;326:6;379:2;367:9;358:7;354:23;350:32;347:52;;;395:1;392;385:12;347:52;-1:-1:-1;418:23:1;;267:180;-1:-1:-1;267:180:1:o;660:131::-;-1:-1:-1;;;;;735:31:1;;725:42;;715:70;;781:1;778;771:12;796:127;857:10;852:3;848:20;845:1;838:31;888:4;885:1;878:15;912:4;909:1;902:15;928:253;1000:2;994:9;1042:4;1030:17;;1077:18;1062:34;;1098:22;;;1059:62;1056:88;;;1124:18;;:::i;:::-;1160:2;1153:22;928:253;:::o;1186:275::-;1257:2;1251:9;1322:2;1303:13;;-1:-1:-1;;1299:27:1;1287:40;;1357:18;1342:34;;1378:22;;;1339:62;1336:88;;;1404:18;;:::i;:::-;1440:2;1433:22;1186:275;;-1:-1:-1;1186:275:1:o;1466:188::-;1531:4;1564:18;1556:6;1553:30;1550:56;;;1586:18;;:::i;:::-;-1:-1:-1;1631:1:1;1627:14;1643:4;1623:25;;1466:188::o;1659:118::-;1745:5;1738:13;1731:21;1724:5;1721:32;1711:60;;1767:1;1764;1757:12;1782:1293;1841:5;1894:3;1887:4;1879:6;1875:17;1871:27;1861:55;;1912:1;1909;1902:12;1861:55;1948:6;1935:20;1974:4;1998:65;2014:48;2059:2;2014:48;:::i;:::-;1998:65;:::i;:::-;2097:15;;;2159:4;2202:11;;;2190:24;;2186:33;;;2128:12;;;;2085:3;2231:15;;;2228:35;;;2259:1;2256;2249:12;2228:35;2295:2;2287:6;2283:15;2307:739;2323:6;2318:3;2315:15;2307:739;;;2399:2;2393:3;2388;2384:13;2380:22;2377:112;;;2443:1;2472:2;2468;2461:14;2377:112;2515:22;;:::i;:::-;2578:3;2565:17;2595:33;2620:7;2595:33;:::i;:::-;2641:22;;2704:12;;;2691:26;2730:33;2691:26;2730:33;:::i;:::-;2783:14;;;2776:31;2830:2;2873:12;;;2860:26;2899:30;2860:26;2899:30;:::i;:::-;2949:14;;;2942:31;2986:18;;3024:12;;;;2340;;2307:739;;;-1:-1:-1;3064:5:1;;1782:1293;-1:-1:-1;;;;;;;1782:1293:1:o;3080:652::-;3205:6;3213;3221;3274:2;3262:9;3253:7;3249:23;3245:32;3242:52;;;3290:1;3287;3280:12;3242:52;3329:9;3316:23;3348:31;3373:5;3348:31;:::i;:::-;3398:5;-1:-1:-1;3455:2:1;3440:18;;3427:32;3468:33;3427:32;3468:33;:::i;:::-;3520:7;-1:-1:-1;3578:2:1;3563:18;;3550:32;3605:18;3594:30;;3591:50;;;3637:1;3634;3627:12;3591:50;3660:66;3718:7;3709:6;3698:9;3694:22;3660:66;:::i;:::-;3650:76;;;3080:652;;;;;:::o;3737:407::-;3802:5;3836:18;3828:6;3825:30;3822:56;;;3858:18;;:::i;:::-;3896:57;3941:2;3920:15;;-1:-1:-1;;3916:29:1;3947:4;3912:40;3896:57;:::i;:::-;3887:66;;3976:6;3969:5;3962:21;4016:3;4007:6;4002:3;3998:16;3995:25;3992:45;;;4033:1;4030;4023:12;3992:45;4082:6;4077:3;4070:4;4063:5;4059:16;4046:43;4136:1;4129:4;4120:6;4113:5;4109:18;4105:29;4098:40;3737:407;;;;;:::o;4149:1004::-;4254:6;4262;4270;4278;4331:3;4319:9;4310:7;4306:23;4302:33;4299:53;;;4348:1;4345;4338:12;4299:53;4387:9;4374:23;4406:31;4431:5;4406:31;:::i;:::-;4456:5;-1:-1:-1;4508:2:1;4493:18;;4480:32;;-1:-1:-1;4563:2:1;4548:18;;4535:32;4586:18;4616:14;;;4613:34;;;4643:1;4640;4633:12;4613:34;4681:6;4670:9;4666:22;4656:32;;4726:7;4719:4;4715:2;4711:13;4707:27;4697:55;;4748:1;4745;4738:12;4697:55;4771:74;4837:7;4832:2;4819:16;4814:2;4810;4806:11;4771:74;:::i;:::-;4761:84;;4898:2;4887:9;4883:18;4870:32;4854:48;;4927:2;4917:8;4914:16;4911:36;;;4943:1;4940;4933:12;4911:36;-1:-1:-1;4966:24:1;;5021:4;5013:13;;5009:27;-1:-1:-1;4999:55:1;;5050:1;5047;5040:12;4999:55;5073:74;5139:7;5134:2;5121:16;5116:2;5112;5108:11;5073:74;:::i;:::-;5063:84;;;4149:1004;;;;;;;:::o;5158:258::-;5230:1;5240:113;5254:6;5251:1;5248:13;5240:113;;;5330:11;;;5324:18;5311:11;;;5304:39;5276:2;5269:10;5240:113;;;5371:6;5368:1;5365:13;5362:48;;;-1:-1:-1;;5406:1:1;5388:16;;5381:27;5158:258::o;5421:257::-;5462:3;5500:5;5494:12;5527:6;5522:3;5515:19;5543:63;5599:6;5592:4;5587:3;5583:14;5576:4;5569:5;5565:16;5543:63;:::i;:::-;5660:2;5639:15;-1:-1:-1;;5635:29:1;5626:39;;;;5667:4;5622:50;;5421:257;-1:-1:-1;;5421:257:1:o;5683:217::-;5830:2;5819:9;5812:21;5793:4;5850:44;5890:2;5879:9;5875:18;5867:6;5850:44;:::i;6097:383::-;6174:6;6182;6190;6243:2;6231:9;6222:7;6218:23;6214:32;6211:52;;;6259:1;6256;6249:12;6211:52;6298:9;6285:23;6317:31;6342:5;6317:31;:::i;:::-;6367:5;6419:2;6404:18;;6391:32;;-1:-1:-1;6470:2:1;6455:18;;;6442:32;;6097:383;-1:-1:-1;;;6097:383:1:o;6485:905::-;6706:6;6714;6722;6775:2;6763:9;6754:7;6750:23;6746:32;6743:52;;;6791:1;6788;6781:12;6743:52;6831:9;6818:23;6860:18;6901:2;6893:6;6890:14;6887:34;;;6917:1;6914;6907:12;6887:34;6940:66;6998:7;6989:6;6978:9;6974:22;6940:66;:::i;:::-;6930:76;;7059:2;7048:9;7044:18;7031:32;7015:48;;7088:2;7078:8;7075:16;7072:36;;;7104:1;7101;7094:12;7072:36;7127:68;7187:7;7176:8;7165:9;7161:24;7127:68;:::i;:::-;7117:78;;7248:2;7237:9;7233:18;7220:32;7204:48;;7277:2;7267:8;7264:16;7261:36;;;7293:1;7290;7283:12;7261:36;;7316:68;7376:7;7365:8;7354:9;7350:24;7316:68;:::i;7577:315::-;7645:6;7653;7706:2;7694:9;7685:7;7681:23;7677:32;7674:52;;;7722:1;7719;7712:12;7674:52;7761:9;7748:23;7780:31;7805:5;7780:31;:::i;:::-;7830:5;7882:2;7867:18;;;;7854:32;;-1:-1:-1;;;7577:315:1:o;7897:247::-;7956:6;8009:2;7997:9;7988:7;7984:23;7980:32;7977:52;;;8025:1;8022;8015:12;7977:52;8064:9;8051:23;8083:31;8108:5;8083:31;:::i;8149:456::-;8226:6;8234;8242;8295:2;8283:9;8274:7;8270:23;8266:32;8263:52;;;8311:1;8308;8301:12;8263:52;8350:9;8337:23;8369:31;8394:5;8369:31;:::i;:::-;8419:5;-1:-1:-1;8476:2:1;8461:18;;8448:32;8489:33;8448:32;8489:33;:::i;:::-;8149:456;;8541:7;;-1:-1:-1;;;8595:2:1;8580:18;;;;8567:32;;8149:456::o;10671:127::-;10732:10;10727:3;10723:20;10720:1;10713:31;10763:4;10760:1;10753:15;10787:4;10784:1;10777:15;10803:127;10864:10;10859:3;10855:20;10852:1;10845:31;10895:4;10892:1;10885:15;10919:4;10916:1;10909:15;10935:135;10974:3;-1:-1:-1;;10995:17:1;;10992:43;;;11015:18;;:::i;:::-;-1:-1:-1;11062:1:1;11051:13;;10935:135::o;11436:371::-;-1:-1:-1;;;;;;11621:33:1;;11609:46;;11678:13;;11591:3;;11700:61;11678:13;11750:1;11741:11;;11734:4;11722:17;;11700:61;:::i;:::-;11781:16;;;;11799:1;11777:24;;11436:371;-1:-1:-1;;;11436:371:1:o;11812:274::-;11941:3;11979:6;11973:13;11995:53;12041:6;12036:3;12029:4;12021:6;12017:17;11995:53;:::i;:::-;12064:16;;;;;11812:274;-1:-1:-1;;11812:274:1:o;12521:450::-;12744:6;12733:9;12726:25;12787:2;12782;12771:9;12767:18;12760:30;12707:4;12813:44;12853:2;12842:9;12838:18;12830:6;12813:44;:::i;:::-;12905:9;12897:6;12893:22;12888:2;12877:9;12873:18;12866:50;12933:32;12958:6;12950;12933:32;:::i;:::-;12925:40;12521:450;-1:-1:-1;;;;;;12521:450:1:o;12976:352::-;13178:2;13160:21;;;13217:2;13197:18;;;13190:30;13256;13251:2;13236:18;;13229:58;13319:2;13304:18;;12976:352::o;13665:717::-;13731:3;13769:5;13763:12;13796:6;13791:3;13784:19;13822:4;13851:2;13846:3;13842:12;13835:19;;13873:5;13870:1;13863:16;13915:2;13912:1;13902:16;13936:1;13946:411;13960:6;13957:1;13954:13;13946:411;;;14067:13;;-1:-1:-1;;;;;14063:22:1;;;14051:35;;14036:1;14122:14;;;14116:21;14171:18;;;14157:12;;;14150:40;14027:3;14244:19;;;;14265:4;14240:30;14233:38;14226:46;14219:4;14210:14;;14203:70;14302:4;14293:14;;;;14342:4;14330:17;;;;13975:9;13946:411;;;-1:-1:-1;14373:3:1;;13665:717;-1:-1:-1;;;;;13665:717:1:o;14387:385::-;14634:6;14623:9;14616:25;14677:2;14672;14661:9;14657:18;14650:30;14597:4;14697:69;14762:2;14751:9;14747:18;14739:6;14697:69;:::i;14777:886::-;14872:6;14903:2;14946;14934:9;14925:7;14921:23;14917:32;14914:52;;;14962:1;14959;14952:12;14914:52;14995:9;14989:16;15028:18;15020:6;15017:30;15014:50;;;15060:1;15057;15050:12;15014:50;15083:22;;15136:4;15128:13;;15124:27;-1:-1:-1;15114:55:1;;15165:1;15162;15155:12;15114:55;15194:2;15188:9;15217:65;15233:48;15278:2;15233:48;:::i;15217:65::-;15316:15;;;15398:1;15394:10;;;;15386:19;;15382:28;;;15347:12;;;;15422:19;;;15419:39;;;15454:1;15451;15444:12;15419:39;15478:11;;;;15498:135;15514:6;15509:3;15506:15;15498:135;;;15580:10;;15568:23;;15531:12;;;;15611;;;;15498:135;;15668:125;15708:4;15736:1;15733;15730:8;15727:34;;;15741:18;;:::i;:::-;-1:-1:-1;15778:9:1;;15668:125::o;16551:184::-;16621:6;16674:2;16662:9;16653:7;16649:23;16645:32;16642:52;;;16690:1;16687;16680:12;16642:52;-1:-1:-1;16713:16:1;;16551:184;-1:-1:-1;16551:184:1:o;16740:128::-;16780:3;16811:1;16807:6;16804:1;16801:13;16798:39;;;16817:18;;:::i;:::-;-1:-1:-1;16853:9:1;;16740:128::o;16873:402::-;17075:2;17057:21;;;17114:2;17094:18;;;17087:30;17153:34;17148:2;17133:18;;17126:62;-1:-1:-1;;;17219:2:1;17204:18;;17197:36;17265:3;17250:19;;16873:402::o;18248:245::-;18327:6;18335;18388:2;18376:9;18367:7;18363:23;18359:32;18356:52;;;18404:1;18401;18394:12;18356:52;-1:-1:-1;;18427:16:1;;18483:2;18468:18;;;18462:25;18427:16;;18462:25;;-1:-1:-1;18248:245:1:o;19548:::-;19615:6;19668:2;19656:9;19647:7;19643:23;19639:32;19636:52;;;19684:1;19681;19674:12;19636:52;19716:9;19710:16;19735:28;19757:5;19735:28;:::i;19798:251::-;19868:6;19921:2;19909:9;19900:7;19896:23;19892:32;19889:52;;;19937:1;19934;19927:12;19889:52;19969:9;19963:16;19988:31;20013:5;19988:31;:::i;22813:168::-;22853:7;22919:1;22915;22911:6;22907:14;22904:1;22901:21;22896:1;22889:9;22882:17;22878:45;22875:71;;;22926:18;;:::i;:::-;-1:-1:-1;22966:9:1;;22813:168::o;22986:217::-;23026:1;23052;23042:132;;23096:10;23091:3;23087:20;23084:1;23077:31;23131:4;23128:1;23121:15;23159:4;23156:1;23149:15;23042:132;-1:-1:-1;23188:9:1;;22986:217::o;25751:635::-;26090:6;26079:9;26072:25;26133:6;26128:2;26117:9;26113:18;26106:34;26176:3;26171:2;26160:9;26156:18;26149:31;26053:4;26197:70;26262:3;26251:9;26247:19;26239:6;26197:70;:::i;:::-;-1:-1:-1;;;;;26303:32:1;;;;26298:2;26283:18;;26276:60;-1:-1:-1;26367:3:1;26352:19;26345:35;26189:78;25751:635;-1:-1:-1;;;25751:635:1:o;27238:306::-;27326:6;27334;27342;27395:2;27383:9;27374:7;27370:23;27366:32;27363:52;;;27411:1;27408;27401:12;27363:52;27440:9;27434:16;27424:26;;27490:2;27479:9;27475:18;27469:25;27459:35;;27534:2;27523:9;27519:18;27513:25;27503:35;;27238:306;;;;;:::o
Swarm Source
ipfs://40f13427bf31105ffed69b7163ca19b9af9cfc969d3b81ccc555284ec947d64a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.