Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Comp And C... | 20534442 | 18 days ago | IN | 0 ETH | 0.00206947 | ||||
Claim Comp And C... | 19539671 | 157 days ago | IN | 0 ETH | 0.01364975 | ||||
Claim Comp And C... | 16453615 | 591 days ago | IN | 0 ETH | 0.00899209 | ||||
Claim Comp And C... | 15173080 | 776 days ago | IN | 0 ETH | 0.01851799 | ||||
0x60a06040 | 14071010 | 952 days ago | IN | 0 ETH | 0.53852851 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "./interfaces/bloq/ISwapManager.sol"; import "./interfaces/compound/ICompound.sol"; import "./interfaces/IVUSD.sol"; import "./interfaces/ITreasury.sol"; /// @title VUSD Treasury, It stores cTokens and redeem those from Compound as needed. contract Treasury is Context, ReentrancyGuard { using SafeERC20 for IERC20; using EnumerableSet for EnumerableSet.AddressSet; string public constant NAME = "VUSD-Treasury"; string public constant VERSION = "1.3.0"; IVUSD public immutable vusd; address public redeemer; ISwapManager public swapManager = ISwapManager(0xC48ea9A2daA4d816e4c9333D6689C70070010174); // Token => cToken mapping mapping(address => address) public cTokens; // Token => oracle mapping mapping(address => address) public oracles; address private constant COMP = 0xc00e94Cb662C3520282E6f5717214004A7f26888; Comptroller private constant COMPTROLLER = Comptroller(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B); EnumerableSet.AddressSet private _whitelistedTokens; EnumerableSet.AddressSet private _cTokenList; EnumerableSet.AddressSet private _keepers; // Default whitelist token addresses address private constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F; address private constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; address private constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // cToken addresses for default whitelisted tokens // solhint-disable const-name-snakecase address private constant cDAI = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643; address private constant cUSDC = 0x39AA39c021dfbaE8faC545936693aC917d5E7563; address private constant cUSDT = 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9; // solhint-enable // Chainlink price oracle for default whitelisted tokens address private constant DAI_USD = 0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9; address private constant USDC_USD = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6; address private constant USDT_USD = 0x3E7d1eAB13ad0104d2750B8863b489D65364e32D; event UpdatedRedeemer(address indexed previousRedeemer, address indexed newRedeemer); event UpdatedSwapManager(address indexed previousSwapManager, address indexed newSwapManager); constructor(address _vusd) { require(_vusd != address(0), "vusd-address-is-zero"); vusd = IVUSD(_vusd); _keepers.add(_msgSender()); // Add token into the list, add oracle and cToken into the mapping _addToken(DAI, cDAI, DAI_USD); _addToken(USDC, cUSDC, USDC_USD); _addToken(USDT, cUSDT, USDT_USD); _approveRouters(swapManager, type(uint256).max); } modifier onlyGovernor() { require(_msgSender() == governor(), "caller-is-not-the-governor"); _; } modifier onlyAuthorized() { require(_msgSender() == governor() || _msgSender() == redeemer, "caller-is-not-authorized"); _; } modifier onlyKeeperOrGovernor() { require(_msgSender() == governor() || _keepers.contains(_msgSender()), "caller-is-not-authorized"); _; } ////////////////////////////// Only Governor ////////////////////////////// /** * @notice Add token into treasury management system * @dev Add token address in whitelistedTokens list and add cToken in mapping * @param _token address which we want to add in token list. * @param _cToken CToken address correspond to _token * @param _oracle Chainlink oracle address for token/USD feed */ function addWhitelistedToken( address _token, address _cToken, address _oracle ) external onlyGovernor { require(_token != address(0), "token-address-is-zero"); require(_cToken != address(0), "cToken-address-is-zero"); require(_oracle != address(0), "oracle-address-is-zero"); _addToken(_token, _cToken, _oracle); } /** * @notice Remove token from treasury management system * @dev Removing token even if treasury has some balance of that token is intended behavior. * @param _token address which we want to remove from token list. */ function removeWhitelistedToken(address _token) external onlyGovernor { require(_whitelistedTokens.remove(_token), "remove-from-list-failed"); require(_cTokenList.remove(cTokens[_token]), "remove-from-list-failed"); IERC20(_token).safeApprove(cTokens[_token], 0); delete cTokens[_token]; delete cTokens[_token]; } /** * @notice Update redeemer address * @param _newRedeemer new redeemer address */ function updateRedeemer(address _newRedeemer) external onlyGovernor { require(_newRedeemer != address(0), "redeemer-address-is-zero"); require(redeemer != _newRedeemer, "same-redeemer"); emit UpdatedRedeemer(redeemer, _newRedeemer); redeemer = _newRedeemer; } /** * @notice Add given address in keepers list. * @param _keeperAddress keeper address to add. */ function addKeeper(address _keeperAddress) external onlyGovernor { require(_keeperAddress != address(0), "keeper-address-is-zero"); require(_keepers.add(_keeperAddress), "add-keeper-failed"); } /** * @notice Remove given address from keepers list. * @param _keeperAddress keeper address to remove. */ function removeKeeper(address _keeperAddress) external onlyGovernor { require(_keepers.remove(_keeperAddress), "remove-keeper-failed"); } /** * @notice Update swap manager address * @param _newSwapManager new swap manager address */ function updateSwapManager(address _newSwapManager) external onlyGovernor { require(_newSwapManager != address(0), "swap-manager-address-is-zero"); emit UpdatedSwapManager(address(swapManager), _newSwapManager); _approveRouters(swapManager, 0); _approveRouters(ISwapManager(_newSwapManager), type(uint256).max); swapManager = ISwapManager(_newSwapManager); } /////////////////////////////////////////////////////////////////////////// /** * @notice Claim comp from all markets and convert to given token. * Also deposit those tokens to Compound * @param _toToken COMP will be swapped to _toToken * @param _minOut Minimum _toToken expected after conversion */ function claimCompAndConvertTo(address _toToken, uint256 _minOut) external onlyKeeperOrGovernor { require(_whitelistedTokens.contains(_toToken), "token-is-not-supported"); COMPTROLLER.claimComp(address(this), _cTokenList.values()); uint256 _compAmount = IERC20(COMP).balanceOf(address(this)); (address[] memory path, uint256 amountOut, uint256 rIdx) = swapManager.bestOutputFixedInput( COMP, _toToken, _compAmount ); if (amountOut != 0) { swapManager.ROUTERS(rIdx).swapExactTokensForTokens( _compAmount, _minOut, path, address(this), block.timestamp ); } require(CToken(cTokens[_toToken]).mint(IERC20(_toToken).balanceOf(address(this))) == 0, "cToken-mint-failed"); } /** * @notice Migrate assets to new treasury * @param _newTreasury Address of new treasury of VUSD system */ function migrate(address _newTreasury) external onlyGovernor { require(_newTreasury != address(0), "new-treasury-address-is-zero"); require(address(vusd) == ITreasury(_newTreasury).vusd(), "vusd-mismatch"); uint256 _len = _cTokenList.length(); for (uint256 i = 0; i < _len; i++) { address _cToken = _cTokenList.at(i); IERC20(_cToken).safeTransfer(_newTreasury, IERC20(_cToken).balanceOf(address(this))); } } /** * @notice Withdraw given amount of token. * @dev Only Redeemer and Governor are allowed to call * @param _token Token to withdraw, it should be 1 of the supported tokens. * @param _amount token amount to withdraw */ function withdraw(address _token, uint256 _amount) external nonReentrant onlyAuthorized { _withdraw(_token, _amount, _msgSender()); } /** * @notice Withdraw given amount of token. * @dev Only Redeemer and Governor are allowed to call * @param _token Token to withdraw, it should be 1 of the supported tokens. * @param _amount token amount to withdraw * @param _tokenReceiver Address of token receiver */ function withdraw( address _token, uint256 _amount, address _tokenReceiver ) external nonReentrant onlyAuthorized { _withdraw(_token, _amount, _tokenReceiver); } /** * @notice Withdraw multiple tokens. * @dev Only Governor is allowed to call. * @dev _tokens and _amounts array are 1:1 and should have same length * @param _tokens Array of token addresses, tokens should be supported tokens. * @param _amounts Array of token amount to withdraw */ function withdrawMulti(address[] memory _tokens, uint256[] memory _amounts) external nonReentrant onlyGovernor { require(_tokens.length == _amounts.length, "input-length-mismatch"); for (uint256 i = 0; i < _tokens.length; i++) { _withdraw(_tokens[i], _amounts[i], _msgSender()); } } /** * @notice Withdraw all of multiple tokens. * @dev Only Governor is allowed to call. * @param _tokens Array of token addresses, tokens should be supported tokens. */ function withdrawAll(address[] memory _tokens) external nonReentrant onlyGovernor { for (uint256 i = 0; i < _tokens.length; i++) { require(_whitelistedTokens.contains(_tokens[i]), "token-is-not-supported"); CToken _cToken = CToken(cTokens[_tokens[i]]); require(_cToken.redeem(_cToken.balanceOf(address(this))) == 0, "redeem-failed"); IERC20(_tokens[i]).safeTransfer(_msgSender(), IERC20(_tokens[i]).balanceOf(address(this))); } } /** * @notice Sweep any ERC20 token to governor address * @dev OnlyGovernor can call this and CTokens are not allowed to sweep * @param _fromToken Token address to sweep */ function sweep(address _fromToken) external onlyGovernor { // Do not sweep cTokens require(!_cTokenList.contains(_fromToken), "cToken-is-not-allowed-to-sweep"); uint256 _amount = IERC20(_fromToken).balanceOf(address(this)); IERC20(_fromToken).safeTransfer(_msgSender(), _amount); } /** * @notice Current withdrawable amount for given token. * If token is not supported by treasury, no cTokens in mapping, it will return 0. * @param _token Token to withdraw */ function withdrawable(address _token) external view returns (uint256) { if (cTokens[_token] != address(0)) { CToken _cToken = CToken(cTokens[_token]); return (_cToken.balanceOf(address(this)) * _cToken.exchangeRateStored()) / 1e18; } return 0; } /// @dev Governor is defined in VUSD token contract only function governor() public view returns (address) { return vusd.governor(); } /// @notice Return list of cTokens function cTokenList() external view returns (address[] memory) { return _cTokenList.values(); } /// @notice Return list of keepers function keepers() external view returns (address[] memory) { return _keepers.values(); } /// @notice Returns whether given address is whitelisted or not function isWhitelistedToken(address _address) external view returns (bool) { return _whitelistedTokens.contains(_address); } /// @notice Return list of whitelisted tokens function whitelistedTokens() external view returns (address[] memory) { return _whitelistedTokens.values(); } /// @dev Add _token into the list, add _cToken in mapping function _addToken( address _token, address _cToken, address _oracle ) internal { require(_whitelistedTokens.add(_token), "add-in-list-failed"); require(_cTokenList.add(_cToken), "add-in-list-failed"); oracles[_token] = _oracle; cTokens[_token] = _cToken; IERC20(_token).safeApprove(_cToken, type(uint256).max); } /// @notice Approve all routers to spend COMP function _approveRouters(ISwapManager _swapManager, uint256 _amount) internal { for (uint256 i = 0; i < _swapManager.N_DEX(); i++) { IERC20(COMP).safeApprove(address(swapManager.ROUTERS(i)), _amount); } } function _withdraw( address _token, uint256 _amount, address _tokenReceiver ) internal { require(_whitelistedTokens.contains(_token), "token-is-not-supported"); require(CToken(cTokens[_token]).redeemUnderlying(_amount) == 0, "redeem-underlying-failed"); IERC20(_token).safeTransfer(_tokenReceiver, _amount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @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() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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. */ 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]. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.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; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } 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)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } 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"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @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"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; interface ITreasury { function withdraw(address _token, uint256 _amount) external; function withdraw( address _token, uint256 _amount, address _tokenReceiver ) external; function isWhitelistedToken(address _address) external view returns (bool); function oracles(address _token) external view returns (address); function withdrawable(address _token) external view returns (uint256); function whitelistedTokens() external view returns (address[] memory); function vusd() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IVUSD is IERC20, IERC20Permit { function burnFrom(address _user, uint256 _amount) external; function mint(address _to, uint256 _amount) external; function multiTransfer(address[] memory _recipients, uint256[] memory _amounts) external returns (bool); function updateMinter(address _newMinter) external; function updateTreasury(address _newTreasury) external; function governor() external view returns (address _governor); function minter() external view returns (address _minter); function treasury() external view returns (address _treasury); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "../uniswap/IUniswap.sol"; //solhint-disable func-name-mixedcase interface ISwapManager { event OracleCreated(address indexed _sender, address indexed _newOracle, uint256 _period); function N_DEX() external view returns (uint256); function ROUTERS(uint256 i) external view returns (IUniswap); function bestOutputFixedInput( address _from, address _to, uint256 _amountIn ) external view returns ( address[] memory path, uint256 amountOut, uint256 rIdx ); function bestPathFixedInput( address _from, address _to, uint256 _amountIn, uint256 _i ) external view returns (address[] memory path, uint256 amountOut); function bestInputFixedOutput( address _from, address _to, uint256 _amountOut ) external view returns ( address[] memory path, uint256 amountIn, uint256 rIdx ); function bestPathFixedOutput( address _from, address _to, uint256 _amountOut, uint256 _i ) external view returns (address[] memory path, uint256 amountIn); function safeGetAmountsOut( uint256 _amountIn, address[] memory _path, uint256 _i ) external view returns (uint256[] memory result); function unsafeGetAmountsOut( uint256 _amountIn, address[] memory _path, uint256 _i ) external view returns (uint256[] memory result); function safeGetAmountsIn( uint256 _amountOut, address[] memory _path, uint256 _i ) external view returns (uint256[] memory result); function unsafeGetAmountsIn( uint256 _amountOut, address[] memory _path, uint256 _i ) external view returns (uint256[] memory result); function comparePathsFixedInput( address[] memory pathA, address[] memory pathB, uint256 _amountIn, uint256 _i ) external view returns (address[] memory path, uint256 amountOut); function comparePathsFixedOutput( address[] memory pathA, address[] memory pathB, uint256 _amountOut, uint256 _i ) external view returns (address[] memory path, uint256 amountIn); function ours(address a) external view returns (bool); function oracleCount() external view returns (uint256); function oracleAt(uint256 idx) external view returns (address); function getOracle( address _tokenA, address _tokenB, uint256 _period, uint256 _i ) external view returns (address); function createOrUpdateOracle( address _tokenA, address _tokenB, uint256 _period, uint256 _i ) external returns (address oracleAddr); function consultForFree( address _from, address _to, uint256 _amountIn, uint256 _period, uint256 _i ) external view returns (uint256 amountOut, uint256 lastUpdatedAt); /// get the data we want and pay the gas to update function consult( address _from, address _to, uint256 _amountIn, uint256 _period, uint256 _i ) external returns ( uint256 amountOut, uint256 lastUpdatedAt, bool updated ); function updateOracles() external returns (uint256 updated, uint256 expected); function updateOracles(address[] memory _oracleAddrs) external returns (uint256 updated, uint256 expected); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface CToken is IERC20 { function accrueInterest() external returns (uint256); function balanceOfUnderlying(address owner) external returns (uint256); function exchangeRateCurrent() external returns (uint256); function exchangeRateStored() external view returns (uint256); function mint() external payable; // For ETH function mint(uint256 mintAmount) external returns (uint256); // For ERC20 function redeem(uint256 redeemTokens) external returns (uint256); function redeemUnderlying(uint256 redeemAmount) external returns (uint256); } interface Comptroller { function claimComp(address holder, address[] memory) external; function compAccrued(address holder) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.3; interface IUniswap { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": false, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vusd","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRedeemer","type":"address"},{"indexed":true,"internalType":"address","name":"newRedeemer","type":"address"}],"name":"UpdatedRedeemer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousSwapManager","type":"address"},{"indexed":true,"internalType":"address","name":"newSwapManager","type":"address"}],"name":"UpdatedSwapManager","type":"event"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_keeperAddress","type":"address"}],"name":"addKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_cToken","type":"address"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"addWhitelistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cTokenList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"cTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toToken","type":"address"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"claimCompAndConvertTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newTreasury","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oracles","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redeemer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_keeperAddress","type":"address"}],"name":"removeKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"removeWhitelistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapManager","outputs":[{"internalType":"contract ISwapManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRedeemer","type":"address"}],"name":"updateRedeemer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSwapManager","type":"address"}],"name":"updateSwapManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vusd","outputs":[{"internalType":"contract IVUSD","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistedTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_tokenReceiver","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"withdrawMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405273c48ea9a2daa4d816e4c9333d6689c70070010174600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b50604051620060413803806200604183398181016040528101906200008c919062000ba8565b6001600081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000107576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000fe9062000e73565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250506200016862000152620002b160201b60201c565b6009620002b960201b620027c91790919060201c565b50620001b8736b175474e89094c44da98b954eedeac495271d0f735d3a536e4d6dbd6114cc1ead35777bab948e364373aed0c38402a5d19df6e4c03f4e2dced6e29c1ee9620002f160201b60201c565b6200020773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb487339aa39c021dfbae8fac545936693ac917d5e7563738fffffd4afb6115b954bd326cbe7b4ba576818f6620002f160201b60201c565b6200025673dac17f958d2ee523a2206206994597c13d831ec773f650c3d88d12db855b8bf7d11be6c55a4e07dcc9733e7d1eab13ad0104d2750b8863b489d65364e32d620002f160201b60201c565b620002aa600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff620004fe60201b60201c565b5062001280565b600033905090565b6000620002e9836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200069c60201b60201c565b905092915050565b6200030c836005620002b960201b620027c91790919060201c565b6200034e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003459062000eb7565b60405180910390fd5b62000369826007620002b960201b620027c91790919060201c565b620003ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003a29062000eb7565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004f9827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff166200071660201b620027f9179092919060201c565b505050565b60005b8273ffffffffffffffffffffffffffffffffffffffff1663c2fba6676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200054857600080fd5b505afa1580156200055d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000583919062000c2c565b811015620006975762000681600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e74a6f7836040518263ffffffff1660e01b8152600401620005ec919062000f3f565b60206040518083038186803b1580156200060557600080fd5b505afa1580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000640919062000c00565b8373c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166200071660201b620027f9179092919060201c565b80806200068e9062001022565b91505062000501565b505050565b6000620006b083836200088860201b60201c565b6200070b57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000710565b600090505b92915050565b6000811480620007b6575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b81526004016200076092919062000df5565b60206040518083038186803b1580156200077957600080fd5b505afa1580156200078e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007b4919062000c2c565b145b620007f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007ef9062000f1d565b60405180910390fd5b620008838363095ea7b360e01b84846040516024016200081a92919062000e22565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620008ab60201b60201c565b505050565b600080836001016000848152602001908152602001600020541415905092915050565b600062000914826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200097f60201b62002957179092919060201c565b90506000815111156200097a578080602001905181019062000937919062000bd4565b62000979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009709062000efb565b60405180910390fd5b5b505050565b60606200099684846000856200099f60201b60201c565b90509392505050565b606082471015620009e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009de9062000e95565b60405180910390fd5b620009f88562000acd60201b60201c565b62000a3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a319062000ed9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405162000a65919062000ddc565b60006040518083038185875af1925050503d806000811462000aa4576040519150601f19603f3d011682016040523d82523d6000602084013e62000aa9565b606091505b509150915062000ac182828662000ae060201b60201c565b92505050949350505050565b600080823b905060008111915050919050565b6060831562000af25782905062000b45565b60008351111562000b065782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b3c919062000e4f565b60405180910390fd5b9392505050565b60008151905062000b5d8162001218565b92915050565b60008151905062000b748162001232565b92915050565b60008151905062000b8b816200124c565b92915050565b60008151905062000ba28162001266565b92915050565b60006020828403121562000bbb57600080fd5b600062000bcb8482850162000b4c565b91505092915050565b60006020828403121562000be757600080fd5b600062000bf78482850162000b63565b91505092915050565b60006020828403121562000c1357600080fd5b600062000c238482850162000b7a565b91505092915050565b60006020828403121562000c3f57600080fd5b600062000c4f8482850162000b91565b91505092915050565b62000c638162000f8e565b82525050565b600062000c768262000f5c565b62000c82818562000f72565b935062000c9481856020860162000fec565b80840191505092915050565b600062000cad8262000f67565b62000cb9818562000f7d565b935062000ccb81856020860162000fec565b62000cd6816200109f565b840191505092915050565b600062000cf060148362000f7d565b915062000cfd82620010b0565b602082019050919050565b600062000d1760268362000f7d565b915062000d2482620010d9565b604082019050919050565b600062000d3e60128362000f7d565b915062000d4b8262001128565b602082019050919050565b600062000d65601d8362000f7d565b915062000d728262001151565b602082019050919050565b600062000d8c602a8362000f7d565b915062000d99826200117a565b604082019050919050565b600062000db360368362000f7d565b915062000dc082620011c9565b604082019050919050565b62000dd68162000fe2565b82525050565b600062000dea828462000c69565b915081905092915050565b600060408201905062000e0c600083018562000c58565b62000e1b602083018462000c58565b9392505050565b600060408201905062000e39600083018562000c58565b62000e48602083018462000dcb565b9392505050565b6000602082019050818103600083015262000e6b818462000ca0565b905092915050565b6000602082019050818103600083015262000e8e8162000ce1565b9050919050565b6000602082019050818103600083015262000eb08162000d08565b9050919050565b6000602082019050818103600083015262000ed28162000d2f565b9050919050565b6000602082019050818103600083015262000ef48162000d56565b9050919050565b6000602082019050818103600083015262000f168162000d7d565b9050919050565b6000602082019050818103600083015262000f388162000da4565b9050919050565b600060208201905062000f56600083018462000dcb565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000f9b8262000fc2565b9050919050565b60008115159050919050565b600062000fbb8262000f8e565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200100c57808201518184015260208101905062000fef565b838111156200101c576000848401525b50505050565b60006200102f8262000fe2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562001065576200106462001070565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000601f19601f8301169050919050565b7f767573642d616464726573732d69732d7a65726f000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b620012238162000f8e565b81146200122f57600080fd5b50565b6200123d8162000fa2565b81146200124957600080fd5b50565b620012578162000fae565b81146200126357600080fd5b50565b620012718162000fe2565b81146200127d57600080fd5b50565b60805160601c614d94620012ad60003960008181610664015281816124b301526126270152614d946000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80636a95385f116100de578063ab37f48611610097578063ce5494bb11610071578063ce5494bb14610459578063edac520314610475578063f3fef3a314610493578063ffa1ad74146104af5761018e565b8063ab37f486146103c9578063addd5099146103f9578063ce513b6f146104295761018e565b80636a95385f14610305578063709d039d146103235780637d138e13146103415780638c0b09d01461035d578063951dc22c1461038d578063a3f4df7e146103ab5761018e565b80634032b72b1161014b57806356f0693e1161012557806356f0693e146102935780635e1762a0146102af5780636568a279146102cd57806369328dec146102e95761018e565b80634032b72b1461023f578063428415311461025b5780634c36fad7146102775761018e565b806301681a62146101935780630c340a24146101af57806314ae9f2e146101cd5780631c88705d146101e957806320ab954e146102055780632ba29d3814610221575b600080fd5b6101ad60048036038101906101a891906137d9565b6104cd565b005b6101b7610660565b6040516101c49190613fb4565b60405180910390f35b6101e760048036038101906101e291906137d9565b610705565b005b61020360048036038101906101fe91906137d9565b6107d7565b005b61021f600480360381019061021a919061382b565b610aaa565b005b610229610c86565b6040516102369190613fb4565b60405180910390f35b610259600480360381019061025491906137d9565b610cac565b005b61027560048036038101906102709190613946565b610dee565b005b610291600480360381019061028c91906137d9565b610fba565b005b6102ad60048036038101906102a8919061387a565b6111bd565b005b6102b76117b4565b6040516102c49190614088565b60405180910390f35b6102e760048036038101906102e29190613905565b6117c5565b005b61030360048036038101906102fe91906138b6565b611c81565b005b61030d611dc2565b60405161031a9190614088565b60405180910390f35b61032b611dd3565b60405161033891906140c5565b60405180910390f35b61035b600480360381019061035691906137d9565b611df9565b005b610377600480360381019061037291906137d9565b612036565b6040516103849190613fb4565b60405180910390f35b610395612069565b6040516103a29190614088565b60405180910390f35b6103b361207a565b6040516103c091906140fb565b60405180910390f35b6103e360048036038101906103de91906137d9565b6120b3565b6040516103f091906140aa565b60405180910390f35b610413600480360381019061040e91906137d9565b6120d0565b6040516104209190613fb4565b60405180910390f35b610443600480360381019061043e91906137d9565b612103565b604051610450919061445d565b60405180910390f35b610473600480360381019061046e91906137d9565b612331565b005b61047d612625565b60405161048a91906140e0565b60405180910390f35b6104ad60048036038101906104a8919061387a565b612649565b005b6104b7612790565b6040516104c491906140fb565b60405180910390f35b6104d5610660565b73ffffffffffffffffffffffffffffffffffffffff166104f361296f565b73ffffffffffffffffffffffffffffffffffffffff1614610549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105409061421d565b60405180910390fd5b61055d81600761297790919063ffffffff16565b1561059d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105949061411d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105d89190613fb4565b60206040518083038186803b1580156105f057600080fd5b505afa158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190613aac565b905061065c61063561296f565b828473ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156106c857600080fd5b505afa1580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190613802565b905090565b61070d610660565b73ffffffffffffffffffffffffffffffffffffffff1661072b61296f565b73ffffffffffffffffffffffffffffffffffffffff1614610781576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107789061421d565b60405180910390fd5b610795816009612a2d90919063ffffffff16565b6107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb906141bd565b60405180910390fd5b50565b6107df610660565b73ffffffffffffffffffffffffffffffffffffffff166107fd61296f565b73ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a9061421d565b60405180910390fd5b610867816005612a2d90919063ffffffff16565b6108a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089d906142bd565b60405180910390fd5b610919600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007612a2d90919063ffffffff16565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f906142bd565b60405180910390fd5b6109e3600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610ab2610660565b73ffffffffffffffffffffffffffffffffffffffff16610ad061296f565b73ffffffffffffffffffffffffffffffffffffffff1614610b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1d9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d9061423d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd9061413d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d906142fd565b60405180910390fd5b610c81838383612a5d565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cb4610660565b73ffffffffffffffffffffffffffffffffffffffff16610cd261296f565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f9061443d565b60405180910390fd5b610dac8160096127c990919063ffffffff16565b610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061415d565b60405180910390fd5b50565b60026000541415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906143dd565b60405180910390fd5b6002600081905550610e44610660565b73ffffffffffffffffffffffffffffffffffffffff16610e6261296f565b73ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf9061421d565b60405180910390fd5b8051825114610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061417d565b60405180910390fd5b60005b8251811015610fad57610f9a838281518110610f44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610f9561296f565b612c4f565b8080610fa59061477f565b915050610eff565b5060016000819055505050565b610fc2610660565b73ffffffffffffffffffffffffffffffffffffffff16610fe061296f565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d9061437d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2d19927e7cac08ceb98b38898a4fdff6da6a27295b9a2d62fe250408ebe044e160405160405180910390a361114f600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612dfe565b611179817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612dfe565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111c5610660565b73ffffffffffffffffffffffffffffffffffffffff166111e361296f565b73ffffffffffffffffffffffffffffffffffffffff16148061121c575061121b61120b61296f565b600961297790919063ffffffff16565b5b61125b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112529061441d565b60405180910390fd5b61126f82600561297790919063ffffffff16565b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061425d565b60405180910390fd5b733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16631c3db2e0306112e96007612f87565b6040518363ffffffff1660e01b815260040161130692919061402f565b600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050600073c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113879190613fb4565b60206040518083038186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190613aac565b90506000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8f983c873c00e94cb662c3520282e6f5717214004a7f2688888876040518463ffffffff1660e01b815260040161145193929190613ff8565b60006040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a691906139b2565b925092509250600082146115f857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e74a6f7826040518263ffffffff1660e01b815260040161150f919061445d565b60206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190613a83565b73ffffffffffffffffffffffffffffffffffffffff166338ed173985878630426040518663ffffffff1660e01b815260040161159f959493929190614478565b600060405180830381600087803b1580156115b957600080fd5b505af11580156115cd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115f69190613a19565b505b6000600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d688873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116ae9190613fb4565b60206040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190613aac565b6040518263ffffffff1660e01b815260040161171a919061445d565b602060405180830381600087803b15801561173457600080fd5b505af1158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c9190613aac565b146117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a3906143bd565b60405180910390fd5b505050505050565b60606117c06005612f87565b905090565b6002600054141561180b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611802906143dd565b60405180910390fd5b600260008190555061181b610660565b73ffffffffffffffffffffffffffffffffffffffff1661183961296f565b73ffffffffffffffffffffffffffffffffffffffff161461188f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118869061421d565b60405180910390fd5b60005b8151811015611c75576118ef8282815181106118d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600561297790919063ffffffff16565b61192e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119259061425d565b60405180910390fd5b60006003600084848151811061196d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a758373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a299190613fb4565b60206040518083038186803b158015611a4157600080fd5b505afa158015611a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a799190613aac565b6040518263ffffffff1660e01b8152600401611a95919061445d565b602060405180830381600087803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae79190613aac565b14611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e9061433d565b60405180910390fd5b611c61611b3261296f565b848481518110611b6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611bab9190613fb4565b60206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190613aac565b858581518110611c34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b508080611c6d9061477f565b915050611892565b50600160008190555050565b60026000541415611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906143dd565b60405180910390fd5b6002600081905550611cd7610660565b73ffffffffffffffffffffffffffffffffffffffff16611cf561296f565b73ffffffffffffffffffffffffffffffffffffffff161480611d6b5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d5361296f565b73ffffffffffffffffffffffffffffffffffffffff16145b611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da19061441d565b60405180910390fd5b611db5838383612c4f565b6001600081905550505050565b6060611dce6007612f87565b905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e01610660565b73ffffffffffffffffffffffffffffffffffffffff16611e1f61296f565b73ffffffffffffffffffffffffffffffffffffffff1614611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906141fd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061429d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fbb0958cd5add04c553a378aa342c839507b619a0459617e004c5d13602cfa72360405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606120756009612f87565b905090565b6040518060400160405280600d81526020017f565553442d54726561737572790000000000000000000000000000000000000081525081565b60006120c982600561297790919063ffffffff16565b9050919050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612327576000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050670de0b6b3a76400008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224a57600080fd5b505afa15801561225e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122829190613aac565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122bb9190613fb4565b60206040518083038186803b1580156122d357600080fd5b505afa1580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190613aac565b61231591906145eb565b61231f91906145ba565b91505061232c565b600090505b919050565b612339610660565b73ffffffffffffffffffffffffffffffffffffffff1661235761296f565b73ffffffffffffffffffffffffffffffffffffffff16146123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a49061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124149061419d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663edac52036040518163ffffffff1660e01b815260040160206040518083038186803b15801561246357600080fd5b505afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b9190613802565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f9061431d565b60405180910390fd5b60006125346007612fa8565b905060005b81811015612620576000612557826007612fbd90919063ffffffff16565b905061260c848273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125969190613fb4565b60206040518083038186803b1580156125ae57600080fd5b505afa1580156125c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e69190613aac565b8373ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b5080806126189061477f565b915050612539565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002600054141561268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906143dd565b60405180910390fd5b600260008190555061269f610660565b73ffffffffffffffffffffffffffffffffffffffff166126bd61296f565b73ffffffffffffffffffffffffffffffffffffffff1614806127335750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661271b61296f565b73ffffffffffffffffffffffffffffffffffffffff16145b612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127699061441d565b60405180910390fd5b612784828261277f61296f565b612c4f565b60016000819055505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60006127f1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612fd7565b905092915050565b6000811480612892575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612840929190613fcf565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128909190613aac565b145b6128d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c8906143fd565b60405180910390fd5b6129528363095ea7b360e01b84846040516024016128f092919061405f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613047565b505050565b6060612966848460008561310e565b90509392505050565b600033905090565b600061299f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613222565b905092915050565b612a288363a9059cbb60e01b84846040516024016129c692919061405f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613047565b505050565b6000612a55836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613245565b905092915050565b612a718360056127c990919063ffffffff16565b612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa79061427d565b60405180910390fd5b612ac48260076127c990919063ffffffff16565b612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa9061427d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612c4a827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b505050565b612c6383600561297790919063ffffffff16565b612ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c999061425d565b60405180910390fd5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663852a12e3846040518263ffffffff1660e01b8152600401612d3c919061445d565b602060405180830381600087803b158015612d5657600080fd5b505af1158015612d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8e9190613aac565b14612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc5906142dd565b60405180910390fd5b612df981838573ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b505050565b60005b8273ffffffffffffffffffffffffffffffffffffffff1663c2fba6676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4757600080fd5b505afa158015612e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7f9190613aac565b811015612f8257612f6f600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e74a6f7836040518263ffffffff1660e01b8152600401612ee4919061445d565b60206040518083038186803b158015612efc57600080fd5b505afa158015612f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f349190613a83565b8373c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b8080612f7a9061477f565b915050612e01565b505050565b60606000612f97836000016133cb565b905060608190508092505050919050565b6000612fb682600001613427565b9050919050565b6000612fcc8360000183613438565b60001c905092915050565b6000612fe38383613222565b61303c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613041565b600090505b92915050565b60006130a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129579092919063ffffffff16565b905060008151111561310957808060200190518101906130c99190613a5a565b613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff9061439d565b60405180910390fd5b5b505050565b606082471015613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314a906141dd565b60405180910390fd5b61315c85613489565b61319b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131929061435d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131c49190613f9d565b60006040518083038185875af1925050503d8060008114613201576040519150601f19603f3d011682016040523d82523d6000602084013e613206565b606091505b509150915061321682828661349c565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133bf5760006001826132779190614645565b905060006001866000018054905061328f9190614645565b905081811461334a5760008660000182815481106132d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613320577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613384577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506133c5565b60009150505b92915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561341b57602002820191906000526020600020905b815481526020019060010190808311613407575b50505050509050919050565b600081600001805490509050919050565b6000826000018281548110613476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600080823b905060008111915050919050565b606083156134ac578290506134fc565b6000835111156134bf5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f391906140fb565b60405180910390fd5b9392505050565b6000613516613511846144f7565b6144d2565b9050808382526020820190508285602086028201111561353557600080fd5b60005b85811015613565578161354b88826136b3565b845260208401935060208301925050600181019050613538565b5050509392505050565b600061358261357d846144f7565b6144d2565b905080838252602082019050828560208602820111156135a157600080fd5b60005b858110156135d157816135b788826136c8565b8452602084019350602083019250506001810190506135a4565b5050509392505050565b60006135ee6135e984614523565b6144d2565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d578161362388826137af565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614523565b6144d2565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f88826137c4565b84526020840193506020830192505060018101905061367c565b5050509392505050565b6000813590506136c281614d02565b92915050565b6000815190506136d781614d02565b92915050565b600082601f8301126136ee57600080fd5b81356136fe848260208601613503565b91505092915050565b600082601f83011261371857600080fd5b815161372884826020860161356f565b91505092915050565b600082601f83011261374257600080fd5b81356137528482602086016135db565b91505092915050565b600082601f83011261376c57600080fd5b815161377c848260208601613647565b91505092915050565b60008151905061379481614d19565b92915050565b6000815190506137a981614d30565b92915050565b6000813590506137be81614d47565b92915050565b6000815190506137d381614d47565b92915050565b6000602082840312156137eb57600080fd5b60006137f9848285016136b3565b91505092915050565b60006020828403121561381457600080fd5b6000613822848285016136c8565b91505092915050565b60008060006060848603121561384057600080fd5b600061384e868287016136b3565b935050602061385f868287016136b3565b9250506040613870868287016136b3565b9150509250925092565b6000806040838503121561388d57600080fd5b600061389b858286016136b3565b92505060206138ac858286016137af565b9150509250929050565b6000806000606084860312156138cb57600080fd5b60006138d9868287016136b3565b93505060206138ea868287016137af565b92505060406138fb868287016136b3565b9150509250925092565b60006020828403121561391757600080fd5b600082013567ffffffffffffffff81111561393157600080fd5b61393d848285016136dd565b91505092915050565b6000806040838503121561395957600080fd5b600083013567ffffffffffffffff81111561397357600080fd5b61397f858286016136dd565b925050602083013567ffffffffffffffff81111561399c57600080fd5b6139a885828601613731565b9150509250929050565b6000806000606084860312156139c757600080fd5b600084015167ffffffffffffffff8111156139e157600080fd5b6139ed86828701613707565b93505060206139fe868287016137c4565b9250506040613a0f868287016137c4565b9150509250925092565b600060208284031215613a2b57600080fd5b600082015167ffffffffffffffff811115613a4557600080fd5b613a518482850161375b565b91505092915050565b600060208284031215613a6c57600080fd5b6000613a7a84828501613785565b91505092915050565b600060208284031215613a9557600080fd5b6000613aa38482850161379a565b91505092915050565b600060208284031215613abe57600080fd5b6000613acc848285016137c4565b91505092915050565b6000613ae18383613aed565b60208301905092915050565b613af681614679565b82525050565b613b0581614679565b82525050565b6000613b168261455f565b613b20818561458d565b9350613b2b8361454f565b8060005b83811015613b5c578151613b438882613ad5565b9750613b4e83614580565b925050600181019050613b2f565b5085935050505092915050565b613b728161468b565b82525050565b6000613b838261456a565b613b8d818561459e565b9350613b9d81856020860161471b565b80840191505092915050565b613bb2816146d3565b82525050565b613bc1816146f7565b82525050565b6000613bd282614575565b613bdc81856145a9565b9350613bec81856020860161471b565b613bf581614855565b840191505092915050565b6000613c0d601e836145a9565b9150613c1882614866565b602082019050919050565b6000613c306016836145a9565b9150613c3b8261488f565b602082019050919050565b6000613c536011836145a9565b9150613c5e826148b8565b602082019050919050565b6000613c766015836145a9565b9150613c81826148e1565b602082019050919050565b6000613c99601c836145a9565b9150613ca48261490a565b602082019050919050565b6000613cbc6014836145a9565b9150613cc782614933565b602082019050919050565b6000613cdf6026836145a9565b9150613cea8261495c565b604082019050919050565b6000613d026018836145a9565b9150613d0d826149ab565b602082019050919050565b6000613d25601a836145a9565b9150613d30826149d4565b602082019050919050565b6000613d486015836145a9565b9150613d53826149fd565b602082019050919050565b6000613d6b6016836145a9565b9150613d7682614a26565b602082019050919050565b6000613d8e6012836145a9565b9150613d9982614a4f565b602082019050919050565b6000613db1600d836145a9565b9150613dbc82614a78565b602082019050919050565b6000613dd46017836145a9565b9150613ddf82614aa1565b602082019050919050565b6000613df76018836145a9565b9150613e0282614aca565b602082019050919050565b6000613e1a6016836145a9565b9150613e2582614af3565b602082019050919050565b6000613e3d600d836145a9565b9150613e4882614b1c565b602082019050919050565b6000613e60600d836145a9565b9150613e6b82614b45565b602082019050919050565b6000613e83601d836145a9565b9150613e8e82614b6e565b602082019050919050565b6000613ea6601c836145a9565b9150613eb182614b97565b602082019050919050565b6000613ec9602a836145a9565b9150613ed482614bc0565b604082019050919050565b6000613eec6012836145a9565b9150613ef782614c0f565b602082019050919050565b6000613f0f601f836145a9565b9150613f1a82614c38565b602082019050919050565b6000613f326036836145a9565b9150613f3d82614c61565b604082019050919050565b6000613f556018836145a9565b9150613f6082614cb0565b602082019050919050565b6000613f786016836145a9565b9150613f8382614cd9565b602082019050919050565b613f97816146c9565b82525050565b6000613fa98284613b78565b915081905092915050565b6000602082019050613fc96000830184613afc565b92915050565b6000604082019050613fe46000830185613afc565b613ff16020830184613afc565b9392505050565b600060608201905061400d6000830186613afc565b61401a6020830185613afc565b6140276040830184613f8e565b949350505050565b60006040820190506140446000830185613afc565b81810360208301526140568184613b0b565b90509392505050565b60006040820190506140746000830185613afc565b6140816020830184613f8e565b9392505050565b600060208201905081810360008301526140a28184613b0b565b905092915050565b60006020820190506140bf6000830184613b69565b92915050565b60006020820190506140da6000830184613ba9565b92915050565b60006020820190506140f56000830184613bb8565b92915050565b600060208201905081810360008301526141158184613bc7565b905092915050565b6000602082019050818103600083015261413681613c00565b9050919050565b6000602082019050818103600083015261415681613c23565b9050919050565b6000602082019050818103600083015261417681613c46565b9050919050565b6000602082019050818103600083015261419681613c69565b9050919050565b600060208201905081810360008301526141b681613c8c565b9050919050565b600060208201905081810360008301526141d681613caf565b9050919050565b600060208201905081810360008301526141f681613cd2565b9050919050565b6000602082019050818103600083015261421681613cf5565b9050919050565b6000602082019050818103600083015261423681613d18565b9050919050565b6000602082019050818103600083015261425681613d3b565b9050919050565b6000602082019050818103600083015261427681613d5e565b9050919050565b6000602082019050818103600083015261429681613d81565b9050919050565b600060208201905081810360008301526142b681613da4565b9050919050565b600060208201905081810360008301526142d681613dc7565b9050919050565b600060208201905081810360008301526142f681613dea565b9050919050565b6000602082019050818103600083015261431681613e0d565b9050919050565b6000602082019050818103600083015261433681613e30565b9050919050565b6000602082019050818103600083015261435681613e53565b9050919050565b6000602082019050818103600083015261437681613e76565b9050919050565b6000602082019050818103600083015261439681613e99565b9050919050565b600060208201905081810360008301526143b681613ebc565b9050919050565b600060208201905081810360008301526143d681613edf565b9050919050565b600060208201905081810360008301526143f681613f02565b9050919050565b6000602082019050818103600083015261441681613f25565b9050919050565b6000602082019050818103600083015261443681613f48565b9050919050565b6000602082019050818103600083015261445681613f6b565b9050919050565b60006020820190506144726000830184613f8e565b92915050565b600060a08201905061448d6000830188613f8e565b61449a6020830187613f8e565b81810360408301526144ac8186613b0b565b90506144bb6060830185613afc565b6144c86080830184613f8e565b9695505050505050565b60006144dc6144ed565b90506144e8828261474e565b919050565b6000604051905090565b600067ffffffffffffffff82111561451257614511614826565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561453e5761453d614826565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006145c5826146c9565b91506145d0836146c9565b9250826145e0576145df6147f7565b5b828204905092915050565b60006145f6826146c9565b9150614601836146c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463a576146396147c8565b5b828202905092915050565b6000614650826146c9565b915061465b836146c9565b92508282101561466e5761466d6147c8565b5b828203905092915050565b6000614684826146a9565b9050919050565b60008115159050919050565b60006146a282614679565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146de826146e5565b9050919050565b60006146f0826146a9565b9050919050565b600061470282614709565b9050919050565b6000614714826146a9565b9050919050565b60005b8381101561473957808201518184015260208101905061471e565b83811115614748576000848401525b50505050565b61475782614855565b810181811067ffffffffffffffff8211171561477657614775614826565b5b80604052505050565b600061478a826146c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147bd576147bc6147c8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f63546f6b656e2d69732d6e6f742d616c6c6f7765642d746f2d73776565700000600082015250565b7f63546f6b656e2d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f6164642d6b65657065722d6661696c6564000000000000000000000000000000600082015250565b7f696e7075742d6c656e6774682d6d69736d617463680000000000000000000000600082015250565b7f6e65772d74726561737572792d616464726573732d69732d7a65726f00000000600082015250565b7f72656d6f76652d6b65657065722d6661696c6564000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f72656465656d65722d616464726573732d69732d7a65726f0000000000000000600082015250565b7f63616c6c65722d69732d6e6f742d7468652d676f7665726e6f72000000000000600082015250565b7f746f6b656e2d616464726573732d69732d7a65726f0000000000000000000000600082015250565b7f746f6b656e2d69732d6e6f742d737570706f7274656400000000000000000000600082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f73616d652d72656465656d657200000000000000000000000000000000000000600082015250565b7f72656d6f76652d66726f6d2d6c6973742d6661696c6564000000000000000000600082015250565b7f72656465656d2d756e6465726c79696e672d6661696c65640000000000000000600082015250565b7f6f7261636c652d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f767573642d6d69736d6174636800000000000000000000000000000000000000600082015250565b7f72656465656d2d6661696c656400000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f737761702d6d616e616765722d616464726573732d69732d7a65726f00000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63546f6b656e2d6d696e742d6661696c65640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f63616c6c65722d69732d6e6f742d617574686f72697a65640000000000000000600082015250565b7f6b65657065722d616464726573732d69732d7a65726f00000000000000000000600082015250565b614d0b81614679565b8114614d1657600080fd5b50565b614d228161468b565b8114614d2d57600080fd5b50565b614d3981614697565b8114614d4457600080fd5b50565b614d50816146c9565b8114614d5b57600080fd5b5056fea2646970667358221220faee0de023a6609ddb06e8eb88495b5593181355a48e2c992dcc66d18e19dae964736f6c63430008030033000000000000000000000000677ddbd918637e5f2c79e164d402454de7da8619
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c80636a95385f116100de578063ab37f48611610097578063ce5494bb11610071578063ce5494bb14610459578063edac520314610475578063f3fef3a314610493578063ffa1ad74146104af5761018e565b8063ab37f486146103c9578063addd5099146103f9578063ce513b6f146104295761018e565b80636a95385f14610305578063709d039d146103235780637d138e13146103415780638c0b09d01461035d578063951dc22c1461038d578063a3f4df7e146103ab5761018e565b80634032b72b1161014b57806356f0693e1161012557806356f0693e146102935780635e1762a0146102af5780636568a279146102cd57806369328dec146102e95761018e565b80634032b72b1461023f578063428415311461025b5780634c36fad7146102775761018e565b806301681a62146101935780630c340a24146101af57806314ae9f2e146101cd5780631c88705d146101e957806320ab954e146102055780632ba29d3814610221575b600080fd5b6101ad60048036038101906101a891906137d9565b6104cd565b005b6101b7610660565b6040516101c49190613fb4565b60405180910390f35b6101e760048036038101906101e291906137d9565b610705565b005b61020360048036038101906101fe91906137d9565b6107d7565b005b61021f600480360381019061021a919061382b565b610aaa565b005b610229610c86565b6040516102369190613fb4565b60405180910390f35b610259600480360381019061025491906137d9565b610cac565b005b61027560048036038101906102709190613946565b610dee565b005b610291600480360381019061028c91906137d9565b610fba565b005b6102ad60048036038101906102a8919061387a565b6111bd565b005b6102b76117b4565b6040516102c49190614088565b60405180910390f35b6102e760048036038101906102e29190613905565b6117c5565b005b61030360048036038101906102fe91906138b6565b611c81565b005b61030d611dc2565b60405161031a9190614088565b60405180910390f35b61032b611dd3565b60405161033891906140c5565b60405180910390f35b61035b600480360381019061035691906137d9565b611df9565b005b610377600480360381019061037291906137d9565b612036565b6040516103849190613fb4565b60405180910390f35b610395612069565b6040516103a29190614088565b60405180910390f35b6103b361207a565b6040516103c091906140fb565b60405180910390f35b6103e360048036038101906103de91906137d9565b6120b3565b6040516103f091906140aa565b60405180910390f35b610413600480360381019061040e91906137d9565b6120d0565b6040516104209190613fb4565b60405180910390f35b610443600480360381019061043e91906137d9565b612103565b604051610450919061445d565b60405180910390f35b610473600480360381019061046e91906137d9565b612331565b005b61047d612625565b60405161048a91906140e0565b60405180910390f35b6104ad60048036038101906104a8919061387a565b612649565b005b6104b7612790565b6040516104c491906140fb565b60405180910390f35b6104d5610660565b73ffffffffffffffffffffffffffffffffffffffff166104f361296f565b73ffffffffffffffffffffffffffffffffffffffff1614610549576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105409061421d565b60405180910390fd5b61055d81600761297790919063ffffffff16565b1561059d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105949061411d565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105d89190613fb4565b60206040518083038186803b1580156105f057600080fd5b505afa158015610604573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106289190613aac565b905061065c61063561296f565b828473ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b5050565b60007f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff16630c340a246040518163ffffffff1660e01b815260040160206040518083038186803b1580156106c857600080fd5b505afa1580156106dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107009190613802565b905090565b61070d610660565b73ffffffffffffffffffffffffffffffffffffffff1661072b61296f565b73ffffffffffffffffffffffffffffffffffffffff1614610781576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107789061421d565b60405180910390fd5b610795816009612a2d90919063ffffffff16565b6107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb906141bd565b60405180910390fd5b50565b6107df610660565b73ffffffffffffffffffffffffffffffffffffffff166107fd61296f565b73ffffffffffffffffffffffffffffffffffffffff1614610853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084a9061421d565b60405180910390fd5b610867816005612a2d90919063ffffffff16565b6108a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089d906142bd565b60405180910390fd5b610919600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166007612a2d90919063ffffffff16565b610958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094f906142bd565b60405180910390fd5b6109e3600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008373ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550565b610ab2610660565b73ffffffffffffffffffffffffffffffffffffffff16610ad061296f565b73ffffffffffffffffffffffffffffffffffffffff1614610b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1d9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8d9061423d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd9061413d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d906142fd565b60405180910390fd5b610c81838383612a5d565b505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610cb4610660565b73ffffffffffffffffffffffffffffffffffffffff16610cd261296f565b73ffffffffffffffffffffffffffffffffffffffff1614610d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1f9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f9061443d565b60405180910390fd5b610dac8160096127c990919063ffffffff16565b610deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de29061415d565b60405180910390fd5b50565b60026000541415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b906143dd565b60405180910390fd5b6002600081905550610e44610660565b73ffffffffffffffffffffffffffffffffffffffff16610e6261296f565b73ffffffffffffffffffffffffffffffffffffffff1614610eb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eaf9061421d565b60405180910390fd5b8051825114610efc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef39061417d565b60405180910390fd5b60005b8251811015610fad57610f9a838281518110610f44577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610f9561296f565b612c4f565b8080610fa59061477f565b915050610eff565b5060016000819055505050565b610fc2610660565b73ffffffffffffffffffffffffffffffffffffffff16610fe061296f565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109d9061437d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f2d19927e7cac08ceb98b38898a4fdff6da6a27295b9a2d62fe250408ebe044e160405160405180910390a361114f600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612dfe565b611179817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612dfe565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6111c5610660565b73ffffffffffffffffffffffffffffffffffffffff166111e361296f565b73ffffffffffffffffffffffffffffffffffffffff16148061121c575061121b61120b61296f565b600961297790919063ffffffff16565b5b61125b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112529061441d565b60405180910390fd5b61126f82600561297790919063ffffffff16565b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061425d565b60405180910390fd5b733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16631c3db2e0306112e96007612f87565b6040518363ffffffff1660e01b815260040161130692919061402f565b600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050600073c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113879190613fb4565b60206040518083038186803b15801561139f57600080fd5b505afa1580156113b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d79190613aac565b90506000806000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8f983c873c00e94cb662c3520282e6f5717214004a7f2688888876040518463ffffffff1660e01b815260040161145193929190613ff8565b60006040518083038186803b15801561146957600080fd5b505afa15801561147d573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906114a691906139b2565b925092509250600082146115f857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e74a6f7826040518263ffffffff1660e01b815260040161150f919061445d565b60206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190613a83565b73ffffffffffffffffffffffffffffffffffffffff166338ed173985878630426040518663ffffffff1660e01b815260040161159f959493929190614478565b600060405180830381600087803b1580156115b957600080fd5b505af11580156115cd573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906115f69190613a19565b505b6000600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d688873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116ae9190613fb4565b60206040518083038186803b1580156116c657600080fd5b505afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe9190613aac565b6040518263ffffffff1660e01b815260040161171a919061445d565b602060405180830381600087803b15801561173457600080fd5b505af1158015611748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176c9190613aac565b146117ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a3906143bd565b60405180910390fd5b505050505050565b60606117c06005612f87565b905090565b6002600054141561180b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611802906143dd565b60405180910390fd5b600260008190555061181b610660565b73ffffffffffffffffffffffffffffffffffffffff1661183961296f565b73ffffffffffffffffffffffffffffffffffffffff161461188f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118869061421d565b60405180910390fd5b60005b8151811015611c75576118ef8282815181106118d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600561297790919063ffffffff16565b61192e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119259061425d565b60405180910390fd5b60006003600084848151811061196d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663db006a758373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a299190613fb4565b60206040518083038186803b158015611a4157600080fd5b505afa158015611a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a799190613aac565b6040518263ffffffff1660e01b8152600401611a95919061445d565b602060405180830381600087803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae79190613aac565b14611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e9061433d565b60405180910390fd5b611c61611b3261296f565b848481518110611b6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611bab9190613fb4565b60206040518083038186803b158015611bc357600080fd5b505afa158015611bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfb9190613aac565b858581518110611c34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b508080611c6d9061477f565b915050611892565b50600160008190555050565b60026000541415611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906143dd565b60405180910390fd5b6002600081905550611cd7610660565b73ffffffffffffffffffffffffffffffffffffffff16611cf561296f565b73ffffffffffffffffffffffffffffffffffffffff161480611d6b5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611d5361296f565b73ffffffffffffffffffffffffffffffffffffffff16145b611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da19061441d565b60405180910390fd5b611db5838383612c4f565b6001600081905550505050565b6060611dce6007612f87565b905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611e01610660565b73ffffffffffffffffffffffffffffffffffffffff16611e1f61296f565b73ffffffffffffffffffffffffffffffffffffffff1614611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c9061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906141fd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6d9061429d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fbb0958cd5add04c553a378aa342c839507b619a0459617e004c5d13602cfa72360405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60036020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606120756009612f87565b905090565b6040518060400160405280600d81526020017f565553442d54726561737572790000000000000000000000000000000000000081525081565b60006120c982600561297790919063ffffffff16565b9050919050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612327576000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050670de0b6b3a76400008173ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561224a57600080fd5b505afa15801561225e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122829190613aac565b8273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122bb9190613fb4565b60206040518083038186803b1580156122d357600080fd5b505afa1580156122e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230b9190613aac565b61231591906145eb565b61231f91906145ba565b91505061232c565b600090505b919050565b612339610660565b73ffffffffffffffffffffffffffffffffffffffff1661235761296f565b73ffffffffffffffffffffffffffffffffffffffff16146123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a49061421d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561241d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124149061419d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663edac52036040518163ffffffff1660e01b815260040160206040518083038186803b15801561246357600080fd5b505afa158015612477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061249b9190613802565b73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861973ffffffffffffffffffffffffffffffffffffffff1614612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f9061431d565b60405180910390fd5b60006125346007612fa8565b905060005b81811015612620576000612557826007612fbd90919063ffffffff16565b905061260c848273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125969190613fb4565b60206040518083038186803b1580156125ae57600080fd5b505afa1580156125c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e69190613aac565b8373ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b5080806126189061477f565b915050612539565b505050565b7f000000000000000000000000677ddbd918637e5f2c79e164d402454de7da861981565b6002600054141561268f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612686906143dd565b60405180910390fd5b600260008190555061269f610660565b73ffffffffffffffffffffffffffffffffffffffff166126bd61296f565b73ffffffffffffffffffffffffffffffffffffffff1614806127335750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661271b61296f565b73ffffffffffffffffffffffffffffffffffffffff16145b612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127699061441d565b60405180910390fd5b612784828261277f61296f565b612c4f565b60016000819055505050565b6040518060400160405280600581526020017f312e332e3000000000000000000000000000000000000000000000000000000081525081565b60006127f1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612fd7565b905092915050565b6000811480612892575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612840929190613fcf565b60206040518083038186803b15801561285857600080fd5b505afa15801561286c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128909190613aac565b145b6128d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c8906143fd565b60405180910390fd5b6129528363095ea7b360e01b84846040516024016128f092919061405f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613047565b505050565b6060612966848460008561310e565b90509392505050565b600033905090565b600061299f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613222565b905092915050565b612a288363a9059cbb60e01b84846040516024016129c692919061405f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613047565b505050565b6000612a55836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613245565b905092915050565b612a718360056127c990919063ffffffff16565b612ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa79061427d565b60405180910390fd5b612ac48260076127c990919063ffffffff16565b612b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afa9061427d565b60405180910390fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612c4a827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8573ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b505050565b612c6383600561297790919063ffffffff16565b612ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c999061425d565b60405180910390fd5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663852a12e3846040518263ffffffff1660e01b8152600401612d3c919061445d565b602060405180830381600087803b158015612d5657600080fd5b505af1158015612d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8e9190613aac565b14612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc5906142dd565b60405180910390fd5b612df981838573ffffffffffffffffffffffffffffffffffffffff166129a79092919063ffffffff16565b505050565b60005b8273ffffffffffffffffffffffffffffffffffffffff1663c2fba6676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4757600080fd5b505afa158015612e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e7f9190613aac565b811015612f8257612f6f600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636e74a6f7836040518263ffffffff1660e01b8152600401612ee4919061445d565b60206040518083038186803b158015612efc57600080fd5b505afa158015612f10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f349190613a83565b8373c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166127f99092919063ffffffff16565b8080612f7a9061477f565b915050612e01565b505050565b60606000612f97836000016133cb565b905060608190508092505050919050565b6000612fb682600001613427565b9050919050565b6000612fcc8360000183613438565b60001c905092915050565b6000612fe38383613222565b61303c578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613041565b600090505b92915050565b60006130a9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166129579092919063ffffffff16565b905060008151111561310957808060200190518101906130c99190613a5a565b613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff9061439d565b60405180910390fd5b5b505050565b606082471015613153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314a906141dd565b60405180910390fd5b61315c85613489565b61319b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131929061435d565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516131c49190613f9d565b60006040518083038185875af1925050503d8060008114613201576040519150601f19603f3d011682016040523d82523d6000602084013e613206565b606091505b509150915061321682828661349c565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020549050600081146133bf5760006001826132779190614645565b905060006001866000018054905061328f9190614645565b905081811461334a5760008660000182815481106132d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613320577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480613384577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506133c5565b60009150505b92915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561341b57602002820191906000526020600020905b815481526020019060010190808311613407575b50505050509050919050565b600081600001805490509050919050565b6000826000018281548110613476577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600080823b905060008111915050919050565b606083156134ac578290506134fc565b6000835111156134bf5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f391906140fb565b60405180910390fd5b9392505050565b6000613516613511846144f7565b6144d2565b9050808382526020820190508285602086028201111561353557600080fd5b60005b85811015613565578161354b88826136b3565b845260208401935060208301925050600181019050613538565b5050509392505050565b600061358261357d846144f7565b6144d2565b905080838252602082019050828560208602820111156135a157600080fd5b60005b858110156135d157816135b788826136c8565b8452602084019350602083019250506001810190506135a4565b5050509392505050565b60006135ee6135e984614523565b6144d2565b9050808382526020820190508285602086028201111561360d57600080fd5b60005b8581101561363d578161362388826137af565b845260208401935060208301925050600181019050613610565b5050509392505050565b600061365a61365584614523565b6144d2565b9050808382526020820190508285602086028201111561367957600080fd5b60005b858110156136a9578161368f88826137c4565b84526020840193506020830192505060018101905061367c565b5050509392505050565b6000813590506136c281614d02565b92915050565b6000815190506136d781614d02565b92915050565b600082601f8301126136ee57600080fd5b81356136fe848260208601613503565b91505092915050565b600082601f83011261371857600080fd5b815161372884826020860161356f565b91505092915050565b600082601f83011261374257600080fd5b81356137528482602086016135db565b91505092915050565b600082601f83011261376c57600080fd5b815161377c848260208601613647565b91505092915050565b60008151905061379481614d19565b92915050565b6000815190506137a981614d30565b92915050565b6000813590506137be81614d47565b92915050565b6000815190506137d381614d47565b92915050565b6000602082840312156137eb57600080fd5b60006137f9848285016136b3565b91505092915050565b60006020828403121561381457600080fd5b6000613822848285016136c8565b91505092915050565b60008060006060848603121561384057600080fd5b600061384e868287016136b3565b935050602061385f868287016136b3565b9250506040613870868287016136b3565b9150509250925092565b6000806040838503121561388d57600080fd5b600061389b858286016136b3565b92505060206138ac858286016137af565b9150509250929050565b6000806000606084860312156138cb57600080fd5b60006138d9868287016136b3565b93505060206138ea868287016137af565b92505060406138fb868287016136b3565b9150509250925092565b60006020828403121561391757600080fd5b600082013567ffffffffffffffff81111561393157600080fd5b61393d848285016136dd565b91505092915050565b6000806040838503121561395957600080fd5b600083013567ffffffffffffffff81111561397357600080fd5b61397f858286016136dd565b925050602083013567ffffffffffffffff81111561399c57600080fd5b6139a885828601613731565b9150509250929050565b6000806000606084860312156139c757600080fd5b600084015167ffffffffffffffff8111156139e157600080fd5b6139ed86828701613707565b93505060206139fe868287016137c4565b9250506040613a0f868287016137c4565b9150509250925092565b600060208284031215613a2b57600080fd5b600082015167ffffffffffffffff811115613a4557600080fd5b613a518482850161375b565b91505092915050565b600060208284031215613a6c57600080fd5b6000613a7a84828501613785565b91505092915050565b600060208284031215613a9557600080fd5b6000613aa38482850161379a565b91505092915050565b600060208284031215613abe57600080fd5b6000613acc848285016137c4565b91505092915050565b6000613ae18383613aed565b60208301905092915050565b613af681614679565b82525050565b613b0581614679565b82525050565b6000613b168261455f565b613b20818561458d565b9350613b2b8361454f565b8060005b83811015613b5c578151613b438882613ad5565b9750613b4e83614580565b925050600181019050613b2f565b5085935050505092915050565b613b728161468b565b82525050565b6000613b838261456a565b613b8d818561459e565b9350613b9d81856020860161471b565b80840191505092915050565b613bb2816146d3565b82525050565b613bc1816146f7565b82525050565b6000613bd282614575565b613bdc81856145a9565b9350613bec81856020860161471b565b613bf581614855565b840191505092915050565b6000613c0d601e836145a9565b9150613c1882614866565b602082019050919050565b6000613c306016836145a9565b9150613c3b8261488f565b602082019050919050565b6000613c536011836145a9565b9150613c5e826148b8565b602082019050919050565b6000613c766015836145a9565b9150613c81826148e1565b602082019050919050565b6000613c99601c836145a9565b9150613ca48261490a565b602082019050919050565b6000613cbc6014836145a9565b9150613cc782614933565b602082019050919050565b6000613cdf6026836145a9565b9150613cea8261495c565b604082019050919050565b6000613d026018836145a9565b9150613d0d826149ab565b602082019050919050565b6000613d25601a836145a9565b9150613d30826149d4565b602082019050919050565b6000613d486015836145a9565b9150613d53826149fd565b602082019050919050565b6000613d6b6016836145a9565b9150613d7682614a26565b602082019050919050565b6000613d8e6012836145a9565b9150613d9982614a4f565b602082019050919050565b6000613db1600d836145a9565b9150613dbc82614a78565b602082019050919050565b6000613dd46017836145a9565b9150613ddf82614aa1565b602082019050919050565b6000613df76018836145a9565b9150613e0282614aca565b602082019050919050565b6000613e1a6016836145a9565b9150613e2582614af3565b602082019050919050565b6000613e3d600d836145a9565b9150613e4882614b1c565b602082019050919050565b6000613e60600d836145a9565b9150613e6b82614b45565b602082019050919050565b6000613e83601d836145a9565b9150613e8e82614b6e565b602082019050919050565b6000613ea6601c836145a9565b9150613eb182614b97565b602082019050919050565b6000613ec9602a836145a9565b9150613ed482614bc0565b604082019050919050565b6000613eec6012836145a9565b9150613ef782614c0f565b602082019050919050565b6000613f0f601f836145a9565b9150613f1a82614c38565b602082019050919050565b6000613f326036836145a9565b9150613f3d82614c61565b604082019050919050565b6000613f556018836145a9565b9150613f6082614cb0565b602082019050919050565b6000613f786016836145a9565b9150613f8382614cd9565b602082019050919050565b613f97816146c9565b82525050565b6000613fa98284613b78565b915081905092915050565b6000602082019050613fc96000830184613afc565b92915050565b6000604082019050613fe46000830185613afc565b613ff16020830184613afc565b9392505050565b600060608201905061400d6000830186613afc565b61401a6020830185613afc565b6140276040830184613f8e565b949350505050565b60006040820190506140446000830185613afc565b81810360208301526140568184613b0b565b90509392505050565b60006040820190506140746000830185613afc565b6140816020830184613f8e565b9392505050565b600060208201905081810360008301526140a28184613b0b565b905092915050565b60006020820190506140bf6000830184613b69565b92915050565b60006020820190506140da6000830184613ba9565b92915050565b60006020820190506140f56000830184613bb8565b92915050565b600060208201905081810360008301526141158184613bc7565b905092915050565b6000602082019050818103600083015261413681613c00565b9050919050565b6000602082019050818103600083015261415681613c23565b9050919050565b6000602082019050818103600083015261417681613c46565b9050919050565b6000602082019050818103600083015261419681613c69565b9050919050565b600060208201905081810360008301526141b681613c8c565b9050919050565b600060208201905081810360008301526141d681613caf565b9050919050565b600060208201905081810360008301526141f681613cd2565b9050919050565b6000602082019050818103600083015261421681613cf5565b9050919050565b6000602082019050818103600083015261423681613d18565b9050919050565b6000602082019050818103600083015261425681613d3b565b9050919050565b6000602082019050818103600083015261427681613d5e565b9050919050565b6000602082019050818103600083015261429681613d81565b9050919050565b600060208201905081810360008301526142b681613da4565b9050919050565b600060208201905081810360008301526142d681613dc7565b9050919050565b600060208201905081810360008301526142f681613dea565b9050919050565b6000602082019050818103600083015261431681613e0d565b9050919050565b6000602082019050818103600083015261433681613e30565b9050919050565b6000602082019050818103600083015261435681613e53565b9050919050565b6000602082019050818103600083015261437681613e76565b9050919050565b6000602082019050818103600083015261439681613e99565b9050919050565b600060208201905081810360008301526143b681613ebc565b9050919050565b600060208201905081810360008301526143d681613edf565b9050919050565b600060208201905081810360008301526143f681613f02565b9050919050565b6000602082019050818103600083015261441681613f25565b9050919050565b6000602082019050818103600083015261443681613f48565b9050919050565b6000602082019050818103600083015261445681613f6b565b9050919050565b60006020820190506144726000830184613f8e565b92915050565b600060a08201905061448d6000830188613f8e565b61449a6020830187613f8e565b81810360408301526144ac8186613b0b565b90506144bb6060830185613afc565b6144c86080830184613f8e565b9695505050505050565b60006144dc6144ed565b90506144e8828261474e565b919050565b6000604051905090565b600067ffffffffffffffff82111561451257614511614826565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561453e5761453d614826565b5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006145c5826146c9565b91506145d0836146c9565b9250826145e0576145df6147f7565b5b828204905092915050565b60006145f6826146c9565b9150614601836146c9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561463a576146396147c8565b5b828202905092915050565b6000614650826146c9565b915061465b836146c9565b92508282101561466e5761466d6147c8565b5b828203905092915050565b6000614684826146a9565b9050919050565b60008115159050919050565b60006146a282614679565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006146de826146e5565b9050919050565b60006146f0826146a9565b9050919050565b600061470282614709565b9050919050565b6000614714826146a9565b9050919050565b60005b8381101561473957808201518184015260208101905061471e565b83811115614748576000848401525b50505050565b61475782614855565b810181811067ffffffffffffffff8211171561477657614775614826565b5b80604052505050565b600061478a826146c9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147bd576147bc6147c8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f63546f6b656e2d69732d6e6f742d616c6c6f7765642d746f2d73776565700000600082015250565b7f63546f6b656e2d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f6164642d6b65657065722d6661696c6564000000000000000000000000000000600082015250565b7f696e7075742d6c656e6774682d6d69736d617463680000000000000000000000600082015250565b7f6e65772d74726561737572792d616464726573732d69732d7a65726f00000000600082015250565b7f72656d6f76652d6b65657065722d6661696c6564000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f72656465656d65722d616464726573732d69732d7a65726f0000000000000000600082015250565b7f63616c6c65722d69732d6e6f742d7468652d676f7665726e6f72000000000000600082015250565b7f746f6b656e2d616464726573732d69732d7a65726f0000000000000000000000600082015250565b7f746f6b656e2d69732d6e6f742d737570706f7274656400000000000000000000600082015250565b7f6164642d696e2d6c6973742d6661696c65640000000000000000000000000000600082015250565b7f73616d652d72656465656d657200000000000000000000000000000000000000600082015250565b7f72656d6f76652d66726f6d2d6c6973742d6661696c6564000000000000000000600082015250565b7f72656465656d2d756e6465726c79696e672d6661696c65640000000000000000600082015250565b7f6f7261636c652d616464726573732d69732d7a65726f00000000000000000000600082015250565b7f767573642d6d69736d6174636800000000000000000000000000000000000000600082015250565b7f72656465656d2d6661696c656400000000000000000000000000000000000000600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f737761702d6d616e616765722d616464726573732d69732d7a65726f00000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f63546f6b656e2d6d696e742d6661696c65640000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b7f63616c6c65722d69732d6e6f742d617574686f72697a65640000000000000000600082015250565b7f6b65657065722d616464726573732d69732d7a65726f00000000000000000000600082015250565b614d0b81614679565b8114614d1657600080fd5b50565b614d228161468b565b8114614d2d57600080fd5b50565b614d3981614697565b8114614d4457600080fd5b50565b614d50816146c9565b8114614d5b57600080fd5b5056fea2646970667358221220faee0de023a6609ddb06e8eb88495b5593181355a48e2c992dcc66d18e19dae964736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000677ddbd918637e5f2c79e164d402454de7da8619
-----Decoded View---------------
Arg [0] : _vusd (address): 0x677ddbd918637E5F2c79e164D402454dE7dA8619
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000677ddbd918637e5f2c79e164d402454de7da8619
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.