Contract
0xDeb204424Fc64477ab2f097812E6D53E8eCf4b53
1
Contract Overview
[ Download CSV Export ]
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0x5ee2193201eaf5121e9e262711c6db9f26b6d6d9e896c7da5787856a4f9b10cc | 63079541 | 8 days 11 hrs ago | 0xc64ae9d55e57ed56c77f9cc62d318db39abc69d5 | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
XpandrUnityVault
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2023-05-25 */ // File contracts/interfaces/AccessControl.sol pragma solidity ^0.8.19; /** @notice Based on solmate's Owned.sol with added access control for an operator & error code + if instead of requires. */ error NoAuth(); error NotStrategist(); abstract contract AccessControl { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event OwnershipTransferred(address indexed user, address indexed newOwner); event SetStrategist(address indexed user, address indexed newStrategist); /*////////////////////////////////////////////////////////////// OWNERSHIP STORAGE //////////////////////////////////////////////////////////////*/ address public owner; address public strategist; modifier onlyOwner() virtual { checkOwner(); _; } modifier onlyAdmin() virtual { checkAdmin(); _; } /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor() { owner = msg.sender; strategist = msg.sender; emit OwnershipTransferred(address(0), owner); emit SetStrategist(address(0), strategist); } /*////////////////////////////////////////////////////////////// OWNERSHIP LOGIC //////////////////////////////////////////////////////////////*/ function transferOwnership(address newOwner) external virtual onlyOwner { owner = newOwner; emit OwnershipTransferred(msg.sender, newOwner); } function setStrategist(address _newStrategist) external virtual { if(msg.sender != strategist){revert NotStrategist();} strategist = _newStrategist; emit SetStrategist(msg.sender, strategist); } function checkOwner() internal virtual { if(msg.sender != owner){revert NoAuth();} } function checkAdmin() internal virtual { if(msg.sender != owner || msg.sender != strategist){revert NoAuth();} } } // File contracts/interfaces/Pauser.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.19; /** @notice - Modified version of OZ's Pausable.sol, using uint instead of bool &error codes w/ Ifs instead of requires w/ strings for cheaper gas costs */ /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ error NotPaused(); error Paused(); abstract contract Pauser { /** * @dev Emitted when the pause is triggered by `account`. */ event WasPaused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); uint8 public _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = 0; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns 1 if the contract is paused, and 0 otherwise. */ function paused() public view virtual returns (uint8) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { //require(paused() != 0, "Pausable: paused"); if(paused() != 0){revert Paused();} } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { //require(paused() == 1, "Pausable: not paused"); if(paused() != 1){revert NotPaused();} } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = 1; emit WasPaused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = 0; emit Unpaused(msg.sender); } } // File contracts/interfaces/XpandrErrors.sol pragma solidity ^0.8.19; contract XpandrErrors { error ZeroAmount(); error ZeroAddress(); error NotVault(); error NotEOA(); error NotAccountOwner(); error OverCap(); error UnderTimeLock(); error InvalidDelay(); error InvalidProposal(); error InvalidTokenOrPath(); error UnusedFunction(); } // File contracts/interfaces/solmate/ERC20.sol pragma solidity ^0.8.19; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC ////////////////////////////////////////////////////////////// function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); }*/ function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } // File contracts/interfaces/solmate/FixedPointMathLib.sol pragma solidity ^0.8.19; /// @notice Arithmetic library with operations for fixed-point numbers. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol) /// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol) library FixedPointMathLib { /*////////////////////////////////////////////////////////////// SIMPLIFIED FIXED POINT OPERATIONS //////////////////////////////////////////////////////////////*/ uint256 internal constant MAX_UINT256 = 2**256 - 1; uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s. /*////////////////////////////////////////////////////////////// LOW LEVEL FIXED POINT OPERATIONS //////////////////////////////////////////////////////////////*/ function mulDivDown( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y)) if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) { revert(0, 0) } // Divide x * y by the denominator. z := div(mul(x, y), denominator) } } function mulDivUp( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y)) if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) { revert(0, 0) } // If x * y modulo the denominator is strictly greater than 0, // 1 is added to round up the division of x * y by the denominator. z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator)) } } } // File contracts/interfaces/solmate/SafeTransferLib.sol pragma solidity ^0.8.19; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument. mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 100, 0, 32) ) } require(success, "TRANSFER_FROM_FAILED"); } function safeTransfer( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "TRANSFER_FAILED"); } function safeApprove( ERC20 token, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument. mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. success := and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())), // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2. // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space. // Counterintuitively, this call must be positioned second to the or() call in the // surrounding and() call or else returndatasize() will be zero during the computation. call(gas(), token, 0, freeMemoryPointer, 68, 0, 32) ) } require(success, "APPROVE_FAILED"); } } // File contracts/interfaces/solmate/ERC4626light.sol pragma solidity ^0.8.19; /// @notice Minimal ERC4626 tokenized Vault implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol) abstract contract ERC4626 is ERC20 { using SafeTransferLib for ERC20; using FixedPointMathLib for uint256; /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares); event Withdraw( address indexed caller, address indexed receiver, address indexed owner, uint256 assets, uint256 shares ); /*////////////////////////////////////////////////////////////// IMMUTABLES //////////////////////////////////////////////////////////////*/ ERC20 public immutable asset; constructor( ERC20 _asset, string memory _name, string memory _symbol ) ERC20(_name, _symbol, _asset.decimals()) { asset = _asset; } /*////////////////////////////////////////////////////////////// DEPOSIT/WITHDRAWAL LOGIC //////////////////////////////////////////////////////////////*/ function deposit(uint256 assets, address receiver) public virtual returns (uint256 shares) { // Check for rounding error since we round down in previewDeposit. require((shares = convertToShares(assets)) != 0, "ZERO_SHARES"); // Need to transfer before minting or ERC777s could reenter. asset.safeTransferFrom(msg.sender, address(this), assets); _mint(receiver, shares); emit Deposit(msg.sender, receiver, assets, shares); //afterDeposit(assets, shares); } /* function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) { assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up. // Need to transfer before minting or ERC777s could reenter. asset.safeTransferFrom(msg.sender, address(this), assets); _mint(receiver, shares); emit Deposit(msg.sender, receiver, assets, shares); afterDeposit(assets, shares); } */ function withdraw( uint256 assets, address receiver, address owner ) public virtual returns (uint256 shares) { shares = convertToShares(assets); // No need to check for rounding error, previewWithdraw rounds up. if (msg.sender != owner) { uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares; } //beforeWithdraw(assets, shares); _burn(owner, shares); emit Withdraw(msg.sender, receiver, owner, assets, shares); asset.safeTransfer(receiver, assets); } /* function redeem( uint256 shares, address receiver, address owner ) public virtual returns (uint256 assets) { if (msg.sender != owner) { uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares; } // Check for rounding error since we round down in previewRedeem. require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS"); beforeWithdraw(assets, shares); _burn(owner, shares); emit Withdraw(msg.sender, receiver, owner, assets, shares); asset.safeTransfer(receiver, assets); } */ /*////////////////////////////////////////////////////////////// ACCOUNTING LOGIC //////////////////////////////////////////////////////////////*/ function totalAssets() public view virtual returns (uint256); function convertToShares(uint256 assets) public view virtual returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets()); } function convertToAssets(uint256 shares) public view virtual returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply); } /* function previewWithdraw(uint256 assets) public view virtual returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? assets : assets.mulDivUp(supply, totalAssets()); } function previewDeposit(uint256 assets) public view virtual returns (uint256) { return convertToShares(assets); } function previewRedeem(uint256 shares) public view virtual returns (uint256) { return convertToAssets(shares); } function previewMint(uint256 shares) public view virtual returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply); } ////////////////////////////////////////////////////////////// DEPOSIT/WITHDRAWAL LIMIT LOGIC ////////////////////////////////////////////////////////////// function maxDeposit(address) public view virtual returns (uint256) { return type(uint256).max; } function maxMint(address) public view virtual returns (uint256) { return type(uint256).max; } function maxWithdraw(address owner) public view virtual returns (uint256) { return convertToAssets(balanceOf[owner]); } function maxRedeem(address owner) public view virtual returns (uint256) { return balanceOf[owner]; } /////////////////////////////////////////////////////////////// INTERNAL HOOKS LOGIC //////////////////////////////////////////////////////////////*/ //function beforeWithdraw(uint256 assets, uint256 shares) internal virtual {} function afterDeposit(uint256 assets, uint256 shares) internal virtual {} } // File contracts/interfaces/IEqualizerPair.sol pragma solidity ^0.8.19; interface IEqualizerPair { function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function sample(address tokenIn, uint amountIn, uint points, uint window) external view returns (uint[] memory); } // File contracts/interfaces/IEqualizerRouter.sol pragma solidity ^0.8.19; interface IEqualizerRouter { // Routes struct Routes { address from; address to; bool stable; } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, Routes[] memory route, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, Routes[] calldata routes, address to, uint deadline ) external; function getAmountOut(uint amountIn, address tokenIn, address tokenOut) external view returns (uint amount, bool stable); function getAmountsOut(uint amountIn, Routes[] memory routes) external view returns (uint[] memory amounts); function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity); } // File contracts/interfaces/IEqualizerGauge.sol pragma solidity ^0.8.19; interface IEqualizerGauge { function deposit(uint256 amount) external; function withdraw(uint256 amount) external; function getReward(address user, address[] memory rewards) external; function earned(address token, address user) external view returns (uint256); function balanceOf(address user) external view returns (uint256); } // File contracts/XpandrUnityVault.sol // SPDX-License-Identifier: No License (None) // No permissions granted before Sunday, 5th May 2025, then GPL-3.0 after this date. /** @title - XpandrUnityVault @author - Nikar0 @notice - Immutable, streamlined, security & gas considerate unified Vault + Strategy contract. Includes: feeToken switch / 0% withdraw fee default / Vault profit in USD / Adjustable platformFee for promo events w/ max cap at default. Deposit & harvest buffers / Timestamp & Slippage protection https://www.github.com/nikar0/Xpandr4626 @Nikar0_ Vault based on EIP-4626 by @joey_santoro, @transmissions11, et all. https://eips.ethereum.org/EIPS/eip-4626 Using solmate's gas optimized libs https://github.com/transmissions11/solmate Special thanks to 543 from Equalizer/Guru_Network for the brainstorming & QA @notice - AccessControl = modified solmate Owned.sol w/ added Strategist + error codes. - Pauser = modified OZ Pausable.sol using uint8 instead of bool + error codes. **/ pragma solidity ^0.8.19; contract XpandrUnityVault is ERC4626, AccessControl, Pauser { using SafeTransferLib for ERC20; using FixedPointMathLib for uint; /*////////////////////////////////////////////////////////////// VARIABLES & EVENTS //////////////////////////////////////////////////////////////*/ event Harvest(address indexed harvester); event SetRouterOrGauge(address indexed newRouter, address indexed newGauge); event SetFeeToken(address indexed newFeeToken); event SetPaths(IEqualizerRouter.Routes[] indexed path1, IEqualizerRouter.Routes[] indexed path2); event Panic(address indexed caller); event CustomTx(address indexed from, uint indexed amount); event SetFeesAndRecipient(uint64 indexed withdrawFee, uint64 indexed totalFees, address indexed newRecipient); event StuckTokens(address indexed caller, uint indexed amount, address indexed token); // Tokens address public constant wftm = address(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address public constant equal = address(0x3Fd3A0c85B70754eFc07aC9Ac0cbBDCe664865A6); address public constant mpx = address(0x66eEd5FF1701E6ed8470DC391F05e27B1d0657eb); address internal constant usdc = address(0x04068DA6C83AFCFA0e13ba15A6696662335D5B75); //vaultProfit denominator address public feeToken; // Switch for which token protocol receives fees in. In mind for Native & Stable but fits any Equal - X token swap. address[] public rewardTokens; address[2] internal slippageTokens; address[2] internal slippageLPs; // 3rd party contracts address public gauge; address public router; // Xpandr addresses address public constant treasury = address(0xE37058057B0751bD2653fdeB27e8218439e0f726); address public feeRecipient; // Paths IEqualizerRouter.Routes[] public equalToWftmPath; IEqualizerRouter.Routes[] public equalToMpxPath; IEqualizerRouter.Routes[] public customPath; // Fee Structure uint64 public constant FEE_DIVISOR = 1000; uint64 public platformFee = 35; // 3.5% Platform fee cap uint64 public withdrawFee; // 0% withdraw fee. Logic kept in case spam/economic attacks bypass buffers, can only be set to 0 or 0.1% uint64 public treasuryFee = 590; uint64 public callFee = 120; uint64 public stratFee = 290; uint64 public recipientFee; // Controllers uint64 internal lastHarvest; // Safeguard only allows harvest being called if > delay uint64 public vaultProfit; // Excludes performance fees uint64 public delay; uint8 internal harvestOnDeposit; mapping(address => uint64) internal lastUserDeposit; //Safeguard only allows same user deposits if > delay constructor( ERC20 _asset, address _gauge, address _router, address _feeToken, address _strategist, IEqualizerRouter.Routes[] memory _equalToWftmPath, IEqualizerRouter.Routes[] memory _equalToMpxPath ) ERC4626( _asset, string(abi.encodePacked("Tester Vault")), string(abi.encodePacked("LP")) ) { gauge = _gauge; router = _router; feeToken = _feeToken; strategist = _strategist; delay = 600; // 10 mins for (uint i; i < _equalToWftmPath.length;) { equalToWftmPath.push(_equalToWftmPath[i]); unchecked{++i;} } for (uint i; i < _equalToMpxPath.length;) { equalToMpxPath.push(_equalToMpxPath[i]); unchecked{++i;} } slippageTokens = [equal, wftm]; slippageLPs = [address(0x3d6c56f6855b7Cc746fb80848755B0a9c3770122), address(_asset)]; rewardTokens.push(equal); lastHarvest = _timestamp(); _addAllowance(); } /*////////////////////////////////////////////////////////////// DEPOSIT/WITHDRAW //////////////////////////////////////////////////////////////*/ function depositAll() external { deposit(asset.balanceOf(msg.sender), msg.sender); } // Deposit 'asset' into the vault which then deposits funds into the farm. function deposit(uint assets, address receiver) public override whenNotPaused returns (uint shares) { if(tx.origin != receiver){revert XpandrErrors.NotAccountOwner();} if(lastUserDeposit[receiver] != 0) {if(_timestamp() < lastUserDeposit[receiver] + delay) {revert XpandrErrors.UnderTimeLock();}} if(assets > asset.balanceOf(receiver)){revert XpandrErrors.OverCap();} shares = convertToShares(assets); if(assets == 0 || shares == 0){revert XpandrErrors.ZeroAmount();} lastUserDeposit[receiver] = _timestamp(); emit Deposit(receiver, receiver, assets, shares); asset.safeTransferFrom(receiver, address(this), assets); // Need to transfer before minting or ERC777s could reenter. _mint(receiver, shares); _earn(); if(harvestOnDeposit != 0) {afterDeposit(assets, shares);} } function withdrawAll() external { withdraw(ERC20(address(this)).balanceOf(msg.sender), msg.sender, msg.sender); } // Withdraw 'asset' from farm into vault & sends to receiver. function withdraw(uint shares, address receiver, address _owner) public override returns (uint assets) { if(tx.origin != receiver && tx.origin != _owner){revert XpandrErrors.NotAccountOwner();} if(shares > ERC20(address(this)).balanceOf(_owner)){revert XpandrErrors.OverCap();} assets = convertToAssets(shares); if(assets == 0 || shares == 0){revert XpandrErrors.ZeroAmount();} _burn(_owner, shares); emit Withdraw(_owner, receiver, _owner, assets, shares); _collect(assets); uint assetBal = asset.balanceOf(address(this)); if (assetBal > assets) {assetBal = assets;} if(withdrawFee != 0){ uint withdrawFeeAmt = assetBal * withdrawFee / FEE_DIVISOR; asset.safeTransfer(receiver, assetBal - withdrawFeeAmt); } else {asset.safeTransfer(receiver, assetBal);} } function harvest() external { if(msg.sender != tx.origin){revert XpandrErrors.NotEOA();} if(_timestamp() < lastHarvest + delay){revert XpandrErrors.UnderTimeLock();} _harvest(msg.sender); } function _harvest(address caller) internal whenNotPaused { lastHarvest = _timestamp(); emit Harvest(caller); IEqualizerGauge(gauge).getReward(address(this), rewardTokens); uint outputBal = ERC20(equal).balanceOf(address(this)); if (outputBal != 0 ) { _chargeFees(caller); _addLiquidity(); } _earn(); } /*////////////////////////////////////////////////////////////// INTERNAL //////////////////////////////////////////////////////////////*/ // Deposits funds in the farm function _earn() internal { uint assetBal = asset.balanceOf(address(this)); IEqualizerGauge(gauge).deposit(assetBal); } // Withdraws funds from the farm function _collect(uint _amount) internal { uint assetBal = asset.balanceOf(address(this)); if (assetBal < _amount) { IEqualizerGauge(gauge).withdraw(_amount - assetBal); } } function _chargeFees(address caller) internal { uint toFee = ERC20(equal).balanceOf(address(this)) * platformFee / FEE_DIVISOR; uint toProfit = ERC20(equal).balanceOf(address(this)) - toFee; (uint usdProfit,) = IEqualizerRouter(router).getAmountOut(toProfit, equal, usdc); vaultProfit = vaultProfit + uint64(usdProfit / 1e12); IEqualizerRouter(router).swapExactTokensForTokensSimple(toFee, 1, equal, feeToken, false, address(this), lastHarvest + 60); uint feeBal = ERC20(feeToken).balanceOf(address(this)); uint callAmt = feeBal * callFee / FEE_DIVISOR; ERC20(feeToken).transfer(caller, callAmt); if(recipientFee != 0){ uint recipientAmt = feeBal * recipientFee / FEE_DIVISOR; ERC20(feeToken).safeTransfer(feeRecipient, recipientAmt); } uint treasuryAmt = feeBal * treasuryFee / FEE_DIVISOR; ERC20(feeToken).transfer(treasury, treasuryAmt); uint stratAmt = feeBal * stratFee / FEE_DIVISOR; ERC20(feeToken).transfer(strategist, stratAmt); } function _addLiquidity() internal { uint equalHalf = ERC20(equal).balanceOf(address(this)) >> 1; (uint minAmt1, uint minAmt2) = slippage(equalHalf); IEqualizerRouter(router).swapExactTokensForTokens(equalHalf, minAmt1, equalToWftmPath, address(this), lastHarvest); IEqualizerRouter(router).swapExactTokensForTokens(equalHalf, minAmt2, equalToMpxPath, address(this), lastHarvest); uint t1Bal = ERC20(wftm).balanceOf(address(this)); uint t2Bal = ERC20(mpx).balanceOf(address(this)); IEqualizerRouter(router).addLiquidity(wftm, mpx, false, t1Bal, t2Bal, 1, 1, address(this), lastHarvest); } /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ // Returns amount of reward in native upon calling the harvest function function callReward() public view returns (uint) { uint outputBal = rewardBalance(); uint wrappedOut; if (outputBal != 0) { (wrappedOut,) = IEqualizerRouter(router).getAmountOut(outputBal, equal, wftm); } return wrappedOut * platformFee / FEE_DIVISOR * callFee / FEE_DIVISOR; } function idleFunds() external view returns (uint) { return asset.balanceOf(address(this)); } // Returns total amount of 'asset' held by the vault and contracts it deposits in. function totalAssets() public view override returns (uint) { return asset.balanceOf(address(this)) + balanceOfPool(); } //Return how much 'asset' the vault has working in the farm function balanceOfPool() public view returns (uint) { return IEqualizerGauge(gauge).balanceOf(address(this)); } // Returns rewards unharvested function rewardBalance() public view returns (uint) { return IEqualizerGauge(gauge).earned(equal, address(this)); } // Function for UIs to display the current value of 1 vault share function getPricePerFullShare() external view returns (uint) { return totalSupply == 0 ? 1e18 : totalAssets() * 1e18 / totalSupply; } function convertToShares(uint256 assets) public view override returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets()); } function convertToAssets(uint256 shares) public view override returns (uint256) { uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero. return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply); } /*////////////////////////////////////////////////////////////// SECURITY //////////////////////////////////////////////////////////////*/ // Pauses the vault & executes emergency withdraw function panic() external onlyAdmin { pause(); emit Panic(msg.sender); IEqualizerGauge(gauge).withdraw(balanceOfPool()); } function pause() public onlyAdmin { _pause(); _subAllowance(); } function unpause() external onlyAdmin { _unpause(); _addAllowance(); _earn(); } //Guards against timestamp spoofing function _timestamp() internal view returns (uint64 timestamp){ (,,uint lastBlock) = (IEqualizerPair(address(asset)).getReserves()); timestamp = uint64(lastBlock + 1500); } //Guards against sandwich attacks function slippage(uint _amount) internal view returns(uint minAmt1, uint minAmt2){ uint[] memory t1Amts = IEqualizerPair(slippageLPs[0]).sample(slippageTokens[0], _amount, 5, 2); for(uint i; i < t1Amts.length;){ minAmt1 = minAmt1 + t1Amts[i]; unchecked{++i;} } minAmt1 = (minAmt1 / 10); uint[] memory t2Amts = IEqualizerPair(slippageLPs[1]).sample(slippageTokens[1], minAmt1, 5, 2); minAmt1 = (minAmt1 - minAmt1 * 2) / 100; for(uint i; i < t2Amts.length;){ minAmt2 = minAmt2 + t2Amts[i]; unchecked{++i;} } minAmt2 = (minAmt2 / 10) - ((minAmt2 / 10) * 2 ) / 100; } /*////////////////////////////////////////////////////////////// SETTERS //////////////////////////////////////////////////////////////*/ function setFeesAndRecipient(uint64 _platformFee, uint64 _withdrawFee, uint64 _callFee, uint64 _stratFee, uint64 _treasuryFee, uint64 _recipientFee, address _recipient) external onlyOwner { if(_platformFee > 35){revert XpandrErrors.OverCap();} if(_withdrawFee != 0 || _withdrawFee != 1){revert XpandrErrors.OverCap();} uint64 sum = _callFee + _stratFee + _treasuryFee + _recipientFee; if(sum > FEE_DIVISOR){revert XpandrErrors.OverCap();} if(_recipient != address(0) && _recipient != feeRecipient){feeRecipient = _recipient;} platformFee = _platformFee; callFee = _callFee; stratFee = _stratFee; withdrawFee = _withdrawFee; treasuryFee = _treasuryFee; recipientFee = _recipientFee; emit SetFeesAndRecipient(withdrawFee, sum, feeRecipient); } function setRouterOrGauge(address _router, address _gauge) external onlyOwner { if(_router == address(0) || _gauge == address(0)){revert XpandrErrors.ZeroAddress();} if(_router != router){router = _router;} if(_gauge != gauge){gauge = _gauge;} emit SetRouterOrGauge(router, gauge); } function setPaths(IEqualizerRouter.Routes[] memory _equalToMpx, IEqualizerRouter.Routes[] memory _equalToWftm) external onlyAdmin{ if(_equalToMpx.length != 0){ for (uint i; i < _equalToMpx.length;) { equalToMpxPath.push(_equalToMpx[i]); unchecked{++i;} } } if(_equalToWftm.length != 0){ for (uint i; i < _equalToWftm.length;) { equalToWftmPath.push(_equalToWftm[i]); unchecked{++i;} } } emit SetPaths(equalToMpxPath, equalToWftmPath); } function setFeeToken(address _feeToken) external onlyAdmin { if(_feeToken == address(0) || _feeToken == feeToken){revert XpandrErrors.InvalidTokenOrPath();} feeToken = _feeToken; emit SetFeeToken(_feeToken); ERC20(_feeToken).safeApprove(router, 0); ERC20(_feeToken).safeApprove(router, type(uint).max); } function setHarvestOnDeposit(uint8 _harvestOnDeposit) external onlyAdmin { if(_harvestOnDeposit != 0 || _harvestOnDeposit != 1){revert XpandrErrors.OverCap();} harvestOnDeposit = _harvestOnDeposit; } function setDelay(uint64 _delay) external onlyAdmin{ if(_delay > 1800 || _delay < 600) {revert XpandrErrors.InvalidDelay();} delay = _delay; } /*////////////////////////////////////////////////////////////// UTILS ////////////////////////////////////////////////////////////// This function exists for cases where a vault may receive sporadic 3rd party rewards such as airdrop from it's deposit in a farm. Enables convert that token into more of this vault's reward. */ function customTx(address _token, uint _amount, IEqualizerRouter.Routes[] memory _path) external onlyAdmin { if(_token == equal || _token == wftm || _token == mpx){revert XpandrErrors.InvalidTokenOrPath();} uint bal; if(_amount == 0) {bal = ERC20(_token).balanceOf(address(this));} else {bal = _amount;} for (uint i; i < _path.length;) { customPath.push(_path[i]); unchecked{++i;} } emit CustomTx(_token, bal); ERC20(_token).safeApprove(router, 0); ERC20(_token).safeApprove(router, type(uint).max); IEqualizerRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(bal, 1, customPath, address(this), _timestamp()); } function _subAllowance() internal { asset.safeApprove(gauge, 0); ERC20(equal).safeApprove(router, 0); ERC20(wftm).safeApprove(router, 0); ERC20(mpx).safeApprove(router, 0); } function _addAllowance() internal { asset.safeApprove(gauge, type(uint).max); ERC20(equal).safeApprove(router, type(uint).max); ERC20(wftm).safeApprove(router, type(uint).max); ERC20(mpx).safeApprove(router, type(uint).max); } //ERC4626 hook. Called by deposit if harvestOnDeposit = 1. Args unused but part of spec function afterDeposit(uint assets, uint shares) internal override { _harvest(tx.origin); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ERC20","name":"_asset","type":"address"},{"internalType":"address","name":"_gauge","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_feeToken","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToWftmPath","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToMpxPath","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidDelay","type":"error"},{"inputs":[],"name":"InvalidTokenOrPath","type":"error"},{"inputs":[],"name":"NoAuth","type":"error"},{"inputs":[],"name":"NotAccountOwner","type":"error"},{"inputs":[],"name":"NotEOA","type":"error"},{"inputs":[],"name":"NotPaused","type":"error"},{"inputs":[],"name":"NotStrategist","type":"error"},{"inputs":[],"name":"OverCap","type":"error"},{"inputs":[],"name":"Paused","type":"error"},{"inputs":[],"name":"UnderTimeLock","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CustomTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"harvester","type":"address"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"Panic","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newFeeToken","type":"address"}],"name":"SetFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"withdrawFee","type":"uint64"},{"indexed":true,"internalType":"uint64","name":"totalFees","type":"uint64"},{"indexed":true,"internalType":"address","name":"newRecipient","type":"address"}],"name":"SetFeesAndRecipient","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"indexed":true,"internalType":"struct IEqualizerRouter.Routes[]","name":"path1","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"indexed":true,"internalType":"struct IEqualizerRouter.Routes[]","name":"path2","type":"tuple[]"}],"name":"SetPaths","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newGauge","type":"address"}],"name":"SetRouterOrGauge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newStrategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"StuckTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"WasPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"customPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_path","type":"tuple[]"}],"name":"customTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"equal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"equalToMpxPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"equalToWftmPath","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gauge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"idleFunds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mpx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"panic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipientFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_delay","type":"uint64"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToken","type":"address"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_platformFee","type":"uint64"},{"internalType":"uint64","name":"_withdrawFee","type":"uint64"},{"internalType":"uint64","name":"_callFee","type":"uint64"},{"internalType":"uint64","name":"_stratFee","type":"uint64"},{"internalType":"uint64","name":"_treasuryFee","type":"uint64"},{"internalType":"uint64","name":"_recipientFee","type":"uint64"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"setFeesAndRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_harvestOnDeposit","type":"uint8"}],"name":"setHarvestOnDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToMpx","type":"tuple[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct IEqualizerRouter.Routes[]","name":"_equalToWftm","type":"tuple[]"}],"name":"setPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_gauge","type":"address"}],"name":"setRouterOrGauge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stratFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultProfit","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wftm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610100604052601480547878000000000000024e000000000000000000000000000000236fffffffffffffffff0000000000000000909116179055601580546001600160401b0319166101221790553480156200005b57600080fd5b5060405162004bfc38038062004bfc8339810160408190526200007e9162000901565b6040516b15195cdd195c8815985d5b1d60a21b60208201528790602c0160408051601f19818403018152908290526104c560f41b6020830152906022016040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200010b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001319190620009d7565b60006200013f848262000a92565b5060016200014e838262000a92565b5060ff81166080524660a05262000164620004cc565b60c0525050506001600160a01b0390921660e0525050600680546001600160a01b03199081163390811790925560078054909116821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36007546040516001600160a01b03909116906000907f03aa7a3f25bf4594fe3353db7ca93b2dac0aec91d473f8a33e998b97405cd1fc908290a360078054600e80546001600160a01b03808b166001600160a01b031992831617909255600f80548a841690831617905560088054898416921691909117905585166001600160a81b0319909116179055601680546001600160401b03191661025817905560005b82518110156200030057601183828151811062000289576200028962000b5e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b031990931693909116929092171790550162000268565b5060005b81518110156200039c57601282828151811062000325576200032562000b5e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b031990931693909116929092171790550162000304565b5060408051808201909152733fd3a0c85b70754efc07ac9ac0cbbdce664865a681527321be370d5312f44cb42ce377bc9b8a0cef1a4c836020820152620003e890600a90600262000721565b5060408051808201909152733d6c56f6855b7cc746fb80848755b0a9c377012281526001600160a01b03881660208201526200042990600c90600262000721565b50600980546001810182556000919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b031916733fd3a0c85b70754efc07ac9ac0cbbdce664865a61790556200048a62000568565b601580546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620004bf620005ec565b5050505050505062000c49565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000500919062000b74565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60008060e0516001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015620005ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d2919062000bf2565b92505050806105dc620005e6919062000c21565b91505090565b600e5460e0516200060d916001600160a01b0391821691166000196200069f565b600f546200063d90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b03166000196200069f565b600f546200066d907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b03166000196200069f565b600f546200069d907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b03166000196200069f565b565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806200071b5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b604482015260640160405180910390fd5b50505050565b82600281019282156200076c579160200282015b828111156200076c57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000735565b506200077a9291506200077e565b5090565b5b808211156200077a57600081556001016200077f565b6001600160a01b0381168114620007ab57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620007e957620007e9620007ae565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200081a576200081a620007ae565b604052919050565b600082601f8301126200083457600080fd5b815160206001600160401b03821115620008525762000852620007ae565b62000862818360051b01620007ef565b828152606092830285018201928282019190878511156200088257600080fd5b8387015b85811015620008f45781818a031215620008a05760008081fd5b620008aa620007c4565b8151620008b78162000795565b815281860151620008c88162000795565b818701526040828101518015158114620008e25760008081fd5b90820152845292840192810162000886565b5090979650505050505050565b600080600080600080600060e0888a0312156200091d57600080fd5b87516200092a8162000795565b60208901519097506200093d8162000795565b6040890151909650620009508162000795565b6060890151909550620009638162000795565b6080890151909450620009768162000795565b60a08901519093506001600160401b03808211156200099457600080fd5b620009a28b838c0162000822565b935060c08a0151915080821115620009b957600080fd5b50620009c88a828b0162000822565b91505092959891949750929550565b600060208284031215620009ea57600080fd5b815160ff81168114620009fc57600080fd5b9392505050565b600181811c9082168062000a1857607f821691505b60208210810362000a3957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a8d57600081815260208120601f850160051c8101602086101562000a685750805b601f850160051c820191505b8181101562000a895782815560010162000a74565b5050505b505050565b81516001600160401b0381111562000aae5762000aae620007ae565b62000ac68162000abf845462000a03565b8462000a3f565b602080601f83116001811462000afe576000841562000ae55750858301515b600019600386901b1c1916600185901b17855562000a89565b600085815260208120601f198616915b8281101562000b2f5788860151825594840194600190910190840162000b0e565b508582101562000b4e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600080835462000b848162000a03565b6001828116801562000b9f576001811462000bb55762000be6565b60ff198416875282151583028701945062000be6565b8760005260208060002060005b8581101562000bdd5781548a82015290840190820162000bc2565b50505082870194505b50929695505050505050565b60008060006060848603121562000c0857600080fd5b8351925060208401519150604084015190509250925092565b8082018082111562000c4357634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a05160c05160e051613f1e62000cde60003960008181610564015281816108f8015281816110cf0152818161121901528181611b8d01528181611c6d01528181611ca701528181611e0201528181612097015281816122a10152818161236e01528181612448015281816127e8015261291301526000610d3401526000610d04015260006105350152613f1e6000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c806377c7b8fc116101f4578063b460af941161011a578063de5f6268116100ad578063f2fde38b1161007c578063f2fde38b14610890578063f4a22de1146108a3578063f4f45b46146108ab578063f887ea40146108c657600080fd5b8063de5f626814610848578063e16c380f14610850578063e7c43a9214610863578063e941fa781461087657600080fd5b8063c7b9d530116100e9578063c7b9d530146107dd578063cc32d176146107f0578063cddff3b01461080a578063dd62ed3e1461081d57600080fd5b8063b460af9414610791578063b6ad0634146107a4578063c1073302146107b7578063c6e6f592146107ca57600080fd5b80638e645f89116101925780639e93ad8e116101615780639e93ad8e1461075a578063a6f19c8414610763578063a9059cbb14610776578063aa5c3ab41461078957600080fd5b80638e645f891461071d57806390321e1a1461073057806395d89b411461074a57806397fd323d1461075257600080fd5b80637f8721ca116101ce5780637f8721ca146106e05780638456cb59146106fa578063853828b6146107025780638da5cb5b1461070a57600080fd5b806377c7b8fc146106a55780637bb7bed1146106ad5780637ecebe00146106c057600080fd5b806338d52e0f116102e457806361d027b3116102775780636a42b8f8116102465780636a42b8f81461064c5780636e553f651461065f57806370a082311461067257806375ffc0101461069257600080fd5b806361d027b3146105f0578063647846a51461060b5780636940fba01461061e57806369989d9d1461063957600080fd5b806346904840116102b357806346904840146105b05780634700d305146105c35780635056bc61146105cb5780635c975abb146105de57600080fd5b806338d52e0f1461055f5780633f4ba83a1461058657806340bda4021461058e5780634641257d146105a857600080fd5b806318160ddd1161035c57806323b872dd1161032b57806323b872dd146104f257806326232a2e14610505578063313ce567146105305780633644e5151461055757600080fd5b806318160ddd146104685780631aa0e548146104715780631e228514146104ac5780631fe4a686146104df57600080fd5b8063095ea7b311610398578063095ea7b314610402578063115880861461042557806315cce2241461042d57806316c61ccc1461044257600080fd5b806301e1d114146103bf57806306fdde03146103da57806307a2d13a146103ef575b600080fd5b6103c76108d9565b6040519081526020015b60405180910390f35b6103e261097a565b6040516103d19190613626565b6103c76103fd366004613674565b610a08565b6104156104103660046136a9565b610a35565b60405190151581526020016103d1565b6103c7610aa2565b61044061043b3660046136d3565b610b10565b005b60075461045690600160a01b900460ff1681565b60405160ff90911681526020016103d1565b6103c760025481565b61048461047f366004613674565b610bda565b604080516001600160a01b0394851681529390921660208401521515908201526060016103d1565b6104c7733fd3a0c85b70754efc07ac9ac0cbbdce664865a681565b6040516001600160a01b0390911681526020016103d1565b6007546104c7906001600160a01b031681565b6104156105003660046136ee565b610c20565b601454610518906001600160401b031681565b6040516001600160401b0390911681526020016103d1565b6104567f000000000000000000000000000000000000000000000000000000000000000081565b6103c7610d00565b6104c77f000000000000000000000000000000000000000000000000000000000000000081565b610440610d56565b60155461051890600160401b90046001600160401b031681565b610440610d78565b6010546104c7906001600160a01b031681565b610440610dfd565b6104406105d936600461372a565b610ea3565b600754600160a01b900460ff16610456565b6104c773e37058057b0751bd2653fdeb27e8218439e0f72681565b6008546104c7906001600160a01b031681565b6104c77366eed5ff1701e6ed8470dc391f05e27b1d0657eb81565b61044061064736600461374d565b610f03565b601654610518906001600160401b031681565b6103c761066d366004613780565b610feb565b6103c76106803660046136d3565b60036020526000908152604090205481565b6104406106a03660046137ba565b61126f565b6103c76114e0565b6104c76106bb366004613674565b611520565b6103c76106ce3660046136d3565b60056020526000908152604090205481565b60155461051890600160c01b90046001600160401b031681565b61044061154a565b610440611562565b6006546104c7906001600160a01b031681565b61044061072b36600461398f565b6115cc565b60145461051890600160c01b90046001600160401b031681565b6103e2611857565b6103c7611864565b6105186103e881565b600e546104c7906001600160a01b031681565b6104156107843660046136a9565b611968565b6103c76119ce565b6103c761079f3660046139e5565b611a19565b601554610518906001600160401b031681565b6104406107c5366004613a21565b611cd6565b6103c76107d8366004613674565b611d42565b6104406107eb3660046136d3565b611d62565b60145461051890600160801b90046001600160401b031681565b610484610818366004613674565b611dd9565b6103c761082b36600461374d565b600460209081526000928352604080842090915290825290205481565b610440611de9565b61044061085e366004613a3c565b611e7b565b610484610871366004613674565b61201b565b60145461051890600160401b90046001600160401b031681565b61044061089e3660046136d3565b61202b565b6103c761207f565b6104c77321be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b600f546104c7906001600160a01b031681565b60006108e3610aa2565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b9190613a9f565b6109759190613ace565b905090565b6000805461098790613ae1565b80601f01602080910402602001604051908101604052809291908181526020018280546109b390613ae1565b8015610a005780601f106109d557610100808354040283529160200191610a00565b820191906000526020600020905b8154815290600101906020018083116109e357829003601f168201915b505050505081565b6002546000908015610a2c57610a27610a1f6108d9565b8490836120ce565b610a2e565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a909086815260200190565b60405180910390a35060015b92915050565b600e546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a08231906024015b602060405180830381865afa158015610aec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190613a9f565b610b186120ec565b6001600160a01b0381161580610b3b57506008546001600160a01b038281169116145b15610b5957604051637daf14b960e11b815260040160405180910390fd5b600880546001600160a01b0319166001600160a01b0383169081179091556040517f0842bcbb92ca6d47ae89816778a843992dff9b876fad009865e1c5df73d46d1f90600090a2600f54610bbb906001600160a01b038381169116600061212f565b600f54610bd7906001600160a01b03838116911660001961212f565b50565b60118181548110610bea57600080fd5b6000918252602090912060029091020180546001909101546001600160a01b03918216925090811690600160a01b900460ff1683565b6001600160a01b03831660009081526004602090815260408083203384529091528120546000198114610c7c57610c578382613b1b565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b03851660009081526003602052604081208054859290610ca4908490613b1b565b90915550506001600160a01b0380851660008181526003602052604090819020805487019055519091871690600080516020613ec983398151915290610ced9087815260200190565b60405180910390a3506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610d31576109756121ab565b507f000000000000000000000000000000000000000000000000000000000000000090565b610d5e6120ec565b610d66612245565b610d6e612290565b610d76612356565b565b333214610d9857604051635d04968b60e11b815260040160405180910390fd5b601654601554610dbb916001600160401b0390811691600160801b900416613b2e565b6001600160401b0316610dcc612443565b6001600160401b03161015610df45760405163cba1549360e01b815260040160405180910390fd5b610d76336124e0565b610e056120ec565b610e0d61154a565b60405133907fa0281c9359a6afac738fb86a45f94a2482ed1f0bfbdf7ce5ef88046acf47160c90600090a2600e546001600160a01b0316632e1a7d4d610e51610aa2565b6040518263ffffffff1660e01b8152600401610e6f91815260200190565b600060405180830381600087803b158015610e8957600080fd5b505af1158015610e9d573d6000803e3d6000fd5b50505050565b610eab6120ec565b60ff8116151580610ec057508060ff16600114155b15610ede5760405163342fa66d60e01b815260040160405180910390fd5b6016805460ff909216600160401b0268ff000000000000000019909216919091179055565b610f0b612650565b6001600160a01b0382161580610f2857506001600160a01b038116155b15610f465760405163d92e233d60e01b815260040160405180910390fd5b600f546001600160a01b03838116911614610f7757600f80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b03828116911614610fa857600e80546001600160a01b0319166001600160a01b0383161790555b600e54600f546040516001600160a01b0392831692909116907f8b3031f0f8cd174261d286f87b17642361e59c9a806d90edfcab16be87521cf890600090a35050565b6000610ff561267b565b326001600160a01b0383161461101e5760405163fcfdb9b560e01b815260040160405180910390fd5b6001600160a01b0382166000908152601760205260409020546001600160401b0316156110b0576016546001600160a01b038316600090815260176020526040902054611077916001600160401b039081169116613b2e565b6001600160401b0316611088612443565b6001600160401b031610156110b05760405163cba1549360e01b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611116573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113a9190613a9f565b83111561115a5760405163342fa66d60e01b815260040160405180910390fd5b61116383611d42565b9050821580611170575080155b1561118e57604051631f2a200560e01b815260040160405180910390fd5b611196612443565b6001600160a01b038316600081815260176020908152604091829020805467ffffffffffffffff19166001600160401b0395909516949094179093558051868152928301849052909182917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36112416001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168330866126a6565b61124b8282612729565b611253612356565b601654600160401b900460ff1615610a9c57610a9c8382612783565b611277612650565b6023876001600160401b031611156112a25760405163342fa66d60e01b815260040160405180910390fd5b6001600160401b0386161515806112c35750856001600160401b0316600114155b156112e15760405163342fa66d60e01b815260040160405180910390fd5b600082846112ef8789613b2e565b6112f99190613b2e565b6113039190613b2e565b90506103e86001600160401b03821611156113315760405163342fa66d60e01b815260040160405180910390fd5b6001600160a01b0382161580159061135757506010546001600160a01b03838116911614155b1561137857601080546001600160a01b0319166001600160a01b0384161790555b87601460006101000a8154816001600160401b0302191690836001600160401b0316021790555085601460186101000a8154816001600160401b0302191690836001600160401b0316021790555084601560006101000a8154816001600160401b0302191690836001600160401b0316021790555086601460086101000a8154816001600160401b0302191690836001600160401b0316021790555083601460106101000a8154816001600160401b0302191690836001600160401b0316021790555082601560086101000a8154816001600160401b0302191690836001600160401b03160217905550601060009054906101000a90046001600160a01b03166001600160a01b0316816001600160401b0316601460089054906101000a90046001600160401b03166001600160401b03167f93556f00d8b8f319e3516a48ab333665a8f50701dff4b81b788ffe071f49eec160405160405180910390a45050505050505050565b6000600254600014611513576002546114f76108d9565b61150990670de0b6b3a7640000613b55565b6109759190613b6c565b50670de0b6b3a764000090565b6009818154811061153057600080fd5b6000918252602090912001546001600160a01b0316905081565b6115526120ec565b61155a61278c565b610d766127d7565b6040516370a0823160e01b8152336004820152610bd79030906370a0823190602401602060405180830381865afa1580156115a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c59190613a9f565b3333611a19565b6115d46120ec565b6001600160a01b038316733fd3a0c85b70754efc07ac9ac0cbbdce664865a6148061161b57506001600160a01b0383167321be370d5312f44cb42ce377bc9b8a0cef1a4c83145b8061164257506001600160a01b0383167366eed5ff1701e6ed8470dc391f05e27b1d0657eb145b1561166057604051637daf14b960e11b815260040160405180910390fd5b6000826000036116d9576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156116ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d29190613a9f565b90506116dc565b50815b60005b82518110156117725760138382815181106116fc576116fc613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b03199093169390911692909217179055016116df565b5060405181906001600160a01b038616907f2212e80f309574493dff7fb06c8e36c69accb8120969523a90079d38cfe3dd6690600090a3600f546117c4906001600160a01b038681169116600061212f565b600f546117e0906001600160a01b03868116911660001961212f565b600f546001600160a01b0316636cc1ae138260016013306117ff612443565b6040518663ffffffff1660e01b815260040161181f959493929190613c0e565b600060405180830381600087803b15801561183957600080fd5b505af115801561184d573d6000803e3d6000fd5b5050505050505050565b6001805461098790613ae1565b60008061186f6119ce565b90506000811561191d57600f54604051635e1e632560e01b815260048101849052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527321be370d5312f44cb42ce377bc9b8a0cef1a4c8360448201526001600160a01b0390911690635e1e6325906064016040805180830381865afa1580156118f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119199190613c58565b5090505b6014546103e8906001600160401b03600160c01b82048116918391611943911685613b55565b61194d9190613b6c565b6119579190613b55565b6119619190613b6c565b9250505090565b33600090815260036020526040812080548391908390611989908490613b1b565b90915550506001600160a01b03831660008181526003602052604090819020805485019055513390600080516020613ec983398151915290610a909086815260200190565b600e5460405163211dc32d60e01b8152733fd3a0c85b70754efc07ac9ac0cbbdce664865a660048201523060248201526000916001600160a01b03169063211dc32d90604401610acf565b6000326001600160a01b03841614801590611a3d5750326001600160a01b03831614155b15611a5b5760405163fcfdb9b560e01b815260040160405180910390fd5b6040516370a0823160e01b81526001600160a01b038316600482015230906370a0823190602401602060405180830381865afa158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190613a9f565b841115611ae35760405163342fa66d60e01b815260040160405180910390fd5b611aec84610a08565b9050801580611af9575083155b15611b1757604051631f2a200560e01b815260040160405180910390fd5b611b218285612899565b60408051828152602081018690526001600160a01b03808516929086169183917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a4611b75816128fb565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190613a9f565b905081811115611c0d5750805b601454600160401b90046001600160401b031615611c9a576014546000906103e890611c4990600160401b90046001600160401b031684613b55565b611c539190613b6c565b9050611c9485611c638385613b1b565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906129ff565b50611cce565b611cce6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685836129ff565b509392505050565b611cde6120ec565b610708816001600160401b03161180611d015750610258816001600160401b0316105b15611d1f576040516327df2edd60e11b815260040160405180910390fd5b6016805467ffffffffffffffff19166001600160401b0392909216919091179055565b6002546000908015610a2c57610a2781611d5a6108d9565b8591906120ce565b6007546001600160a01b03163314611d8d57604051633163ba6d60e11b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b03831690811790915560405133907f03aa7a3f25bf4594fe3353db7ca93b2dac0aec91d473f8a33e998b97405cd1fc90600090a350565b60138181548110610bea57600080fd5b6040516370a0823160e01b8152336004820152610bd7907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613a9f565b33610feb565b611e836120ec565b815115611f225760005b8251811015611f20576012838281518110611eaa57611eaa613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b0319909316939091169290921717905501611e8d565b505b805115611fc15760005b8151811015611fbf576011828281518110611f4957611f49613b8e565b602090810291909101810151825460018181018555600094855293839020825160029092020180546001600160a01b039283166001600160a01b03199091161781559282015192840180546040909301511515600160a01b026001600160a81b0319909316939091169290921717905501611f2c565b505b6011604051611fd09190613c88565b60405180910390206012604051611fe79190613c88565b604051908190038120907f13677c09f2b66a2d8b72275f0444cf65133d3637b6928cca9f66b7e925d42dd990600090a35050565b60128181548110610bea57600080fd5b612033612650565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401610acf565b60008260001904841183021582026120e557600080fd5b5091020490565b6006546001600160a01b03163314158061211157506007546001600160a01b03163314155b15610d765760405163518d568f60e11b815260040160405180910390fd5b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610e9d5760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b60448201526064015b60405180910390fd5b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516121dd9190613cef565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b61224d612a77565b6007805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b600e546122cc906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911660001961212f565b600f546122fa90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b031660001961212f565b600f54612328907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b031660001961212f565b600f54610d76907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b031660001961212f565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156123bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e19190613a9f565b600e5460405163b6b55f2560e01b8152600481018390529192506001600160a01b03169063b6b55f2590602401600060405180830381600087803b15801561242857600080fd5b505af115801561243c573d6000803e3d6000fd5b5050505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156124a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c89190613d8e565b92505050806105dc6124da9190613ace565b91505090565b6124e861267b565b6124f0612443565b601580546001600160401b0392909216600160801b0267ffffffffffffffff60801b199092169190911790556040516001600160a01b038216907f188a622567eeca997c3d494fd65f76ca910b90a50a0c44d5e37b2ea5539e027b90600090a2600e546040516331279d3d60e01b81526001600160a01b03909116906331279d3d90612583903090600990600401613dbc565b600060405180830381600087803b15801561259d57600080fd5b505af11580156125b1573d6000803e3d6000fd5b50506040516370a0823160e01b815230600482015260009250733fd3a0c85b70754efc07ac9ac0cbbdce664865a691506370a0823190602401602060405180830381865afa158015612607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262b9190613a9f565b905080156126445761263c82612aa7565b612644613098565b61264c612356565b5050565b6006546001600160a01b03163314610d765760405163518d568f60e11b815260040160405180910390fd5b600754600160a01b900460ff1615610d76576040516313d0ff5960e31b815260040160405180910390fd5b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d116001600051141617169150508061243c5760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b60448201526064016121a2565b806002600082825461273b9190613ace565b90915550506001600160a01b038216600081815260036020908152604080832080548601905551848152600080516020613ec983398151915291015b60405180910390a35050565b61264c326124e0565b61279461267b565b6007805460ff60a01b1916600160a01b1790556040513381527f0ffc06e772e88e14988dce23e839899164e7a0fca52ac2179c86ae816b955a9990602001612286565b600e54612812906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116600061212f565b600f5461283f90733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906001600160a01b0316600061212f565b600f5461286c907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906001600160a01b0316600061212f565b600f54610d76907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906001600160a01b0316600061212f565b6001600160a01b038216600090815260036020526040812080548392906128c1908490613b1b565b90915550506002805482900390556040518181526000906001600160a01b03841690600080516020613ec983398151915290602001612777565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612962573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129869190613a9f565b90508181101561264c57600e546001600160a01b0316632e1a7d4d6129ab8385613b1b565b6040518263ffffffff1660e01b81526004016129c991815260200190565b600060405180830381600087803b1580156129e357600080fd5b505af11580156129f7573d6000803e3d6000fd5b505050505050565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610e9d5760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b60448201526064016121a2565b600754600160a01b900460ff1660ff16600114610d7657604051636cd6020160e01b815260040160405180910390fd5b6014546040516370a0823160e01b81523060048201526000916103e8916001600160401b0390911690733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa158015612b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b309190613a9f565b612b3a9190613b55565b612b449190613b6c565b6040516370a0823160e01b81523060048201529091506000908290733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa158015612b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bbf9190613a9f565b612bc99190613b1b565b600f54604051635e1e632560e01b815260048101839052733fd3a0c85b70754efc07ac9ac0cbbdce664865a660248201527304068da6c83afcfa0e13ba15a6696662335d5b7560448201529192506000916001600160a01b0390911690635e1e6325906064016040805180830381865afa158015612c4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c6f9190613c58565b509050612c8164e8d4a5100082613b6c565b601554612c9e9190600160c01b90046001600160401b0316613b2e565b601580546001600160c01b0316600160c01b6001600160401b03938416021790819055600f546008546001600160a01b03918216936313dcfc59938893600193733fd3a0c85b70754efc07ac9ac0cbbdce664865a6939116916000913091612d1091600160801b90910416603c613b2e565b6040516001600160e01b031960e08a901b168152600481019790975260248701959095526001600160a01b0393841660448701529183166064860152151560848501521660a48301526001600160401b031660c482015260e4016000604051808303816000875af1158015612d89573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612db19190810190613e1b565b506008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1f9190613a9f565b6014549091506000906103e890612e4690600160c01b90046001600160401b031684613b55565b612e509190613b6c565b60085460405163a9059cbb60e01b81526001600160a01b0389811660048301526024820184905292935091169063a9059cbb906044016020604051808303816000875af1158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190613eab565b50601554600160401b90046001600160401b031615612f32576015546000906103e890612f0690600160401b90046001600160401b031685613b55565b612f109190613b6c565b601054600854919250612f30916001600160a01b039081169116836129ff565b505b6014546000906103e890612f5690600160801b90046001600160401b031685613b55565b612f609190613b6c565b60085460405163a9059cbb60e01b815273e37058057b0751bd2653fdeb27e8218439e0f7266004820152602481018390529192506001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015612fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fea9190613eab565b506015546000906103e890613008906001600160401b031686613b55565b6130129190613b6c565b60085460075460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb906044016020604051808303816000875af1158015613069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308d9190613eab565b505050505050505050565b6040516370a0823160e01b8152306004820152600090600190733fd3a0c85b70754efc07ac9ac0cbbdce664865a6906370a0823190602401602060405180830381865afa1580156130ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131119190613a9f565b901c90506000806131218361341d565b600f54601554604051631e82ecdb60e31b81529395509193506001600160a01b03169163f41766d89161317191879187916011913091600160801b9091046001600160401b031690600401613c0e565b6000604051808303816000875af1158015613190573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131b89190810190613e1b565b50600f54601554604051631e82ecdb60e31b81526001600160a01b039092169163f41766d89161320591879186916012913091600160801b9091046001600160401b031690600401613c0e565b6000604051808303816000875af1158015613224573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261324c9190810190613e1b565b506040516370a0823160e01b81523060048201526000907321be370d5312f44cb42ce377bc9b8a0cef1a4c83906370a0823190602401602060405180830381865afa15801561329f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c39190613a9f565b6040516370a0823160e01b81523060048201529091506000907366eed5ff1701e6ed8470dc391f05e27b1d0657eb906370a0823190602401602060405180830381865afa158015613318573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333c9190613a9f565b600f54601554604051635a47ddc360e01b81527321be370d5312f44cb42ce377bc9b8a0cef1a4c8360048201527366eed5ff1701e6ed8470dc391f05e27b1d0657eb6024820152600060448201526064810186905260848101849052600160a4820181905260c48201523060e4820152600160801b9091046001600160401b03166101048201529192506001600160a01b031690635a47ddc390610124016060604051808303816000875af11580156133f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184d9190613d8e565b600c54600a546040516313345fe160e01b81526001600160a01b039182166004820152602481018490526005604482015260026064820152600092839283929116906313345fe190608401600060405180830381865afa158015613485573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134ad9190810190613e1b565b905060005b81518110156134ea578181815181106134cd576134cd613b8e565b6020026020010151846134e09190613ace565b93506001016134b2565b506134f6600a84613b6c565b600d54600b546040516313345fe160e01b81526001600160a01b0391821660048201526024810184905260056044820152600260648201529295506000929116906313345fe190608401600060405180830381865afa15801561355d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526135859190810190613e1b565b90506064613594856002613b55565b61359e9086613b1b565b6135a89190613b6c565b935060005b81518110156135e5578181815181106135c8576135c8613b8e565b6020026020010151846135db9190613ace565b93506001016135ad565b5060646135f3600a85613b6c565b6135fe906002613b55565b6136089190613b6c565b613613600a85613b6c565b61361d9190613b1b565b92505050915091565b600060208083528351808285015260005b8181101561365357858101830151858201604001528201613637565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561368657600080fd5b5035919050565b80356001600160a01b03811681146136a457600080fd5b919050565b600080604083850312156136bc57600080fd5b6136c58361368d565b946020939093013593505050565b6000602082840312156136e557600080fd5b610a2e8261368d565b60008060006060848603121561370357600080fd5b61370c8461368d565b925061371a6020850161368d565b9150604084013590509250925092565b60006020828403121561373c57600080fd5b813560ff81168114610a2e57600080fd5b6000806040838503121561376057600080fd5b6137698361368d565b91506137776020840161368d565b90509250929050565b6000806040838503121561379357600080fd5b823591506137776020840161368d565b80356001600160401b03811681146136a457600080fd5b600080600080600080600060e0888a0312156137d557600080fd5b6137de886137a3565b96506137ec602089016137a3565b95506137fa604089016137a3565b9450613808606089016137a3565b9350613816608089016137a3565b925061382460a089016137a3565b915061383260c0890161368d565b905092959891949750929550565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561387857613878613840565b60405290565b604051601f8201601f191681016001600160401b03811182821017156138a6576138a6613840565b604052919050565b60006001600160401b038211156138c7576138c7613840565b5060051b60200190565b8015158114610bd757600080fd5b600082601f8301126138f057600080fd5b81356020613905613900836138ae565b61387e565b8281526060928302850182019282820191908785111561392457600080fd5b8387015b858110156139825781818a0312156139405760008081fd5b613948613856565b6139518261368d565b815261395e86830161368d565b86820152604080830135613971816138d1565b908201528452928401928101613928565b5090979650505050505050565b6000806000606084860312156139a457600080fd5b6139ad8461368d565b92506020840135915060408401356001600160401b038111156139cf57600080fd5b6139db868287016138df565b9150509250925092565b6000806000606084860312156139fa57600080fd5b83359250613a0a6020850161368d565b9150613a186040850161368d565b90509250925092565b600060208284031215613a3357600080fd5b610a2e826137a3565b60008060408385031215613a4f57600080fd5b82356001600160401b0380821115613a6657600080fd5b613a72868387016138df565b93506020850135915080821115613a8857600080fd5b50613a95858286016138df565b9150509250929050565b600060208284031215613ab157600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a9c57610a9c613ab8565b600181811c90821680613af557607f821691505b602082108103613b1557634e487b7160e01b600052602260045260246000fd5b50919050565b81810381811115610a9c57610a9c613ab8565b6001600160401b03818116838216019080821115613b4e57613b4e613ab8565b5092915050565b8082028115828204841417610a9c57610a9c613ab8565b600082613b8957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b6000815480845260208085019450836000528060002060005b83811015613c035781546001600160a01b039081168852600183810154918216858a015260a09190911c60ff161515604089015260609097019660029092019101613bbd565b509495945050505050565b85815284602082015260a060408201526000613c2d60a0830186613ba4565b6001600160a01b03949094166060830152506001600160401b03919091166080909101529392505050565b60008060408385031215613c6b57600080fd5b825191506020830151613c7d816138d1565b809150509250929050565b60008183548391508460005260208060002060005b83811015613ce35781546001600160a01b0390811686526001838101549182168588015260a09190911c60ff161515604087015260609095019460029092019101613c9d565b50929695505050505050565b600080835481600182811c915080831680613d0b57607f831692505b60208084108203613d2a57634e487b7160e01b86526022600452602486fd5b818015613d3e5760018114613d5357613d80565b60ff1986168952841515850289019650613d80565b60008a81526020902060005b86811015613d785781548b820152908501908301613d5f565b505084890196505b509498975050505050505050565b600080600060608486031215613da357600080fd5b8351925060208401519150604084015190509250925092565b60006040820160018060a01b03808616845260206040818601528286548085526060870191508760005282600020945060005b81811015613e0d578554851683526001958601959284019201613def565b509098975050505050505050565b60006020808385031215613e2e57600080fd5b82516001600160401b03811115613e4457600080fd5b8301601f81018513613e5557600080fd5b8051613e63613900826138ae565b81815260059190911b82018301908381019087831115613e8257600080fd5b928401925b82841015613ea057835182529284019290840190613e87565b979650505050505050565b600060208284031215613ebd57600080fd5b8151610a2e816138d156feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212207909f9013660b9bcf0f3e6cfb23314b98fd3d636e9b45aee7765ffa6d98158e564736f6c63430008130033000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca1300000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf530000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b28500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c24800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8300000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb0000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca1300000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf530000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b28500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c830000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c24800000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000010000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a600000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8300000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _asset (address): 0xde26e98d868fe02fffb6df26e638995124d3ca13
Arg [1] : _gauge (address): 0x27f7cf5e918311aaf5e7185b5bcdac158dfacf53
Arg [2] : _router (address): 0x2aa07920e4ecb4ea8c801d9dfece63875623b285
Arg [3] : _feeToken (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [4] : _strategist (address): 0x3c173f1baf9f97bf244796c0179952a6a2e9c248
Arg [5] : _equalToWftmPath (tuple[]): System.Object
Arg [6] : _equalToMpxPath (tuple[]): System.Object,System.Object
-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 000000000000000000000000de26e98d868fe02fffb6df26e638995124d3ca13
Arg [1] : 00000000000000000000000027f7cf5e918311aaf5e7185b5bcdac158dfacf53
Arg [2] : 0000000000000000000000002aa07920e4ecb4ea8c801d9dfece63875623b285
Arg [3] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [4] : 0000000000000000000000003c173f1baf9f97bf244796c0179952a6a2e9c248
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Arg [9] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [12] : 0000000000000000000000003fd3a0c85b70754efc07ac9ac0cbbdce664865a6
Arg [13] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83
Arg [16] : 00000000000000000000000066eed5ff1701e6ed8470dc391f05e27b1d0657eb
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
31940:17698:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42175:133;;;:::i;:::-;;;160:25:1;;;148:2;133:18;42175:133:0;;;;;;;;6671:18;;;:::i;:::-;;;;;;;:::i;43181:260::-;;;;;;:::i;:::-;;:::i;8148:217::-;;;;;;:::i;:::-;;:::i;:::-;;;1536:14:1;;1529:22;1511:41;;1499:2;1484:18;8148:217:0;1371:187:1;42381:125:0;;;:::i;47034:351::-;;;;;;:::i;:::-;;:::i;:::-;;3358:20;;;;;-1:-1:-1;;;3358:20:0;;;;;;;;;1926:4:1;1914:17;;;1896:36;;1884:2;1869:18;3358:20:0;1754:184:1;6954:26:0;;;;;;33796:48;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2195:15:1;;;2177:34;;2247:15;;;;2242:2;2227:18;;2220:43;2306:14;2299:22;2279:18;;;2272:50;2127:2;2112:18;33796:48:0;1943:385:1;32979:83:0;;33019:42;32979:83;;;;;-1:-1:-1;;;;;2497:32:1;;;2479:51;;2467:2;2452:18;32979:83:0;2333:203:1;854:25:0;;;;;-1:-1:-1;;;;;854:25:0;;;8766:612;;;;;;:::i;:::-;;:::i;34027:30::-;;;;;-1:-1:-1;;;;;34027:30:0;;;;;;-1:-1:-1;;;;;3036:31:1;;;3018:50;;3006:2;2991:18;34027:30:0;2874:200:1;6727:31:0;;;;;11108:179;;;:::i;21904:28::-;;;;;43942:111;;;:::i;34387:26::-;;;;;-1:-1:-1;;;34387:26:0;;-1:-1:-1;;;;;34387:26:0;;;38329:221;;;:::i;33746:27::-;;;;;-1:-1:-1;;;;;33746:27:0;;;43685:154;;;:::i;47393:222::-;;;;;;:::i;:::-;;:::i;4125:87::-;4197:7;;-1:-1:-1;;;4197:7:0;;;;4125:87;;33653:86;;33696:42;33653:86;;33275:23;;;;;-1:-1:-1;;;;;33275:23:0;;;33069:81;;33107:42;33069:81;;46105:324;;;;;;:::i;:::-;;:::i;34650:19::-;;;;;-1:-1:-1;;;;;34650:19:0;;;36337:881;;;;;;:::i;:::-;;:::i;6989:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;45241:856;;;;;;:::i;:::-;;:::i;42758:147::-;;;:::i;33426:29::-;;;;;;:::i;:::-;;:::i;7415:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;34560:25;;;;;-1:-1:-1;;;34560:25:0;;-1:-1:-1;;;;;34560:25:0;;;43847:87;;;:::i;37226:127::-;;;:::i;827:20::-;;;;;-1:-1:-1;;;;;827:20:0;;;48177:755;;;;;;:::i;:::-;;:::i;34318:27::-;;;;;-1:-1:-1;;;34318:27:0;;-1:-1:-1;;;;;34318:27:0;;;6698:20;;;:::i;41625:340::-;;;:::i;33979:41::-;;34016:4;33979:41;;33571:20;;;;;-1:-1:-1;;;;;33571:20:0;;;8373:385;;;;;;:::i;:::-;;:::i;42550:129::-;;;:::i;37428:893::-;;;;;;:::i;:::-;;:::i;34352:28::-;;;;;-1:-1:-1;;;;;34352:28:0;;;47623:165;;;;;;:::i;:::-;;:::i;42913:260::-;;;;;;:::i;:::-;;:::i;1798:226::-;;;;;;:::i;:::-;;:::i;34280:31::-;;;;;-1:-1:-1;;;34280:31:0;;-1:-1:-1;;;;;34280:31:0;;;33905:43;;;;;;:::i;:::-;;:::i;7042:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;36151:98;;;:::i;46437:590::-;;;;;;:::i;:::-;;:::i;33851:47::-;;;;;;:::i;:::-;;:::i;34113:25::-;;;;;-1:-1:-1;;;34113:25:0;;-1:-1:-1;;;;;34113:25:0;;;1625:165;;;;;;:::i;:::-;;:::i;41973:106::-;;;:::i;32890:82::-;;32929:42;32890:82;;33598:21;;;;;-1:-1:-1;;;;;33598:21:0;;;42175:133;42228:4;42285:15;:13;:15::i;:::-;42252:30;;-1:-1:-1;;;42252:30:0;;42276:4;42252:30;;;2479:51:1;42252:5:0;-1:-1:-1;;;;;42252:15:0;;;;2452:18:1;;42252:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;;;:::i;:::-;42245:55;;42175:133;:::o;6671:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43181:260::-;43289:11;;43252:7;;43370:11;;:63;;43393:40;43411:13;:11;:13::i;:::-;43393:6;;43426;43393:17;:40::i;:::-;43370:63;;;43384:6;43370:63;43363:70;43181:260;-1:-1:-1;;;43181:260:0:o;8148:217::-;8249:10;8222:4;8239:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;8239:30:0;;;;;;;;;;:39;;;8296:37;8222:4;;8239:30;;8296:37;;;;8272:6;160:25:1;;148:2;133:18;;14:177;8296:37:0;;;;;;;;-1:-1:-1;8353:4:0;8148:217;;;;;:::o;42381:125::-;42467:5;;42451:47;;-1:-1:-1;;;42451:47:0;;42492:4;42451:47;;;2479:51:1;42427:4:0;;-1:-1:-1;;;;;42467:5:0;;42451:32;;2452:18:1;;42451:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;47034:351::-;1008:12;:10;:12::i;:::-;-1:-1:-1;;;;;47106:23:0;::::1;::::0;;:48:::1;;-1:-1:-1::0;47146:8:0::1;::::0;-1:-1:-1;;;;;47133:21:0;;::::1;47146:8:::0;::::1;47133:21;47106:48;47103:95;;;47163:33;;-1:-1:-1::0;;;47163:33:0::1;;;;;;;;;;;47103:95;47207:8;:20:::0;;-1:-1:-1;;;;;;47207:20:0::1;-1:-1:-1::0;;;;;47207:20:0;::::1;::::0;;::::1;::::0;;;47242:22:::1;::::0;::::1;::::0;-1:-1:-1;;47242:22:0::1;47305:6;::::0;47276:39:::1;::::0;-1:-1:-1;;;;;47276:28:0;;::::1;::::0;47305:6:::1;;47276:28;:39::i;:::-;47354:6;::::0;47325:52:::1;::::0;-1:-1:-1;;;;;47325:28:0;;::::1;::::0;47354:6:::1;-1:-1:-1::0;;47325:28:0::1;:52::i;:::-;47034:351:::0;:::o;33796:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33796:48:0;;;;-1:-1:-1;33796:48:0;;;;-1:-1:-1;;;33796:48:0;;;;;:::o;8766:612::-;-1:-1:-1;;;;;8923:15:0;;8888:4;8923:15;;;:9;:15;;;;;;;;8939:10;8923:27;;;;;;;;-1:-1:-1;;9003:28:0;;8999:80;;9063:16;9073:6;9063:7;:16;:::i;:::-;-1:-1:-1;;;;;9033:15:0;;;;;;:9;:15;;;;;;;;9049:10;9033:27;;;;;;;:46;8999:80;-1:-1:-1;;;;;9092:15:0;;;;;;:9;:15;;;;;:25;;9111:6;;9092:15;:25;;9111:6;;9092:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9268:13:0;;;;;;;:9;:13;;;;;;;:23;;;;;;9320:26;9268:13;;9320:26;;;-1:-1:-1;;;;;;;;;;;9320:26:0;;;9285:6;160:25:1;;148:2;133:18;;14:177;9320:26:0;;;;;;;;-1:-1:-1;9366:4:0;;8766:612;-1:-1:-1;;;;8766:612:0:o;11108:179::-;11165:7;11209:16;11192:13;:33;:87;;11255:24;:22;:24::i;11192:87::-;-1:-1:-1;11228:24:0;;11108:179::o;43942:111::-;1008:12;:10;:12::i;:::-;43991:10:::1;:8;:10::i;:::-;44012:15;:13;:15::i;:::-;44038:7;:5;:7::i;:::-;43942:111::o:0;38329:221::-;38371:10;38385:9;38371:23;38368:58;;38403:21;;-1:-1:-1;;;38403:21:0;;;;;;;;;;;38368:58;38468:5;;38454:11;;:19;;-1:-1:-1;;;;;38468:5:0;;;;-1:-1:-1;;;38454:11:0;;;:19;:::i;:::-;-1:-1:-1;;;;;38439:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;38439:34:0;;38436:76;;;38482:28;;-1:-1:-1;;;38482:28:0;;;;;;;;;;;38436:76;38522:20;38531:10;38522:8;:20::i;43685:154::-;1008:12;:10;:12::i;:::-;43732:7:::1;:5;:7::i;:::-;43755:17;::::0;43761:10:::1;::::0;43755:17:::1;::::0;;;::::1;43799:5;::::0;-1:-1:-1;;;;;43799:5:0::1;43783:31;43815:15;:13;:15::i;:::-;43783:48;;;;;;;;;;;;;160:25:1::0;;148:2;133:18;;14:177;43783:48:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43685:154::o:0;47393:222::-;1008:12;:10;:12::i;:::-;47480:22:::1;::::0;::::1;::::0;::::1;::::0;:48:::1;;;47506:17;:22;;47527:1;47506:22;;47480:48;47477:84;;;47537:22;;-1:-1:-1::0;;;47537:22:0::1;;;;;;;;;;;47477:84;47571:16;:36:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;47571:36:0::1;-1:-1:-1::0;;47571:36:0;;::::1;::::0;;;::::1;::::0;;47393:222::o;46105:324::-;928:12;:10;:12::i;:::-;-1:-1:-1;;;;;46197:21:0;::::1;::::0;;:45:::1;;-1:-1:-1::0;;;;;;46222:20:0;::::1;::::0;46197:45:::1;46194:85;;;46251:26;;-1:-1:-1::0;;;46251:26:0::1;;;;;;;;;;;46194:85;46303:6;::::0;-1:-1:-1;;;;;46292:17:0;;::::1;46303:6:::0;::::1;46292:17;46289:40;;46311:6;:16:::0;;-1:-1:-1;;;;;;46311:16:0::1;-1:-1:-1::0;;;;;46311:16:0;::::1;;::::0;;46289:40:::1;46352:5;::::0;-1:-1:-1;;;;;46342:15:0;;::::1;46352:5:::0;::::1;46342:15;46339:36;;46359:5;:14:::0;;-1:-1:-1;;;;;;46359:14:0::1;-1:-1:-1::0;;;;;46359:14:0;::::1;;::::0;;46339:36:::1;46415:5;::::0;46407:6:::1;::::0;46390:31:::1;::::0;-1:-1:-1;;;;;46415:5:0;;::::1;::::0;46407:6;;::::1;::::0;46390:31:::1;::::0;46415:5:::1;::::0;46390:31:::1;46105:324:::0;;:::o;36337:881::-;36424:11;3737:19;:17;:19::i;:::-;36451:9:::1;-1:-1:-1::0;;;;;36451:21:0;::::1;;36448:65;;36481:30;;-1:-1:-1::0;;;36481:30:0::1;;;;;;;;;;;36448:65;-1:-1:-1::0;;;;;36526:25:0;::::1;;::::0;;;:15:::1;:25;::::0;;;;;-1:-1:-1;;;;;36526:25:0::1;:30:::0;36523:128:::1;;36605:5;::::0;-1:-1:-1;;;;;36577:25:0;::::1;36605:5;36577:25:::0;;;:15:::1;:25;::::0;;;;;:33:::1;::::0;-1:-1:-1;;;;;36605:5:0;;::::1;::::0;36577:25:::1;:33;:::i;:::-;-1:-1:-1::0;;;;;36562:48:0::1;:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;36562:48:0::1;;36559:91;;;36620:28;;-1:-1:-1::0;;;36620:28:0::1;;;;;;;;;;;36559:91;36673:25;::::0;-1:-1:-1;;;36673:25:0;;-1:-1:-1;;;;;2497:32:1;;;36673:25:0::1;::::0;::::1;2479:51:1::0;36673:5:0::1;:15;::::0;::::1;::::0;2452:18:1;;36673:25:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36664:6;:34;36661:70;;;36707:22;;-1:-1:-1::0;;;36707:22:0::1;;;;;;;;;;;36661:70;36750:23;36766:6;36750:15;:23::i;:::-;36741:32:::0;-1:-1:-1;36787:11:0;;;:26:::1;;-1:-1:-1::0;36802:11:0;;36787:26:::1;36784:65;;;36822:25;;-1:-1:-1::0;;;36822:25:0::1;;;;;;;;;;;36784:65;36889:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;36861:25:0;::::1;;::::0;;;:15:::1;:25;::::0;;;;;;;;:40;;-1:-1:-1;;36861:40:0::1;-1:-1:-1::0;;;;;36861:40:0;;;::::1;::::0;;;::::1;::::0;;;36917:43;;10252:25:1;;;10293:18;;;10286:34;;;36861:25:0;;;;36917:43:::1;::::0;10225:18:1;36917:43:0::1;;;;;;;36973:55;-1:-1:-1::0;;;;;36973:5:0::1;:22;36996:8:::0;37014:4:::1;37021:6:::0;36973:22:::1;:55::i;:::-;37100:23;37106:8;37116:6;37100:5;:23::i;:::-;37134:7;:5;:7::i;:::-;37157:16;::::0;-1:-1:-1;;;37157:16:0;::::1;;;:21:::0;37154:57:::1;;37181:28;37194:6;37202;37181:12;:28::i;45241:856::-:0;928:12;:10;:12::i;:::-;45458:2:::1;45443:12;-1:-1:-1::0;;;;;45443:17:0::1;;45440:53;;;45469:22;;-1:-1:-1::0;;;45469:22:0::1;;;;;;;;;;;45440:53;-1:-1:-1::0;;;;;45506:17:0;::::1;::::0;::::1;::::0;:38:::1;;;45527:12;-1:-1:-1::0;;;;;45527:17:0::1;45543:1;45527:17;;45506:38;45503:74;;;45553:22;;-1:-1:-1::0;;;45553:22:0::1;;;;;;;;;;;45503:74;45587:10;45638:13:::0;45623:12;45600:20:::1;45611:9:::0;45600:8;:20:::1;:::i;:::-;:35;;;;:::i;:::-;:51;;;;:::i;:::-;45587:64:::0;-1:-1:-1;34016:4:0::1;-1:-1:-1::0;;;;;45665:17:0;::::1;;45662:53;;;45691:22;;-1:-1:-1::0;;;45691:22:0::1;;;;;;;;;;;45662:53;-1:-1:-1::0;;;;;45728:24:0;::::1;::::0;;::::1;::::0;:54:::1;;-1:-1:-1::0;45770:12:0::1;::::0;-1:-1:-1;;;;;45756:26:0;;::::1;45770:12:::0;::::1;45756:26;;45728:54;45725:86;;;45784:12;:25:::0;;-1:-1:-1;;;;;;45784:25:0::1;-1:-1:-1::0;;;;;45784:25:0;::::1;;::::0;;45725:86:::1;45837:12;45823:11;;:26;;;;;-1:-1:-1::0;;;;;45823:26:0::1;;;;;-1:-1:-1::0;;;;;45823:26:0::1;;;;;;45870:8;45860:7;;:18;;;;;-1:-1:-1::0;;;;;45860:18:0::1;;;;;-1:-1:-1::0;;;;;45860:18:0::1;;;;;;45900:9;45889:8;;:20;;;;;-1:-1:-1::0;;;;;45889:20:0::1;;;;;-1:-1:-1::0;;;;;45889:20:0::1;;;;;;45934:12;45920:11;;:26;;;;;-1:-1:-1::0;;;;;45920:26:0::1;;;;;-1:-1:-1::0;;;;;45920:26:0::1;;;;;;45971:12;45957:11;;:26;;;;;-1:-1:-1::0;;;;;45957:26:0::1;;;;;-1:-1:-1::0;;;;;45957:26:0::1;;;;;;46009:13;45994:12;;:28;;;;;-1:-1:-1::0;;;;;45994:28:0::1;;;;;-1:-1:-1::0;;;;;45994:28:0::1;;;;;;46076:12;;;;;;;;;-1:-1:-1::0;;;;;46076:12:0::1;-1:-1:-1::0;;;;;46038:51:0::1;46071:3;-1:-1:-1::0;;;;;46038:51:0::1;46058:11;;;;;;;;;-1:-1:-1::0;;;;;46058:11:0::1;-1:-1:-1::0;;;;;46038:51:0::1;;;;;;;;;;;45429:668;45241:856:::0;;;;;;;:::o;42758:147::-;42813:4;42837:11;;42852:1;42837:16;:60;;42886:11;;42863:13;:11;:13::i;:::-;:20;;42879:4;42863:20;:::i;:::-;:34;;;;:::i;42837:60::-;-1:-1:-1;42856:4:0;;42758:147::o;33426:29::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33426:29:0;;-1:-1:-1;33426:29:0;:::o;43847:87::-;1008:12;:10;:12::i;:::-;43892:8:::1;:6;:8::i;:::-;43911:15;:13;:15::i;37226:127::-:0;37278:42;;-1:-1:-1;;;37278:42:0;;37309:10;37278:42;;;2479:51:1;37269:76:0;;37292:4;;37278:30;;2452:18:1;;37278:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37322:10;37334;37269:8;:76::i;48177:755::-;1008:12;:10;:12::i;:::-;-1:-1:-1;;;;;48298:15:0;::::1;33019:42;48298:15;::::0;:33:::1;;-1:-1:-1::0;;;;;;48317:14:0;::::1;32929:42;48317:14;48298:33;:50;;;-1:-1:-1::0;;;;;;48335:13:0;::::1;33107:42;48335:13;48298:50;48295:97;;;48357:33;;-1:-1:-1::0;;;48357:33:0::1;;;;;;;;;;;48295:97;48402:8;48424:7;48435:1;48424:12:::0;48421:95:::1;;48445:38;::::0;-1:-1:-1;;;48445:38:0;;48477:4:::1;48445:38;::::0;::::1;2479:51:1::0;-1:-1:-1;;;;;48445:23:0;::::1;::::0;::::1;::::0;2452:18:1;;48445:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48439:44;;48421:95;;;-1:-1:-1::0;48507:7:0;48421:95:::1;48533:6;48528:113;48545:5;:12;48541:1;:16;48528:113;;;48575:10;48591:5;48597:1;48591:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;48575:25;;::::1;::::0;;::::1;::::0;;-1:-1:-1;48575:25:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;48575:25:0;;::::1;-1:-1:-1::0;;;;;;48575:25:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;48575:25:0::1;-1:-1:-1::0;;;;;;48575:25:0;;;;;;::::1;::::0;;;;::::1;::::0;;48625:3:::1;48528:113;;;-1:-1:-1::0;48658:21:0::1;::::0;48675:3;;-1:-1:-1;;;;;48658:21:0;::::1;::::0;::::1;::::0;;;::::1;48716:6;::::0;48690:36:::1;::::0;-1:-1:-1;;;;;48690:25:0;;::::1;::::0;48716:6:::1;;48690:25;:36::i;:::-;48763:6;::::0;48737:49:::1;::::0;-1:-1:-1;;;;;48737:25:0;;::::1;::::0;48763:6:::1;-1:-1:-1::0;;48737:25:0::1;:49::i;:::-;48814:6;::::0;-1:-1:-1;;;;;48814:6:0::1;48797:78;48876:3:::0;48814:6;48884:10:::1;48904:4;48911:12;:10;:12::i;:::-;48797:127;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;48284:648;48177:755:::0;;;:::o;6698:20::-;;;;;;;:::i;41625:340::-;41668:4;41685:14;41702:15;:13;:15::i;:::-;41685:32;-1:-1:-1;41728:15:0;41758:14;;41754:124;;41822:6;;41805:61;;-1:-1:-1;;;41805:61:0;;;;;12591:25:1;;;33019:42:0;12670:18:1;;;12663:43;32929:42:0;12722:18:1;;;12715:43;-1:-1:-1;;;;;41822:6:0;;;;41805:37;;12564:18:1;;41805:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41789:77:0;-1:-1:-1;41754:124:0;41936:7;;34016:4;;-1:-1:-1;;;;;;;;41936:7:0;;;;;34016:4;;41895:24;;41908:11;41895:10;:24;:::i;:::-;:38;;;;:::i;:::-;:48;;;;:::i;:::-;:62;;;;:::i;:::-;41888:69;;;;41625:340;:::o;8373:385::-;8470:10;8443:4;8460:21;;;:9;:21;;;;;:31;;8485:6;;8460:21;8443:4;;8460:31;;8485:6;;8460:31;:::i;:::-;;;;-1:-1:-1;;;;;;;8642:13:0;;;;;;:9;:13;;;;;;;:23;;;;;;8694:32;8703:10;;-1:-1:-1;;;;;;;;;;;8694:32:0;;;8659:6;160:25:1;;148:2;133:18;;14:177;42550:129:0;42636:5;;42620:51;;-1:-1:-1;;;42620:51:0;;33019:42;42620:51;;;13292:34:1;42665:4:0;13342:18:1;;;13335:43;42596:4:0;;-1:-1:-1;;;;;42636:5:0;;42620:29;;13227:18:1;;42620:51:0;13080:304:1;37428:893:0;37518:11;37545:9;-1:-1:-1;;;;;37545:21:0;;;;;;:44;;-1:-1:-1;37570:9:0;-1:-1:-1;;;;;37570:19:0;;;;37545:44;37542:88;;;37598:30;;-1:-1:-1;;;37598:30:0;;;;;;;;;;;37542:88;37652:38;;-1:-1:-1;;;37652:38:0;;-1:-1:-1;;;;;2497:32:1;;37652:38:0;;;2479:51:1;37666:4:0;;37652:30;;2452:18:1;;37652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37643:6;:47;37640:83;;;37699:22;;-1:-1:-1;;;37699:22:0;;;;;;;;;;;37640:83;37742:23;37758:6;37742:15;:23::i;:::-;37733:32;-1:-1:-1;37779:11:0;;;:26;;-1:-1:-1;37794:11:0;;37779:26;37776:65;;;37814:25;;-1:-1:-1;;;37814:25:0;;;;;;;;;;;37776:65;37853:21;37859:6;37867;37853:5;:21::i;:::-;37890:50;;;10252:25:1;;;10308:2;10293:18;;10286:34;;;-1:-1:-1;;;;;37890:50:0;;;;;;;;;;;;10225:18:1;37890:50:0;;;;;;;37951:16;37960:6;37951:8;:16::i;:::-;37996:30;;-1:-1:-1;;;37996:30:0;;38020:4;37996:30;;;2479:51:1;37980:13:0;;37996:5;-1:-1:-1;;;;;37996:15:0;;;;2452:18:1;;37996:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37980:46;;38052:6;38041:8;:17;38037:43;;;-1:-1:-1;38072:6:0;38037:43;38095:11;;-1:-1:-1;;;38095:11:0;;-1:-1:-1;;;;;38095:11:0;:16;38092:222;;38160:11;;38127:19;;34016:4;;38149:22;;-1:-1:-1;;;38160:11:0;;-1:-1:-1;;;;;38160:11:0;38149:8;:22;:::i;:::-;:36;;;;:::i;:::-;38127:58;-1:-1:-1;38200:55:0;38219:8;38229:25;38127:58;38229:8;:25;:::i;:::-;-1:-1:-1;;;;;38200:5:0;:18;;:55;:18;:55::i;:::-;38112:155;38092:222;;;38274:38;-1:-1:-1;;;;;38274:5:0;:18;38293:8;38303;38274:18;:38::i;:::-;37531:790;37428:893;;;;;:::o;47623:165::-;1008:12;:10;:12::i;:::-;47697:4:::1;47688:6;-1:-1:-1::0;;;;;47688:13:0::1;;:29;;;;47714:3;47705:6;-1:-1:-1::0;;;;;47705:12:0::1;;47688:29;47685:71;;;47727:27;;-1:-1:-1::0;;;47727:27:0::1;;;;;;;;;;;47685:71;47766:5;:14:::0;;-1:-1:-1;;47766:14:0::1;-1:-1:-1::0;;;;;47766:14:0;;;::::1;::::0;;;::::1;::::0;;47623:165::o;42913:260::-;43021:11;;42984:7;;43102:11;;:63;;43125:40;43143:6;43151:13;:11;:13::i;:::-;43125:6;;:40;:17;:40::i;1798:226::-;1890:10;;-1:-1:-1;;;;;1890:10:0;1876;:24;1873:53;;1909:15;;-1:-1:-1;;;1909:15:0;;;;;;;;;;;1873:53;1936:10;:27;;-1:-1:-1;;;;;;1936:27:0;-1:-1:-1;;;;;1936:27:0;;;;;;;;1979:37;;1993:10;;1979:37;;-1:-1:-1;;1979:37:0;1798:226;:::o;33905:43::-;;;;;;;;;;;;36151:98;36201:27;;-1:-1:-1;;;36201:27:0;;36217:10;36201:27;;;2479:51:1;36193:48:0;;36201:5;-1:-1:-1;;;;;36201:15:0;;;;2452:18:1;;36201:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36230:10;36193:7;:48::i;46437:590::-;1008:12;:10;:12::i;:::-;46580:18;;:23;46577:186:::1;;46624:6;46619:133;46636:11;:18;46632:1;:22;46619:133;;;46672:14;46692:11;46704:1;46692:14;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;46672:35;;::::1;::::0;;::::1;::::0;;-1:-1:-1;46672:35:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;46672:35:0;;::::1;-1:-1:-1::0;;;;;;46672:35:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;46672:35:0::1;-1:-1:-1::0;;;;;;46672:35:0;;;;;;::::1;::::0;;;;::::1;::::0;;46732:3:::1;46619:133;;;;46577:186;46776:19:::0;;:24;46773:190:::1;;46821:6;46816:136;46833:12;:19;46829:1;:23;46816:136;;;46870:15;46891:12;46904:1;46891:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;46870:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;46870:37:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;46870:37:0;;::::1;-1:-1:-1::0;;;;;;46870:37:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;-1:-1:-1::0;;;46870:37:0::1;-1:-1:-1::0;;;;;;46870:37:0;;;;;;::::1;::::0;;;;::::1;::::0;;46932:3:::1;46816:136;;;;46773:190;47003:15;46978:41;;;;;;:::i;:::-;;;;;;;;46987:14;46978:41;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;46437:590:::0;;:::o;33851:47::-;;;;;;;;;;;;1625:165;928:12;:10;:12::i;:::-;1708:5:::1;:16:::0;;-1:-1:-1;;;;;;1708:16:0::1;-1:-1:-1::0;;;;;1708:16:0;::::1;::::0;;::::1;::::0;;;1740:42:::1;::::0;1761:10:::1;::::0;1740:42:::1;::::0;-1:-1:-1;;1740:42:0::1;1625:165:::0;:::o;41973:106::-;42041:30;;-1:-1:-1;;;42041:30:0;;42065:4;42041:30;;;2479:51:1;42017:4:0;;42041:5;-1:-1:-1;;;;;42041:15:0;;;;2452:18:1;;42041:30:0;2333:203:1;13576:541:0;13696:9;13948:1;-1:-1:-1;;13931:19:0;13928:1;13925:26;13922:1;13918:34;13911:42;13898:11;13894:60;13884:118;;13985:1;13982;13975:12;13884:118;-1:-1:-1;14076:9:0;;14072:27;;13576:541::o;2140:126::-;2207:5;;-1:-1:-1;;;;;2207:5:0;2193:10;:19;;;:47;;-1:-1:-1;2230:10:0;;-1:-1:-1;;;;;2230:10:0;2216;:24;;2193:47;2190:69;;;2249:8;;-1:-1:-1;;;2249:8:0;;;;;;;;;;;19346:1527;19462:12;19637:4;19631:11;-1:-1:-1;;;19763:17:0;19756:93;19897:2;19893:1;19874:17;19870:25;19863:37;19978:6;19973:2;19954:17;19950:26;19943:42;20790:2;20787:1;20783:2;20764:17;20761:1;20754:5;20747;20742:51;20306:16;20299:24;20293:2;20275:16;20272:24;20268:1;20264;20258:8;20255:15;20251:46;20248:76;20045:763;20034:774;;;20839:7;20831:34;;;;-1:-1:-1;;;20831:34:0;;14450:2:1;20831:34:0;;;14432:21:1;14489:2;14469:18;;;14462:30;-1:-1:-1;;;14508:18:1;;;14501:44;14562:18;;20831:34:0;;;;;;;;11295:457;11360:7;11461:95;11595:4;11579:22;;;;;;:::i;:::-;;;;;;;;;;11428:301;;;16002:25:1;;;;16043:18;;16036:34;;;;11624:14:0;16086:18:1;;;16079:34;11661:13:0;16129:18:1;;;16122:34;11705:4:0;16172:19:1;;;16165:61;15974:19;;11428:301:0;;;;;;;;;;;;11400:344;;;;;;11380:364;;11295:457;:::o;5087:114::-;3996:16;:14;:16::i;:::-;5146:7:::1;:11:::0;;-1:-1:-1;;;;5146:11:0::1;::::0;;5173:20:::1;::::0;5182:10:::1;2479:51:1::0;;5173:20:0::1;::::0;2467:2:1;2452:18;5173:20:0::1;;;;;;;;5087:114::o:0;49163:267::-;49226:5;;49208:40;;-1:-1:-1;;;;;49208:5:0;:17;;;49226:5;-1:-1:-1;;49208:17:0;:40::i;:::-;49284:6;;49259:48;;33019:42;;-1:-1:-1;;;;;49284:6:0;-1:-1:-1;;49259:24:0;:48::i;:::-;49342:6;;49318:47;;32929:42;;-1:-1:-1;;;;;49342:6:0;-1:-1:-1;;49318:23:0;:47::i;:::-;49399:6;;49376:46;;33107:42;;-1:-1:-1;;;;;49399:6:0;-1:-1:-1;;49376:22:0;:46::i;39179:142::-;39232:30;;-1:-1:-1;;;39232:30:0;;39256:4;39232:30;;;2479:51:1;39216:13:0;;39232:5;-1:-1:-1;;;;;39232:15:0;;;;2452:18:1;;39232:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39289:5;;39273:40;;-1:-1:-1;;;39273:40:0;;;;;160:25:1;;;39216:46:0;;-1:-1:-1;;;;;;39289:5:0;;39273:30;;133:18:1;;39273:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39205:116;39179:142::o;44102:195::-;44147:16;44178:14;44220:5;-1:-1:-1;;;;;44197:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44175:67;;;;44272:9;44284:4;44272:16;;;;:::i;:::-;44253:36;;44164:133;44102:195;:::o;38558:397::-;3737:19;:17;:19::i;:::-;38640:12:::1;:10;:12::i;:::-;38626:11;:26:::0;;-1:-1:-1;;;;;38626:26:0;;;::::1;-1:-1:-1::0;;;38626:26:0::1;-1:-1:-1::0;;;;38626:26:0;;::::1;::::0;;;::::1;::::0;;38668:15:::1;::::0;-1:-1:-1;;;;;38668:15:0;::::1;::::0;::::1;::::0;-1:-1:-1;;38668:15:0::1;38710:5;::::0;38694:61:::1;::::0;-1:-1:-1;;;38694:61:0;;-1:-1:-1;;;;;38710:5:0;;::::1;::::0;38694:32:::1;::::0;:61:::1;::::0;38735:4:::1;::::0;38742:12:::1;::::0;38694:61:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38783:37:0::1;::::0;-1:-1:-1;;;38783:37:0;;38814:4:::1;38783:37;::::0;::::1;2479:51:1::0;38766:14:0::1;::::0;-1:-1:-1;33019:42:0::1;::::0;-1:-1:-1;38783:22:0::1;::::0;2452:18:1;;38783:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38766:54:::0;-1:-1:-1;38837:14:0;;38833:97:::1;;38869:19;38881:6;38869:11;:19::i;:::-;38903:15;:13;:15::i;:::-;38940:7;:5;:7::i;:::-;38615:340;38558:397:::0;:::o;2032:98::-;2099:5;;-1:-1:-1;;;;;2099:5:0;2085:10;:19;2082:41;;2113:8;;-1:-1:-1;;;2113:8:0;;;;;;;;;;;4285:159;4197:7;;-1:-1:-1;;;4197:7:0;;;;4405:13;4402:35;;4427:8;;-1:-1:-1;;;4427:8:0;;;;;;;;;;;16153:1648;16297:12;16472:4;16466:11;-1:-1:-1;;;16598:17:0;16591:93;16732:4;16728:1;16709:17;16705:25;16698:39;16817:2;16812;16793:17;16789:26;16782:38;16898:6;16893:2;16874:17;16870:26;16863:42;17712:2;17709:1;17704:3;17685:17;17682:1;17675:5;17668;17663:52;17226:16;17219:24;17213:2;17195:16;17192:24;17188:1;17184;17178:8;17175:15;17171:46;17168:76;16965:765;16954:776;;;17761:7;17753:40;;;;-1:-1:-1;;;17753:40:0;;17537:2:1;17753:40:0;;;17519:21:1;17576:2;17556:18;;;17549:30;-1:-1:-1;;;17595:18:1;;;17588:50;17655:18;;17753:40:0;17335:344:1;11952:335:0;12038:6;12023:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;12195:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;12247:32;160:25:1;;;-1:-1:-1;;;;;;;;;;;12247:32:0;133:18:1;12247:32:0;;;;;;;;11952:335;;:::o;49531:104::-;49608:19;49617:9;49608:8;:19::i;4830:116::-;3737:19;:17;:19::i;:::-;4890:7:::1;:11:::0;;-1:-1:-1;;;;4890:11:0::1;-1:-1:-1::0;;;4890:11:0::1;::::0;;4917:21:::1;::::0;4927:10:::1;2479:51:1::0;;4917:21:0::1;::::0;2467:2:1;2452:18;4917:21:0::1;2333:203:1::0;48940:215:0;49003:5;;48985:27;;-1:-1:-1;;;;;48985:5:0;:17;;;49003:5;;48985:17;:27::i;:::-;49048:6;;49023:35;;33019:42;;-1:-1:-1;;;;;49048:6:0;;49023:24;:35::i;:::-;49093:6;;49069:34;;32929:42;;-1:-1:-1;;;;;49093:6:0;;49069:23;:34::i;:::-;49137:6;;49114:33;;33107:42;;-1:-1:-1;;;;;49137:6:0;;49114:22;:33::i;12295:338::-;-1:-1:-1;;;;;12368:15:0;;;;;;:9;:15;;;;;:25;;12387:6;;12368:15;:25;;12387:6;;12368:25;:::i;:::-;;;;-1:-1:-1;;12541:11:0;:21;;;;;;;12591:34;;160:25:1;;;-1:-1:-1;;;;;;;12591:34:0;;;-1:-1:-1;;;;;;;;;;;12591:34:0;148:2:1;133:18;12591:34:0;14:177:1;39367:218:0;39435:30;;-1:-1:-1;;;39435:30:0;;39459:4;39435:30;;;2479:51:1;39419:13:0;;39435:5;-1:-1:-1;;;;;39435:15:0;;;;2452:18:1;;39435:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39419:46;;39491:7;39480:8;:18;39476:102;;;39531:5;;-1:-1:-1;;;;;39531:5:0;39515:31;39547:18;39557:8;39547:7;:18;:::i;:::-;39515:51;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;39515:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39408:177;39367:218;:::o;17809:1529::-;17926:12;18101:4;18095:11;-1:-1:-1;;;18227:17:0;18220:93;18361:2;18357:1;18338:17;18334:25;18327:37;18442:6;18437:2;18418:17;18414:26;18407:42;19254:2;19251:1;19247:2;19228:17;19225:1;19218:5;19211;19206:51;18770:16;18763:24;18757:2;18739:16;18736:24;18732:1;18728;18722:8;18719:15;18715:46;18712:76;18509:763;18498:774;;;19303:7;19295:35;;;;-1:-1:-1;;;19295:35:0;;17886:2:1;19295:35:0;;;17868:21:1;17925:2;17905:18;;;17898:30;-1:-1:-1;;;17944:18:1;;;17937:45;17999:18;;19295:35:0;17684:339:1;4521:165:0;4197:7;;-1:-1:-1;;;4197:7:0;;;;4642:13;;4654:1;4642:13;4639:38;;4664:11;;-1:-1:-1;;;4664:11:0;;;;;;;;;;;39593:1102;39703:11;;39663:37;;-1:-1:-1;;;39663:37:0;;39694:4;39663:37;;;2479:51:1;39650:10:0;;34016:4;;-1:-1:-1;;;;;39703:11:0;;;;33019:42;;39663:22;;2452:18:1;;39663:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;:65;;;;:::i;:::-;39755:37;;-1:-1:-1;;;39755:37:0;;39786:4;39755:37;;;2479:51:1;39650:78:0;;-1:-1:-1;39739:13:0;;39650:78;;33019:42;;39755:22;;2452:18:1;;39755:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;;;;:::i;:::-;39850:6;;39833:60;;-1:-1:-1;;;39833:60:0;;;;;12591:25:1;;;33019:42:0;12670:18:1;;;12663:43;33198:42:0;12722:18:1;;;12715:43;39739:61:0;;-1:-1:-1;39814:14:0;;-1:-1:-1;;;;;39850:6:0;;;;39833:37;;12564:18:1;;39833:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;39813:80:0;-1:-1:-1;39939:16:0;39951:4;39813:80;39939:16;:::i;:::-;39918:11;;:38;;;-1:-1:-1;;;39918:11:0;;-1:-1:-1;;;;;39918:11:0;:38;:::i;:::-;39904:11;:52;;-1:-1:-1;;;;;39904:52:0;-1:-1:-1;;;;;;;;39904:52:0;;;;;;;;;39986:6;;40042:8;;-1:-1:-1;;;;;39986:6:0;;;;39969:55;;40025:5;;-1:-1:-1;;33019:42:0;;40042:8;;;-1:-1:-1;;40067:4:0;;40074:16;;-1:-1:-1;;;40074:11:0;;;;40088:2;40074:16;:::i;:::-;39969:122;;-1:-1:-1;;;;;;39969:122:0;;;;;;;;;;18344:25:1;;;;18385:18;;;18378:34;;;;-1:-1:-1;;;;;18486:15:1;;;18466:18;;;18459:43;18538:15;;;18518:18;;;18511:43;18598:14;18591:22;18570:19;;;18563:51;18651:15;18630:19;;;18623:44;-1:-1:-1;;;;;18704:31:1;18683:19;;;18676:60;18316:19;;39969:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39969:122:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40124:8:0;;40118:40;;-1:-1:-1;;;40118:40:0;;40152:4;40118:40;;;2479:51:1;40104:11:0;;-1:-1:-1;;;;;40124:8:0;;40118:25;;2452:18:1;;40118:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40195:7;;40104:54;;-1:-1:-1;40171:12:0;;34016:4;;40186:16;;-1:-1:-1;;;40195:7:0;;-1:-1:-1;;;;;40195:7:0;40104:54;40186:16;:::i;:::-;:30;;;;:::i;:::-;40233:8;;40227:41;;-1:-1:-1;;;40227:41:0;;-1:-1:-1;;;;;19831:32:1;;;40227:41:0;;;19813:51:1;19880:18;;;19873:34;;;40171:45:0;;-1:-1:-1;40233:8:0;;;40227:24;;19786:18:1;;40227:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40284:12:0;;-1:-1:-1;;;40284:12:0;;-1:-1:-1;;;;;40284:12:0;:17;40281:166;;40342:12;;40313:17;;34016:4;;40333:21;;-1:-1:-1;;;40342:12:0;;-1:-1:-1;;;;;40342:12:0;40333:6;:21;:::i;:::-;:35;;;;:::i;:::-;40408:12;;40385:8;;40313:55;;-1:-1:-1;40379:56:0;;-1:-1:-1;;;;;40385:8:0;;;;40408:12;40313:55;40379:28;:56::i;:::-;40302:145;40281:166;40487:11;;40459:16;;34016:4;;40478:20;;-1:-1:-1;;;40487:11:0;;-1:-1:-1;;;;;40487:11:0;40478:6;:20;:::i;:::-;:34;;;;:::i;:::-;40529:8;;40523:47;;-1:-1:-1;;;40523:47:0;;33696:42;40523:47;;;19813:51:1;19880:18;;;19873:34;;;40459:53:0;;-1:-1:-1;;;;;;40529:8:0;;40523:24;;19786:18:1;;40523:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;40608:8:0;;40583:13;;34016:4;;40599:17;;-1:-1:-1;;;;;40608:8:0;40599:6;:17;:::i;:::-;:31;;;;:::i;:::-;40647:8;;40666:10;;40641:46;;-1:-1:-1;;;40641:46:0;;-1:-1:-1;;;;;40666:10:0;;;40641:46;;;19813:51:1;19880:18;;;19873:34;;;40583:47:0;;-1:-1:-1;40647:8:0;;40641:24;;19786:18:1;;40641:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39639:1056;;;;;;;39593:1102;:::o;40703:657::-;40765:37;;-1:-1:-1;;;40765:37:0;;40796:4;40765:37;;;2479:51:1;40748:14:0;;40806:1;;33019:42;;40765:22;;2452:18:1;;40765:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;40748:59;;40819:12;40833;40849:19;40858:9;40849:8;:19::i;:::-;40896:6;;40981:11;;40879:114;;-1:-1:-1;;;40879:114:0;;40818:50;;-1:-1:-1;40818:50:0;;-1:-1:-1;;;;;;40896:6:0;;40879:49;;:114;;40929:9;;40818:50;;40949:15;;40974:4;;-1:-1:-1;;;40981:11:0;;;-1:-1:-1;;;;;40981:11:0;;40879:114;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40879:114:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41021:6:0;;41105:11;;41004:113;;-1:-1:-1;;;41004:113:0;;-1:-1:-1;;;;;41021:6:0;;;;41004:49;;:113;;41054:9;;41065:7;;41074:14;;41098:4;;-1:-1:-1;;;41105:11:0;;;-1:-1:-1;;;;;41105:11:0;;41004:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41004:113:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41143:36:0;;-1:-1:-1;;;41143:36:0;;41173:4;41143:36;;;2479:51:1;41130:10:0;;32929:42;;41143:21;;2452:18:1;;41143:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41203:35;;-1:-1:-1;;;41203:35:0;;41232:4;41203:35;;;2479:51:1;41130:49:0;;-1:-1:-1;41190:10:0;;33107:42;;41203:20;;2452:18:1;;41203:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41266:6;;41340:11;;41249:103;;-1:-1:-1;;;41249:103:0;;32929:42;41249:103;;;21243:34:1;33107:42:0;21293:18:1;;;21286:43;41266:6:0;21345:18:1;;;21338:50;21404:18;;;21397:34;;;21447:19;;;21440:35;;;41266:6:0;21491:19:1;;;21484:35;;;21535:19;;;21528:35;41333:4:0;21579:19:1;;;21572:44;-1:-1:-1;;;41340:11:0;;;-1:-1:-1;;;;;41340:11:0;21632:19:1;;;21625:60;41190:48:0;;-1:-1:-1;;;;;;41266:6:0;;41249:37;;21177:19:1;;41249:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;44344:707::-;44474:11;:14;44497;:17;44459:71;;-1:-1:-1;;;44459:71:0;;-1:-1:-1;;;;;44497:17:0;;;44459:71;;;21943:51:1;22010:18;;;22003:34;;;44525:1:0;22053:18:1;;;22046:34;44528:1:0;22096:18:1;;;22089:34;44398:12:0;;;;;;44474:14;;;44459:37;;21915:19:1;;44459:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44459:71:0;;;;;;;;;;;;:::i;:::-;44436:94;;44547:6;44543:116;44559:6;:13;44555:1;:17;44543:116;;;44609:6;44616:1;44609:9;;;;;;;;:::i;:::-;;;;;;;44599:7;:19;;;;:::i;:::-;44589:29;-1:-1:-1;44643:3:0;;44543:116;;;-1:-1:-1;44680:12:0;44690:2;44680:7;:12;:::i;:::-;44744:14;;44767:17;;44729:71;;-1:-1:-1;;;44729:71:0;;-1:-1:-1;;;;;44767:17:0;;;44729:71;;;21943:51:1;22010:18;;;22003:34;;;44795:1:0;22053:18:1;;;22046:34;44798:1:0;22096:18:1;;;22089:34;44669:24:0;;-1:-1:-1;44706:20:0;;44744:14;;;44729:37;;21915:19:1;;44729:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44729:71:0;;;;;;;;;;;;:::i;:::-;44706:94;-1:-1:-1;44847:3:0;44832:11;:7;44842:1;44832:11;:::i;:::-;44822:21;;:7;:21;:::i;:::-;44821:29;;;;:::i;:::-;44811:39;;44867:6;44863:116;44879:6;:13;44875:1;:17;44863:116;;;44929:6;44936:1;44929:9;;;;;;;;:::i;:::-;;;;;;;44919:7;:19;;;;:::i;:::-;44909:29;-1:-1:-1;44963:3:0;;44863:116;;;-1:-1:-1;45040:3:0;45018:12;45028:2;45018:7;:12;:::i;:::-;45017:18;;45034:1;45017:18;:::i;:::-;45016:27;;;;:::i;:::-;45000:12;45010:2;45000:7;:12;:::i;:::-;44999:44;;;;:::i;:::-;44989:54;;44425:626;;44344:707;;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:180::-;808:6;861:2;849:9;840:7;836:23;832:32;829:52;;;877:1;874;867:12;829:52;-1:-1:-1;900:23:1;;749:180;-1:-1:-1;749:180:1:o;934:173::-;1002:20;;-1:-1:-1;;;;;1051:31:1;;1041:42;;1031:70;;1097:1;1094;1087:12;1031:70;934:173;;;:::o;1112:254::-;1180:6;1188;1241:2;1229:9;1220:7;1216:23;1212:32;1209:52;;;1257:1;1254;1247:12;1209:52;1280:29;1299:9;1280:29;:::i;:::-;1270:39;1356:2;1341:18;;;;1328:32;;-1:-1:-1;;;1112:254:1:o;1563:186::-;1622:6;1675:2;1663:9;1654:7;1650:23;1646:32;1643:52;;;1691:1;1688;1681:12;1643:52;1714:29;1733:9;1714:29;:::i;2541:328::-;2618:6;2626;2634;2687:2;2675:9;2666:7;2662:23;2658:32;2655:52;;;2703:1;2700;2693:12;2655:52;2726:29;2745:9;2726:29;:::i;:::-;2716:39;;2774:38;2808:2;2797:9;2793:18;2774:38;:::i;:::-;2764:48;;2859:2;2848:9;2844:18;2831:32;2821:42;;2541:328;;;;;:::o;3482:269::-;3539:6;3592:2;3580:9;3571:7;3567:23;3563:32;3560:52;;;3608:1;3605;3598:12;3560:52;3647:9;3634:23;3697:4;3690:5;3686:16;3679:5;3676:27;3666:55;;3717:1;3714;3707:12;3756:260;3824:6;3832;3885:2;3873:9;3864:7;3860:23;3856:32;3853:52;;;3901:1;3898;3891:12;3853:52;3924:29;3943:9;3924:29;:::i;:::-;3914:39;;3972:38;4006:2;3995:9;3991:18;3972:38;:::i;:::-;3962:48;;3756:260;;;;;:::o;4021:254::-;4089:6;4097;4150:2;4138:9;4129:7;4125:23;4121:32;4118:52;;;4166:1;4163;4156:12;4118:52;4202:9;4189:23;4179:33;;4231:38;4265:2;4254:9;4250:18;4231:38;:::i;4280:171::-;4347:20;;-1:-1:-1;;;;;4396:30:1;;4386:41;;4376:69;;4441:1;4438;4431:12;4456:622;4563:6;4571;4579;4587;4595;4603;4611;4664:3;4652:9;4643:7;4639:23;4635:33;4632:53;;;4681:1;4678;4671:12;4632:53;4704:28;4722:9;4704:28;:::i;:::-;4694:38;;4751:37;4784:2;4773:9;4769:18;4751:37;:::i;:::-;4741:47;;4807:37;4840:2;4829:9;4825:18;4807:37;:::i;:::-;4797:47;;4863:37;4896:2;4885:9;4881:18;4863:37;:::i;:::-;4853:47;;4919:38;4952:3;4941:9;4937:19;4919:38;:::i;:::-;4909:48;;4976:38;5009:3;4998:9;4994:19;4976:38;:::i;:::-;4966:48;;5033:39;5067:3;5056:9;5052:19;5033:39;:::i;:::-;5023:49;;4456:622;;;;;;;;;;:::o;5083:127::-;5144:10;5139:3;5135:20;5132:1;5125:31;5175:4;5172:1;5165:15;5199:4;5196:1;5189:15;5215:253;5287:2;5281:9;5329:4;5317:17;;-1:-1:-1;;;;;5349:34:1;;5385:22;;;5346:62;5343:88;;;5411:18;;:::i;:::-;5447:2;5440:22;5215:253;:::o;5473:275::-;5544:2;5538:9;5609:2;5590:13;;-1:-1:-1;;5586:27:1;5574:40;;-1:-1:-1;;;;;5629:34:1;;5665:22;;;5626:62;5623:88;;;5691:18;;:::i;:::-;5727:2;5720:22;5473:275;;-1:-1:-1;5473:275:1:o;5753:189::-;5819:4;-1:-1:-1;;;;;5844:6:1;5841:30;5838:56;;;5874:18;;:::i;:::-;-1:-1:-1;5919:1:1;5915:14;5931:4;5911:25;;5753:189::o;5947:118::-;6033:5;6026:13;6019:21;6012:5;6009:32;5999:60;;6055:1;6052;6045:12;6070:1145;6130:5;6183:3;6176:4;6168:6;6164:17;6160:27;6150:55;;6201:1;6198;6191:12;6150:55;6237:6;6224:20;6263:4;6287:66;6303:49;6349:2;6303:49;:::i;:::-;6287:66;:::i;:::-;6387:15;;;6449:4;6492:11;;;6480:24;;6476:33;;;6418:12;;;;6375:3;6521:15;;;6518:35;;;6549:1;6546;6539:12;6518:35;6585:2;6577:6;6573:15;6597:589;6613:6;6608:3;6605:15;6597:589;;;6689:2;6683:3;6678;6674:13;6670:22;6667:112;;;6733:1;6762:2;6758;6751:14;6667:112;6805:22;;:::i;:::-;6854:23;6873:3;6854:23;:::i;:::-;6847:5;6840:38;6914:32;6942:2;6937:3;6933:12;6914:32;:::i;:::-;6909:2;6902:5;6898:14;6891:56;6970:2;7022;7017:3;7013:12;7000:26;7039:30;7061:7;7039:30;:::i;:::-;7089:14;;;7082:31;7126:18;;7164:12;;;;6630;;6597:589;;;-1:-1:-1;7204:5:1;;6070:1145;-1:-1:-1;;;;;;;6070:1145:1:o;7220:519::-;7345:6;7353;7361;7414:2;7402:9;7393:7;7389:23;7385:32;7382:52;;;7430:1;7427;7420:12;7382:52;7453:29;7472:9;7453:29;:::i;:::-;7443:39;;7529:2;7518:9;7514:18;7501:32;7491:42;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7603:6:1;7600:30;7597:50;;;7643:1;7640;7633:12;7597:50;7666:67;7725:7;7716:6;7705:9;7701:22;7666:67;:::i;:::-;7656:77;;;7220:519;;;;;:::o;7744:328::-;7821:6;7829;7837;7890:2;7878:9;7869:7;7865:23;7861:32;7858:52;;;7906:1;7903;7896:12;7858:52;7942:9;7929:23;7919:33;;7971:38;8005:2;7994:9;7990:18;7971:38;:::i;:::-;7961:48;;8028:38;8062:2;8051:9;8047:18;8028:38;:::i;:::-;8018:48;;7744:328;;;;;:::o;8077:184::-;8135:6;8188:2;8176:9;8167:7;8163:23;8159:32;8156:52;;;8204:1;8201;8194:12;8156:52;8227:28;8245:9;8227:28;:::i;8266:653::-;8430:6;8438;8491:2;8479:9;8470:7;8466:23;8462:32;8459:52;;;8507:1;8504;8497:12;8459:52;8547:9;8534:23;-1:-1:-1;;;;;8617:2:1;8609:6;8606:14;8603:34;;;8633:1;8630;8623:12;8603:34;8656:67;8715:7;8706:6;8695:9;8691:22;8656:67;:::i;:::-;8646:77;;8776:2;8765:9;8761:18;8748:32;8732:48;;8805:2;8795:8;8792:16;8789:36;;;8821:1;8818;8811:12;8789:36;;8844:69;8905:7;8894:8;8883:9;8879:24;8844:69;:::i;:::-;8834:79;;;8266:653;;;;;:::o;8924:184::-;8994:6;9047:2;9035:9;9026:7;9022:23;9018:32;9015:52;;;9063:1;9060;9053:12;9015:52;-1:-1:-1;9086:16:1;;8924:184;-1:-1:-1;8924:184:1:o;9113:127::-;9174:10;9169:3;9165:20;9162:1;9155:31;9205:4;9202:1;9195:15;9229:4;9226:1;9219:15;9245:125;9310:9;;;9331:10;;;9328:36;;;9344:18;;:::i;9375:380::-;9454:1;9450:12;;;;9497;;;9518:61;;9572:4;9564:6;9560:17;9550:27;;9518:61;9625:2;9617:6;9614:14;9594:18;9591:38;9588:161;;9671:10;9666:3;9662:20;9659:1;9652:31;9706:4;9703:1;9696:15;9734:4;9731:1;9724:15;9588:161;;9375:380;;;:::o;9760:128::-;9827:9;;;9848:11;;;9845:37;;;9862:18;;:::i;9893:180::-;-1:-1:-1;;;;;9998:10:1;;;10010;;;9994:27;;10033:11;;;10030:37;;;10047:18;;:::i;:::-;10030:37;9893:180;;;;:::o;10331:168::-;10404:9;;;10435;;10452:15;;;10446:22;;10432:37;10422:71;;10473:18;;:::i;10504:217::-;10544:1;10570;10560:132;;10614:10;10609:3;10605:20;10602:1;10595:31;10649:4;10646:1;10639:15;10677:4;10674:1;10667:15;10560:132;-1:-1:-1;10706:9:1;;10504:217::o;10726:127::-;10787:10;10782:3;10778:20;10775:1;10768:31;10818:4;10815:1;10808:15;10842:4;10839:1;10832:15;11001:718;11068:3;11106:5;11100:12;11133:6;11128:3;11121:19;11159:4;11188:2;11183:3;11179:12;11172:19;;11210:5;11207:1;11200:16;11252:2;11249:1;11239:16;11273:1;11283:411;11297:6;11294:1;11291:13;11283:411;;;11404:13;;-1:-1:-1;;;;;11400:22:1;;;11388:35;;11373:1;11459:14;;;11453:21;11508:18;;;11494:12;;;11487:40;11364:3;11581:19;;;;11602:4;11577:30;11570:38;11563:46;11556:4;11547:14;;11540:70;11639:4;11630:14;;;;11679:4;11667:17;;;;11312:9;11283:411;;;-1:-1:-1;11710:3:1;;11001:718;-1:-1:-1;;;;;11001:718:1:o;11724:660::-;12062:6;12051:9;12044:25;12105:6;12100:2;12089:9;12085:18;12078:34;12148:3;12143:2;12132:9;12128:18;12121:31;12025:4;12169:71;12235:3;12224:9;12220:19;12212:6;12169:71;:::i;:::-;-1:-1:-1;;;;;12276:32:1;;;;12271:2;12256:18;;12249:60;-1:-1:-1;;;;;;12346:31:1;;;;12340:3;12325:19;;;12318:60;12161:79;11724:660;-1:-1:-1;;;11724:660:1:o;12769:306::-;12845:6;12853;12906:2;12894:9;12885:7;12881:23;12877:32;12874:52;;;12922:1;12919;12912:12;12874:52;12951:9;12945:16;12935:26;;13004:2;12993:9;12989:18;12983:25;13017:28;13039:5;13017:28;:::i;:::-;13064:5;13054:15;;;12769:306;;;;;:::o;13389:854::-;13590:3;13621;13653:6;13647:13;13678:3;13669:12;;13700:6;13697:1;13690:17;13726:4;13766:2;13763:1;13753:16;13787:1;13797:419;13811:6;13808:1;13805:13;13797:419;;;13920:13;;-1:-1:-1;;;;;13916:22:1;;;13902:37;;13887:1;13975:14;;;13969:21;14026:18;;;14010:14;;;14003:42;13878:3;14099:19;;;;14120:4;14095:30;14088:38;14081:46;14076:2;14065:14;;14058:70;14161:4;14150:16;;;;14201:4;14189:17;;;;13826:9;13797:419;;;-1:-1:-1;14232:5:1;;13389:854;-1:-1:-1;;;;;;13389:854:1:o;14591:1147::-;14721:3;14750:1;14783:6;14777:13;14813:3;14835:1;14863:9;14859:2;14855:18;14845:28;;14923:2;14912:9;14908:18;14945;14935:61;;14989:4;14981:6;14977:17;14967:27;;14935:61;15015:2;15063;15055:6;15052:14;15032:18;15029:38;15026:165;;-1:-1:-1;;;15090:33:1;;15146:4;15143:1;15136:15;15176:4;15097:3;15164:17;15026:165;15207:18;15234:133;;;;15381:1;15376:337;;;;15200:513;;15234:133;-1:-1:-1;;15267:24:1;;15255:37;;15340:14;;15333:22;15321:35;;15312:45;;;-1:-1:-1;15234:133:1;;15376:337;10948:1;10941:14;;;10985:4;10972:18;;15488:1;15502:165;15516:6;15513:1;15510:13;15502:165;;;15594:14;;15581:11;;;15574:35;15637:16;;;;15531:10;;15502:165;;;15506:3;;15696:6;15691:3;15687:16;15680:23;;15200:513;-1:-1:-1;15729:3:1;;14591:1147;-1:-1:-1;;;;;;;;14591:1147:1:o;16237:306::-;16325:6;16333;16341;16394:2;16382:9;16373:7;16369:23;16365:32;16362:52;;;16410:1;16407;16400:12;16362:52;16439:9;16433:16;16423:26;;16489:2;16478:9;16474:18;16468:25;16458:35;;16533:2;16522:9;16518:18;16512:25;16502:35;;16237:306;;;;;:::o;16548:782::-;16715:4;16763:2;16752:9;16748:18;16802:1;16798;16793:3;16789:11;16785:19;16843:2;16835:6;16831:15;16820:9;16813:34;16866:2;16904;16899;16888:9;16884:18;16877:30;16927:6;16962;16956:13;16993:6;16985;16978:22;17031:2;17020:9;17016:18;17009:25;;17053:6;17050:1;17043:17;17096:2;17093:1;17083:16;17069:30;;17117:1;17127:177;17141:6;17138:1;17135:13;17127:177;;;17206:13;;17202:22;;17190:35;;17292:1;17280:14;;;;17245:12;;;;17156:9;17127:177;;;-1:-1:-1;17321:3:1;;16548:782;-1:-1:-1;;;;;;;;16548:782:1:o;18747:887::-;18842:6;18873:2;18916;18904:9;18895:7;18891:23;18887:32;18884:52;;;18932:1;18929;18922:12;18884:52;18965:9;18959:16;-1:-1:-1;;;;;18990:6:1;18987:30;18984:50;;;19030:1;19027;19020:12;18984:50;19053:22;;19106:4;19098:13;;19094:27;-1:-1:-1;19084:55:1;;19135:1;19132;19125:12;19084:55;19164:2;19158:9;19187:66;19203:49;19249:2;19203:49;:::i;19187:66::-;19287:15;;;19369:1;19365:10;;;;19357:19;;19353:28;;;19318:12;;;;19393:19;;;19390:39;;;19425:1;19422;19415:12;19390:39;19449:11;;;;19469:135;19485:6;19480:3;19477:15;19469:135;;;19551:10;;19539:23;;19502:12;;;;19582;;;;19469:135;;;19623:5;18747:887;-1:-1:-1;;;;;;;18747:887:1:o;19918:245::-;19985:6;20038:2;20026:9;20017:7;20013:23;20009:32;20006:52;;;20054:1;20051;20044:12;20006:52;20086:9;20080:16;20105:28;20127:5;20105:28;:::i
Swarm Source
ipfs://7909f9013660b9bcf0f3e6cfb23314b98fd3d636e9b45aee7765ffa6d98158e5
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.