Contract Overview
Balance:
0 MOVR
MOVR Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
SwapRouterV1
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2022-08-01 */ // File: contracts/core/interfaces/IFactory.sol pragma solidity >=0.8.0; interface IFactory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); event PairCreateLocked( address indexed caller ); event PairCreateUnlocked( address indexed caller ); event BootstrapSetted( address indexed tokenA, address indexed tokenB, address indexed bootstrap ); event FeetoUpdated( address indexed feeto ); event FeeBasePointUpdated( uint8 basePoint ); function feeto() external view returns (address); function feeBasePoint() external view returns (uint8); function lockForPairCreate() external view returns (bool); function getPair(address tokenA, address tokenB) external view returns (address pair); function getBootstrap(address tokenA, address tokenB) external view returns (address bootstrap); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); } // File: contracts/core/interfaces/IPair.sol pragma solidity >=0.8.0; interface IPair { event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/libraries/Math.sol pragma solidity >=0.8.0; // a library for performing various math operations library Math { function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } } // File: contracts/libraries/Helper.sol pragma solidity >=0.8.0; library Helper { using Math for uint256; function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "Helper: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "Helper: ZERO_ADDRESS"); } function pairFor( address factory, address tokenA, address tokenB ) internal view returns (address pair) { return IFactory(factory).getPair(tokenA, tokenB); } function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IPair( pairFor(factory, tokenA, tokenB) ).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x23b872dd, from, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0xa9059cbb, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferNativeCurrency(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferNativeCurrency: NativeCurrency transfer failed" ); } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, "Helper: INSUFFICIENT_INPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "Helper: INSUFFICIENT_LIQUIDITY" ); uint256 amountInWithFee = amountIn.mul(997); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, "Helper: INSUFFICIENT_OUTPUT_AMOUNT"); require( reserveIn > 0 && reserveOut > 0, "Helper: INSUFFICIENT_LIQUIDITY" ); uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(997); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "Helper: INVALID_PATH"); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i], path[i + 1] ); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, "Helper: INVALID_PATH"); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves( factory, path[i - 1], path[i] ); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } } // File: contracts/periphery/interfaces/IWNativeCurrency.sol pragma solidity >=0.8.0; interface IWNativeCurrency { function deposit() external payable; function withdraw(uint256) external; } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: contracts/stableswap/interfaces/IStableSwap.sol pragma solidity >=0.8.0; interface IStableSwap { /// EVENTS event AddLiquidity( address indexed provider, uint256[] tokenAmounts, uint256[] fees, uint256 invariant, uint256 tokenSupply ); event FlashLoan( address indexed caller, address indexed receiver, uint256[] amounts_out ); event TokenExchange( address indexed buyer, uint256 soldId, uint256 tokensSold, uint256 boughtId, uint256 tokensBought ); event RemoveLiquidity(address indexed provider, uint256[] tokenAmounts, uint256[] fees, uint256 tokenSupply); event RemoveLiquidityOne(address indexed provider, uint256 tokenIndex, uint256 tokenAmount, uint256 coinAmount); event RemoveLiquidityImbalance( address indexed provider, uint256[] tokenAmounts, uint256[] fees, uint256 invariant, uint256 tokenSupply ); event RampA(uint256 oldA, uint256 newA, uint256 initialTime, uint256 futureTime); event StopRampA(uint256 A, uint256 timestamp); event NewFee(uint256 fee, uint256 adminFee); event CollectProtocolFee(address token, uint256 amount); event FeeControllerChanged(address newController); event FeeDistributorChanged(address newController); // pool data view functions function getLpToken() external view returns (IERC20 lpToken); function getA() external view returns (uint256); function getAPrecise() external view returns (uint256); function getToken(uint8 index) external view returns (IERC20); function getTokens() external view returns (IERC20[] memory); function getTokenIndex(address tokenAddress) external view returns (uint8); function getTokenBalance(uint8 index) external view returns (uint256); function getTokenBalances() external view returns (uint256[] memory); function getNumberOfTokens() external view returns (uint256); function getVirtualPrice() external view returns (uint256); function calculateTokenAmount(uint256[] calldata amounts, bool deposit) external view returns (uint256); function calculateSwap( uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx ) external view returns (uint256); function calculateRemoveLiquidity(uint256 amount) external view returns (uint256[] memory); function calculateRemoveLiquidityOneToken(uint256 tokenAmount, uint8 tokenIndex) external view returns (uint256 availableTokenAmount); function getAdminBalances() external view returns (uint256[] memory adminBalances); function getAdminBalance(uint8 index) external view returns (uint256); // state modifying functions function swap( uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline ) external returns (uint256); function flashLoan( uint256[] memory amountsOut, address to, bytes calldata data, uint256 deadline ) external; function addLiquidity( uint256[] calldata amounts, uint256 minToMint, uint256 deadline ) external returns (uint256); function removeLiquidity( uint256 amount, uint256[] calldata minAmounts, uint256 deadline ) external returns (uint256[] memory); function removeLiquidityOneToken( uint256 tokenAmount, uint8 tokenIndex, uint256 minAmount, uint256 deadline ) external returns (uint256); function removeLiquidityImbalance( uint256[] calldata amounts, uint256 maxBurnAmount, uint256 deadline ) external returns (uint256); function withdrawAdminFee() external; } // File: contracts/periphery/interfaces/ISwapRouterV1.sol pragma solidity >=0.8.0; interface ISwapRouterV1 { struct Route { bool stable; bytes callData; } function factory() external view returns (address); function WNativeCurrency() external view returns (address); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactNativeCurrencyForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactNativeCurrency( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForNativeCurrency( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapNativeCurrencyForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapPool( IStableSwap pool, uint8 fromIndex, uint8 toIndex, uint256 inAmount, uint256 minOutAmount, address to, uint256 deadline ) external returns (uint256 amountOut); function swapPoolFromBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, address to, uint256 deadline ) external returns (uint256 amountOut); function swapPoolToBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactTokensForTokensThroughStablePool( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external returns (uint256 amountOut); function swapExactNativeCurrencyForTokensThroughStablePool( uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external payable returns (uint256 amountOut); function swapExactTokensForNativeCurrencyThroughStablePool( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external returns (uint256 amountOut); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut( uint256 amountIn, address[] memory path ) external view returns (uint256[] memory amounts); function getAmountsIn( uint256 amountOut, address[] memory path ) external view returns (uint256[] memory amounts); function calculateSwap( IStableSwap pool, uint8 fromIndex, uint8 toIndex, uint256 inAmount ) external view returns (uint256); function calculateSwapFromBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx ) external view returns (uint256); function calculateSwapToBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx ) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/periphery/SwapRouterV1.sol pragma solidity >=0.8.0; contract SwapRouterV1 is ISwapRouterV1 { using SafeERC20 for IERC20; using Math for uint256; struct StablePath { IStableSwap pool; IStableSwap basePool; address fromToken; address toToken; bool fromBase; } address public override factory; address public override WNativeCurrency; constructor(address _factory, address _WNativeCurrency) { factory = _factory; WNativeCurrency = _WNativeCurrency; } modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "SwapRouterV1: EXPIRED"); _; } receive() external payable { require(msg.sender == WNativeCurrency); } function _swap( uint256[] memory amounts, address[] memory path, address _to ) private { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = Helper.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? Helper.pairFor(factory, output, path[i + 2]) : _to; IPair(Helper.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external override ensure(deadline) returns (uint256[] memory amounts) { amounts = Helper.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); Helper.safeTransferFrom( path[0], msg.sender, Helper.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external override ensure(deadline) returns (uint256[] memory amounts) { amounts = Helper.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT"); Helper.safeTransferFrom( path[0], msg.sender, Helper.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactNativeCurrencyForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external override payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH"); amounts = Helper.getAmountsOut(factory, msg.value, path); require( amounts[amounts.length - 1] >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}(); require( IERC20(WNativeCurrency).transfer( Helper.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); } function swapTokensForExactNativeCurrency( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external override ensure(deadline) returns (uint256[] memory amounts) { require( path[path.length - 1] == WNativeCurrency, "SwapRouterV1: INVALID_PATH" ); amounts = Helper.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT"); Helper.safeTransferFrom( path[0], msg.sender, Helper.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]); Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]); } function swapExactTokensForNativeCurrency( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external override ensure(deadline) returns (uint256[] memory amounts) { require( path[path.length - 1] == WNativeCurrency, "SwapRouterV1: INVALID_PATH" ); amounts = Helper.getAmountsOut(factory, amountIn, path); require( amounts[amounts.length - 1] >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); Helper.safeTransferFrom( path[0], msg.sender, Helper.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWNativeCurrency(WNativeCurrency).withdraw(amounts[amounts.length - 1]); Helper.safeTransferNativeCurrency(to, amounts[amounts.length - 1]); } function swapNativeCurrencyForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external override payable ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WNativeCurrency, "SwapRouterV1: INVALID_PATH"); amounts = Helper.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, "SwapRouterV1: EXCESSIVE_INPUT_AMOUNT"); IWNativeCurrency(WNativeCurrency).deposit{value: amounts[0]}(); require( IERC20(WNativeCurrency).transfer( Helper.pairFor(factory, path[0], path[1]), amounts[0] ) ); _swap(amounts, path, to); if (msg.value > amounts[0]) { Helper.safeTransferNativeCurrency( msg.sender, msg.value - amounts[0] ); } } function _swapPool( IStableSwap pool, uint8 fromIndex, uint8 toIndex, uint256 inAmount, uint256 minOutAmount, uint256 deadline ) private returns (uint256 amountOut) { IERC20 coin = pool.getToken(fromIndex); coin.safeIncreaseAllowance(address(pool), inAmount); amountOut = pool.swap(fromIndex, toIndex, inAmount, minOutAmount, deadline); } function _swapPoolFromBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline ) private returns (uint256 amountOut) { IERC20 baseToken = basePool.getLpToken(); uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken)); uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens()); base_amounts[tokenIndexFrom] = dx; IERC20 coin = basePool.getToken(tokenIndexFrom); coin.safeIncreaseAllowance(address(basePool), dx); uint256 baseLpAmount = basePool.addLiquidity(base_amounts, 0, deadline); if (baseTokenIndex != tokenIndexTo) { amountOut = _swapPool(pool, baseTokenIndex, tokenIndexTo, baseLpAmount, minDy, deadline); } else { amountOut = baseLpAmount; } } function _swapPoolToBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, uint256 deadline ) private returns (uint256 amountOut) { IERC20 baseToken = basePool.getLpToken(); uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken)); uint256 tokenLPAmount = dx; if (baseTokenIndex != tokenIndexFrom) { tokenLPAmount = _swapPool(pool, tokenIndexFrom, baseTokenIndex, dx, 0, deadline); } baseToken.safeIncreaseAllowance(address(basePool), tokenLPAmount); amountOut = basePool.removeLiquidityOneToken(tokenLPAmount, tokenIndexTo, minDy, deadline); } function swapPool( IStableSwap pool, uint8 fromIndex, uint8 toIndex, uint256 inAmount, uint256 minOutAmount, address to, uint256 deadline ) external override ensure(deadline) returns (uint256 amountOut) { IERC20 coin = pool.getToken(fromIndex); coin.safeTransferFrom(msg.sender, address(this), inAmount); amountOut = _swapPool(pool, fromIndex, toIndex, inAmount, minOutAmount, deadline); IERC20 coinTo = pool.getToken(toIndex); coinTo.safeTransfer(to, amountOut); } function swapPoolFromBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, address to, uint256 deadline ) external override ensure(deadline) returns (uint256 amountOut) { IERC20 coin = basePool.getToken(tokenIndexFrom); coin.safeTransferFrom(msg.sender, address(this), dx); amountOut = _swapPoolFromBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline); IERC20 coinTo = pool.getToken(tokenIndexTo); coinTo.safeTransfer(to, amountOut); } function swapPoolToBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx, uint256 minDy, address to, uint256 deadline ) external override ensure(deadline) returns (uint256 amountOut) { IERC20 coin = pool.getToken(tokenIndexFrom); coin.safeTransferFrom(msg.sender, address(this), dx); amountOut = _swapPoolToBase(pool, basePool, tokenIndexFrom, tokenIndexTo, dx, minDy, deadline); IERC20 coinTo = basePool.getToken(tokenIndexTo); coinTo.safeTransfer(to, amountOut); } function _anyStableSwap( uint256 amountIn, Route calldata route, uint256 deadline ) private returns (address tokenOut, uint256 amountOut) { StablePath memory path = _decodeStableSwapCallData(route.callData); tokenOut = path.toToken; if (address(path.basePool) == address(0)) { amountOut = _swapPool( path.pool, path.pool.getTokenIndex(path.fromToken), path.pool.getTokenIndex(path.toToken), amountIn, 0, deadline ); } else if (path.fromBase) { amountOut = _swapPoolFromBase( path.pool, path.basePool, path.basePool.getTokenIndex(path.fromToken), path.pool.getTokenIndex(path.toToken), amountIn, 0, deadline ); } else { amountOut = _swapPoolToBase( path.pool, path.basePool, path.pool.getTokenIndex(path.fromToken), path.basePool.getTokenIndex(path.toToken), amountIn, 0, deadline ); } } function _swapThroughStablePool( address tokenIn, uint256 amountIn, Route[] calldata routes, uint256 deadline ) private returns (address tokenOut, uint256 amountOut) { tokenOut = tokenIn; amountOut = amountIn; for (uint256 i = 0; i < routes.length; i++) { if (routes[i].stable) { (tokenOut, amountOut) = _anyStableSwap(amountOut, routes[i], deadline); } else { address[] memory path = _decodeAmmCalldata(routes[i].callData); tokenOut = path[path.length - 1]; uint256[] memory amounts = Helper.getAmountsOut(factory, amountOut, path); Helper.safeTransfer( path[0], Helper.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); amountOut = amounts[amounts.length - 1]; } } } function swapExactTokensForTokensThroughStablePool( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external override ensure(deadline) returns (uint256 amountOut) { address tokenIn; if (routes[0].stable) { tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken; } else { tokenIn = _decodeAmmCalldata(routes[0].callData)[0]; } Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn); address tokenOut; (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline); require( amountOut >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); IERC20(tokenOut).safeTransfer(to, amountOut); } function swapExactNativeCurrencyForTokensThroughStablePool( uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external override payable ensure(deadline) returns (uint256 amountOut) { require(!routes[0].stable, "SwapRouterV1: INVALID_ROUTES"); address tokenIn = _decodeAmmCalldata(routes[0].callData)[0]; require(tokenIn == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES"); IWNativeCurrency(WNativeCurrency).deposit{value: msg.value}(); address tokenOut; (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, msg.value, routes, deadline); require( amountOut >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); IERC20(tokenOut).safeTransfer(to, amountOut); } function swapExactTokensForNativeCurrencyThroughStablePool( uint256 amountIn, uint256 amountOutMin, Route[] calldata routes, address to, uint256 deadline ) external override ensure(deadline) returns (uint256 amountOut) { require(!routes[routes.length - 1].stable, "SwapRouterV1: INVALID_ROUTES"); address[] memory tokenOutPath = _decodeAmmCalldata(routes[routes.length - 1].callData); require(tokenOutPath[tokenOutPath.length - 1] == WNativeCurrency, "SwapRouterV1: INVALID_ROUTES"); address tokenIn; if (routes[0].stable) { tokenIn = _decodeStableSwapCallData(routes[0].callData).fromToken; } else { tokenIn = _decodeAmmCalldata(routes[0].callData)[0]; } Helper.safeTransferFrom(tokenIn, msg.sender, address(this), amountIn); address tokenOut; (tokenOut, amountOut) = _swapThroughStablePool(tokenIn, amountIn, routes, deadline); require( amountOut >= amountOutMin, "SwapRouterV1: INSUFFICIENT_OUTPUT_AMOUNT" ); IWNativeCurrency(WNativeCurrency).withdraw(amountOut); Helper.safeTransferNativeCurrency(to, amountOut); } function _decodeAmmCalldata(bytes memory data) private pure returns (address[] memory path) { path = abi.decode(data, (address[])); } function _decodeStableSwapCallData(bytes memory data) private pure returns (StablePath memory path) { ( IStableSwap pool, IStableSwap basePool, address fromToken, address toToken, bool fromBase ) = abi.decode(data, (IStableSwap, IStableSwap, address, address, bool)); return StablePath(pool, basePool, fromToken, toToken, fromBase); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external override pure returns (uint256 amountOut) { return Helper.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external override pure returns (uint256 amountIn) { return Helper.getAmountOut(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] memory path) external override view returns (uint256[] memory amounts) { return Helper.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] memory path) external override view returns (uint256[] memory amounts) { return Helper.getAmountsIn(factory, amountOut, path); } function calculateSwap( IStableSwap pool, uint8 fromIndex, uint8 toIndex, uint256 inAmount ) external override view returns (uint256) { return pool.calculateSwap(fromIndex, toIndex, inAmount); } function calculateSwapFromBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx ) external override view returns (uint256) { IERC20 baseToken = basePool.getLpToken(); uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken)); uint256[] memory base_amounts = new uint256[](basePool.getNumberOfTokens()); base_amounts[tokenIndexFrom] = dx; uint256 baseLpAmount = basePool.calculateTokenAmount(base_amounts, true); if (baseTokenIndex == tokenIndexTo) { return baseLpAmount; } return pool.calculateSwap(baseTokenIndex, tokenIndexTo, baseLpAmount); } function calculateSwapToBase( IStableSwap pool, IStableSwap basePool, uint8 tokenIndexFrom, uint8 tokenIndexTo, uint256 dx ) external override view returns (uint256) { IERC20 baseToken = basePool.getLpToken(); uint8 baseTokenIndex = pool.getTokenIndex(address(baseToken)); uint256 tokenLPAmount = dx; if (baseTokenIndex != tokenIndexFrom) { tokenLPAmount = pool.calculateSwap(tokenIndexFrom, baseTokenIndex, dx); } return basePool.calculateRemoveLiquidityOneToken(tokenLPAmount, tokenIndexTo); } }
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WNativeCurrency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WNativeCurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"}],"name":"calculateSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapFromBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"}],"name":"calculateSwapToBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactNativeCurrencyForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForNativeCurrencyThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ISwapRouterV1.Route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensThroughStablePool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapNativeCurrencyForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"uint8","name":"fromIndex","type":"uint8"},{"internalType":"uint8","name":"toIndex","type":"uint8"},{"internalType":"uint256","name":"inAmount","type":"uint256"},{"internalType":"uint256","name":"minOutAmount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPool","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolFromBase","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IStableSwap","name":"pool","type":"address"},{"internalType":"contract IStableSwap","name":"basePool","type":"address"},{"internalType":"uint8","name":"tokenIndexFrom","type":"uint8"},{"internalType":"uint8","name":"tokenIndexTo","type":"uint8"},{"internalType":"uint256","name":"dx","type":"uint256"},{"internalType":"uint256","name":"minDy","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapPoolToBase","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactNativeCurrency","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200467638038062004676833981016040819052620000349162000083565b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055620000bb565b80516001600160a01b03811681146200007e57600080fd5b919050565b600080604083850312156200009757600080fd5b620000a28362000066565b9150620000b26020840162000066565b90509250929050565b6145ab80620000cb6000396000f3fe60806040526004361061012e5760003560e01c80638803dbee116100ab578063c45a01551161006f578063c45a01551461032f578063cd1bd0d91461034f578063d06ca61f14610362578063d74fff4e14610382578063dcff1b94146103a2578063f85b7c8b146103c257600080fd5b80638803dbee1461029c5780638a311c57146102bc5780639be7614d146102dc5780639d9270a8146102ef578063b56527bd1461030f57600080fd5b8063419591ed116100f2578063419591ed146102115780634b1d08ca146102495780636dc9c4981461025c578063798af7201461027c57806385f8c2591461015157600080fd5b8063054d50d4146101515780631f00ca74146101845780633214b8c9146101b1578063357b32f0146101d157806338ed1739146101f157600080fd5b3661014c576001546001600160a01b0316331461014a57600080fd5b005b600080fd5b34801561015d57600080fd5b5061017161016c3660046140ed565b6103e2565b6040519081526020015b60405180910390f35b34801561019057600080fd5b506101a461019f366004613fcd565b6103f9565b60405161017b91906141b9565b3480156101bd57600080fd5b506101716101cc366004613d3f565b61041c565b3480156101dd57600080fd5b506101716101ec366004613e82565b61063b565b3480156101fd57600080fd5b506101a461020c36600461407a565b6107ab565b34801561021d57600080fd5b50600154610231906001600160a01b031681565b6040516001600160a01b03909116815260200161017b565b610171610257366004613f66565b61095c565b34801561026857600080fd5b5061017161027736600461407a565b610b4a565b34801561028857600080fd5b50610171610297366004613e31565b610de0565b3480156102a857600080fd5b506101a46102b736600461407a565b610e6c565b3480156102c857600080fd5b506101716102d7366004613d3f565b610f15565b6101a46102ea366004613f66565b611216565b3480156102fb57600080fd5b5061017161030a36600461407a565b611526565b34801561031b57600080fd5b5061017161032a366004613da3565b611637565b34801561033b57600080fd5b50600054610231906001600160a01b031681565b6101a461035d366004613f66565b6117a1565b34801561036e57600080fd5b506101a461037d366004613fcd565b611a3a565b34801561038e57600080fd5b5061017161039d366004613da3565b611a54565b3480156103ae57600080fd5b506101a46103bd36600461407a565b611b4d565b3480156103ce57600080fd5b506101a46103dd36600461407a565b611d78565b60006103ef848484611e87565b90505b9392505050565b600054606090610413906001600160a01b03168484611f8b565b90505b92915050565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b15801561045857600080fd5b505afa15801561046c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104909190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b1580156104d757600080fd5b505afa1580156104eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050f9190614119565b90508360ff808316908816146105ab5760405163a95b089f60e01b815260ff808916600483015283166024820152604481018690526001600160a01b038a169063a95b089f9060640160206040518083038186803b15801561057057600080fd5b505afa158015610584573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190613f4d565b90505b60405163342a87a160e01b81526004810182905260ff871660248201526001600160a01b0389169063342a87a19060440160206040518083038186803b1580156105f457600080fd5b505afa158015610608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062c9190613f4d565b93505050505b95945050505050565b600081428110156106675760405162461bcd60e51b815260040161065e906142a7565b60405180910390fd5b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b1580156106ab57600080fd5b505afa1580156106bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e39190613bcd565b90506106fa6001600160a01b03821633308a612118565b6107088a8a8a8a8a89612189565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240160206040518083038186803b15801561074f57600080fd5b505afa158015610763573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107879190613bcd565b905061079d6001600160a01b03821687866122c2565b505050979650505050505050565b606081428110156107ce5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610818936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b915086826001845161082a9190614489565b8151811061083a5761083a614514565b602002602001015110156108605760405162461bcd60e51b815260040161065e9061425f565b6109128686600081811061087657610876614514565b905060200201602081019061088b9190613bb0565b6000805433916108f2916001600160a01b0316908b908b90816108b0576108b0614514565b90506020020160208101906108c59190613bb0565b8b8b60018181106108d8576108d8614514565b90506020020160208101906108ed9190613bb0565b612464565b8560008151811061090557610905614514565b60200260200101516124e9565b61095182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b509695505050505050565b6000814281101561097f5760405162461bcd60e51b815260040161065e906142a7565b8585600081811061099257610992614514565b90506020028101906109a491906143c5565b6109b2906020810190613c90565b156109cf5760405162461bcd60e51b815260040161065e906142d6565b6000610a41878760008181106109e7576109e7614514565b90506020028101906109f991906143c5565b610a0790602081019061437e565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061280292505050565b600081518110610a5357610a53614514565b60209081029190910101516001549091506001600160a01b03808316911614610a8e5760405162461bcd60e51b815260040161065e906142d6565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b50505050506000610b0682348a8a89612818565b9450905088841015610b2a5760405162461bcd60e51b815260040161065e9061425f565b610b3e6001600160a01b03821687866122c2565b50505095945050505050565b60008142811015610b6d5760405162461bcd60e51b815260040161065e906142a7565b8585610b7a600182614489565b818110610b8957610b89614514565b9050602002810190610b9b91906143c5565b610ba9906020810190613c90565b15610bc65760405162461bcd60e51b815260040161065e906142d6565b6000610be78787610bd8600182614489565b8181106109e7576109e7614514565b6001805482519293506001600160a01b0316918391610c0591614489565b81518110610c1557610c15614514565b60200260200101516001600160a01b031614610c435760405162461bcd60e51b815260040161065e906142d6565b600087876000818110610c5857610c58614514565b9050602002810190610c6a91906143c5565b610c78906020810190613c90565b15610cf857610ced88886000818110610c9357610c93614514565b9050602002810190610ca591906143c5565b610cb390602081019061437e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129cf92505050565b604001519050610d2b565b610d0e888860008181106109e7576109e7614514565b600081518110610d2057610d20614514565b602002602001015190505b610d378133308d6124e9565b6000610d46828c8b8b8a612818565b9550905089851015610d6a5760405162461bcd60e51b815260040161065e9061425f565b600154604051632e1a7d4d60e01b8152600481018790526001600160a01b0390911690632e1a7d4d90602401600060405180830381600087803b158015610db057600080fd5b505af1158015610dc4573d6000803e3d6000fd5b50505050610dd28786612a5a565b505050509695505050505050565b60405163a95b089f60e01b815260ff808516600483015283166024820152604481018290526000906001600160a01b0386169063a95b089f9060640160206040518083038186803b158015610e3457600080fd5b505afa158015610e48573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190613f4d565b60608142811015610e8f5760405162461bcd60e51b815260040161065e906142a7565b6000546040805160208089028281018201909352888252610ed9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110610eef57610eef614514565b602002602001015111156108605760405162461bcd60e51b815260040161065e9061430d565b600080856001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5157600080fd5b505afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918916906366c0bd249060240160206040518083038186803b158015610fd057600080fd5b505afa158015610fe4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110089190614119565b90506000876001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107d9190613f4d565b67ffffffffffffffff8111156110955761109561452a565b6040519080825280602002602001820160405280156110be578160200160208202803683370190505b50905084818860ff16815181106110d7576110d7614514565b6020908102919091010152604051637355940360e11b81526000906001600160a01b038a169063e6ab2806906111149085906001906004016141cc565b60206040518083038186803b15801561112c57600080fd5b505afa158015611140573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111649190613f4d565b90508660ff168360ff16141561117f57935061063292505050565b60405163a95b089f60e01b815260ff808516600483015288166024820152604481018290526001600160a01b038b169063a95b089f9060640160206040518083038186803b1580156111d057600080fd5b505afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190613f4d565b9a9950505050505050505050565b606081428110156112395760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b0316868660008161125657611256614514565b905060200201602081019061126b9190613bb0565b6001600160a01b0316146112915760405162461bcd60e51b815260040161065e90614228565b60005460408051602080890282810182019093528882526112db936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250611f8b92505050565b915034826000815181106112f1576112f1614514565b602002602001015111156113175760405162461bcd60e51b815260040161065e9061430d565b60015482516001600160a01b039091169063d0e30db090849060009061133f5761133f614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561137257600080fd5b505af1158015611386573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506113e59350909116908a908a90816113bd576113bd614514565b90506020020160208101906113d29190613bb0565b8a8a60018181106108d8576108d8614514565b846000815181106113f8576113f8614514565b60200260200101516040518363ffffffff1660e01b81526004016114319291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561144b57600080fd5b505af115801561145f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114839190613cad565b61148c57600080fd5b6114cb82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b816000815181106114de576114de614514565b602002602001015134111561151c5761151c338360008151811061150457611504614514565b6020026020010151346115179190614489565b612a5a565b5095945050505050565b600081428110156115495760405162461bcd60e51b815260040161065e906142a7565b60008686600081811061155e5761155e614514565b905060200281019061157091906143c5565b61157e906020810190613c90565b156115a45761159987876000818110610c9357610c93614514565b6040015190506115d7565b6115ba878760008181106109e7576109e7614514565b6000815181106115cc576115cc614514565b602002602001015190505b6115e38133308c6124e9565b60006115f2828b8a8a89612818565b94509050888410156116165760405162461bcd60e51b815260040161065e9061425f565b61162a6001600160a01b03821687866122c2565b5050509695505050505050565b6000814281101561165a5760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038b16906382b866009060240160206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d69190613bcd565b90506116ed6001600160a01b03821633308a612118565b6116fc8b8b8b8b8b8b8a612b50565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038d16906382b86600906024015b60206040518083038186803b15801561174457600080fd5b505afa158015611758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177c9190613bcd565b90506117926001600160a01b03821687866122c2565b50505098975050505050505050565b606081428110156117c45760405162461bcd60e51b815260040161065e906142a7565b6001546001600160a01b031686866000816117e1576117e1614514565b90506020020160208101906117f69190613bb0565b6001600160a01b03161461181c5760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611866936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506122f792505050565b91508682600184516118789190614489565b8151811061188857611888614514565b602002602001015110156118ae5760405162461bcd60e51b815260040161065e9061425f565b60015482516001600160a01b039091169063d0e30db09084906000906118d6576118d6614514565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561190957600080fd5b505af115801561191d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506119549350909116908a908a90816113bd576113bd614514565b8460008151811061196757611967614514565b60200260200101516040518363ffffffff1660e01b81526004016119a09291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f29190613cad565b6119fb57600080fd5b61151c82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612627915050565b600054606090610413906001600160a01b031684846122f7565b60008142811015611a775760405162461bcd60e51b815260040161065e906142a7565b60405162415c3360e91b815260ff891660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015611abb57600080fd5b505afa158015611acf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af39190613bcd565b9050611b0a6001600160a01b03821633308a612118565b611b198b8b8b8b8b8b8a612e6c565b60405162415c3360e91b815260ff8a1660048201529093506000906001600160a01b038c16906382b866009060240161172c565b60608142811015611b705760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611b8c9082614489565b818110611b9b57611b9b614514565b9050602002016020810190611bb09190613bb0565b6001600160a01b031614611bd65760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611c20936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506122f792505050565b9150868260018451611c329190614489565b81518110611c4257611c42614514565b60200260200101511015611c685760405162461bcd60e51b815260040161065e9061425f565b611c7e8686600081811061087657610876614514565b611cbd82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612627915050565b6001805483516001600160a01b0390911691632e1a7d4d918591611ce091614489565b81518110611cf057611cf0614514565b60200260200101516040518263ffffffff1660e01b8152600401611d1691815260200190565b600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050610951848360018551611d5b9190614489565b81518110611d6b57611d6b614514565b6020026020010151612a5a565b60608142811015611d9b5760405162461bcd60e51b815260040161065e906142a7565b600180546001600160a01b03169087908790611db79082614489565b818110611dc657611dc6614514565b9050602002016020810190611ddb9190613bb0565b6001600160a01b031614611e015760405162461bcd60e51b815260040161065e90614228565b6000546040805160208089028281018201909352888252611e4b936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250611f8b92505050565b91508682600081518110611e6157611e61614514565b60200260200101511115611c685760405162461bcd60e51b815260040161065e9061430d565b6000808411611ee25760405162461bcd60e51b815260206004820152602160248201527f48656c7065723a20494e53554646494349454e545f494e5055545f414d4f554e6044820152601560fa1b606482015260840161065e565b600083118015611ef25750600082115b611f3e5760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b6000611f4c856103e5613035565b90506000611f5a8285613035565b90506000611f7483611f6e886103e8613035565b9061309c565b9050611f808183614448565b979650505050505050565b6060600282511015611fd65760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff811115611ff057611ff061452a565b604051908082528060200260200182016040528015612019578160200160208202803683370190505b50905082816001835161202c9190614489565b8151811061203c5761203c614514565b6020026020010181815250506000600183516120589190614489565b90505b8015612110576000806120ab8786612074600187614489565b8151811061208457612084614514565b602002602001015187868151811061209e5761209e614514565b60200260200101516130f1565b915091506120d38484815181106120c4576120c4614514565b602002602001015183836131ca565b846120df600186614489565b815181106120ef576120ef614514565b60200260200101818152505050508080612108906144cc565b91505061205b565b509392505050565b6040516001600160a01b03808516602483015283166044820152606481018290526121839085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526132c9565b50505050565b60405162415c3360e91b815260ff8616600482015260009081906001600160a01b038916906382b866009060240160206040518083038186803b1580156121cf57600080fd5b505afa1580156121e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122079190613bcd565b905061221d6001600160a01b038216898761339b565b6040516348b4aac360e11b815260ff8089166004830152871660248201526044810186905260648101859052608481018490526001600160a01b0389169063916955869060a401602060405180830381600087803b15801561227e57600080fd5b505af1158015612292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b69190613f4d565b98975050505050505050565b6040516001600160a01b0383166024820152604481018290526122f290849063a9059cbb60e01b9060640161214c565b505050565b60606002825110156123425760405162461bcd60e51b8152602060048201526014602482015273090cad8e0cae47440929cac82989288bea082a8960631b604482015260640161065e565b815167ffffffffffffffff81111561235c5761235c61452a565b604051908082528060200260200182016040528015612385578160200160208202803683370190505b509050828160008151811061239c5761239c614514565b60200260200101818152505060005b600183516123b99190614489565b811015612110576000806123ff878685815181106123d9576123d9614514565b6020026020010151878660016123ef9190614430565b8151811061209e5761209e614514565b9150915061242784848151811061241857612418614514565b60200260200101518383611e87565b84612433856001614430565b8151811061244357612443614514565b6020026020010181815250505050808061245c906144e3565b9150506123ab565b60405163e6a4390560e01b81526001600160a01b03838116600483015282811660248301526000919085169063e6a439059060440160206040518083038186803b1580156124b157600080fd5b505afa1580156124c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190613bcd565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b179052915160009283929088169161254d919061419d565b6000604051808303816000865af19150503d806000811461258a576040519150601f19603f3d011682016040523d82523d6000602084013e61258f565b606091505b50915091508180156125b95750805115806125b95750808060200190518101906125b99190613cad565b61261f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604482015270185b9cd9995c919c9bdb4819985a5b1959607a1b606482015260840161065e565b505050505050565b60005b600183516126389190614489565b8110156121835760008084838151811061265457612654614514565b60200260200101518584600161266a9190614430565b8151811061267a5761267a614514565b6020026020010151915091506000612692838361345c565b5090506000876126a3866001614430565b815181106126b3576126b3614514565b60200260200101519050600080836001600160a01b0316866001600160a01b0316146126e1578260006126e5565b6000835b91509150600060028a516126f99190614489565b8810612705578861273f565b60005461273f906001600160a01b0316878c6127228c6002614430565b8151811061273257612732614514565b6020026020010151612464565b600054909150612759906001600160a01b03168888612464565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612796576020820181803683370190505b506040518563ffffffff1660e01b81526004016127b69493929190614351565b600060405180830381600087803b1580156127d057600080fd5b505af11580156127e4573d6000803e3d6000fd5b505050505050505050505080806127fa906144e3565b91505061262a565b6060818060200190518101906104169190613bea565b848460005b848110156129c45785858281811061283757612837614514565b905060200281019061284991906143c5565b612857906020810190613c90565b156128945761288a8287878481811061287257612872614514565b905060200281019061288491906143c5565b8661353d565b90935091506129b2565b60006128ab8787848181106109e7576109e7614514565b905080600182516128bc9190614489565b815181106128cc576128cc614514565b6020026020010151935060006128f660008054906101000a90046001600160a01b031685846122f7565b905061297b8260008151811061290e5761290e614514565b602002602001015161295b60008054906101000a90046001600160a01b03168560008151811061294057612940614514565b60200260200101518660018151811061273257612732614514565b8360008151811061296e5761296e614514565b60200260200101516138c4565b612986818330612627565b80600182516129959190614489565b815181106129a5576129a5614514565b6020026020010151935050505b806129bc816144e3565b91505061281d565b509550959350505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152600080600080600086806020019051810190612a169190613cca565b6040805160a0810182526001600160a01b03968716815294861660208601529285169284019290925290921660608201529015156080820152979650505050505050565b604080516000808252602082019092526001600160a01b038416908390604051612a84919061419d565b60006040518083038185875af1925050503d8060008114612ac1576040519150601f19603f3d011682016040523d82523d6000602084013e612ac6565b606091505b50509050806122f25760405162461bcd60e51b815260206004820152604a60248201527f5472616e7366657248656c7065723a3a736166655472616e736665724e61746960448201527f766543757272656e63793a204e617469766543757272656e6379207472616e7360648201526919995c8819985a5b195960b21b608482015260a40161065e565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612b8c57600080fd5b505afa158015612ba0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bc49190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612c0b57600080fd5b505afa158015612c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c439190614119565b90506000896001600160a01b031663efeecb516040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8057600080fd5b505afa158015612c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb89190613f4d565b67ffffffffffffffff811115612cd057612cd061452a565b604051908082528060200260200182016040528015612cf9578160200160208202803683370190505b50905086818a60ff1681518110612d1257612d12614514565b602090810291909101015260405162415c3360e91b815260ff8a1660048201526000906001600160a01b038c16906382b866009060240160206040518083038186803b158015612d6157600080fd5b505afa158015612d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d999190613bcd565b9050612daf6001600160a01b0382168c8a61339b565b604051634d49e87d60e01b81526000906001600160a01b038d1690634d49e87d90612de290869085908c906004016141f0565b602060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e349190613f4d565b90508960ff168460ff1614612e5857612e518d858c848c8c612189565b9550612e5c565b8095505b5050505050979650505050505050565b600080876001600160a01b0316638214f5a46040518163ffffffff1660e01b815260040160206040518083038186803b158015612ea857600080fd5b505afa158015612ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee09190613bcd565b6040516319b02f4960e21b81526001600160a01b0380831660048301529192506000918b16906366c0bd249060240160206040518083038186803b158015612f2757600080fd5b505afa158015612f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5f9190614119565b90508560ff808316908a1614612f8157612f7e8b8a848a60008a612189565b90505b612f956001600160a01b0384168b8361339b565b6040516301f1d0ab60e51b81526004810182905260ff8916602482015260448101879052606481018690526001600160a01b038b1690633e3a156090608401602060405180830381600087803b158015612fee57600080fd5b505af1158015613002573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130269190613f4d565b9b9a5050505050505050505050565b60008115806130595750828261304b818361446a565b92506130579083614448565b145b6104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161065e565b6000826130a98382614430565b91508110156104165760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161065e565b6000806000613100858561345c565b509050600080613111888888612464565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561314957600080fd5b505afa15801561315d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131819190613efd565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b0316146131b85780826131bb565b81815b90999098509650505050505050565b60008084116132265760405162461bcd60e51b815260206004820152602260248201527f48656c7065723a20494e53554646494349454e545f4f55545055545f414d4f55604482015261139560f21b606482015260840161065e565b6000831180156132365750600082115b6132825760405162461bcd60e51b815260206004820152601e60248201527f48656c7065723a20494e53554646494349454e545f4c49515549444954590000604482015260640161065e565b600061329a6103e86132948688613035565b90613035565b905060006132ae6103e561329486896139f5565b90506132bf6001611f6e8385614448565b9695505050505050565b600061331e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613a4b9092919063ffffffff16565b8051909150156122f2578080602001905181019061333c9190613cad565b6122f25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161065e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e9060440160206040518083038186803b1580156133e757600080fd5b505afa1580156133fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061341f9190613f4d565b6134299190614430565b6040516001600160a01b03851660248201526044810182905290915061218390859063095ea7b360e01b9060640161214c565b600080826001600160a01b0316846001600160a01b031614156134c15760405162461bcd60e51b815260206004820152601b60248201527f48656c7065723a204944454e544943414c5f4144445245535345530000000000604482015260640161065e565b826001600160a01b0316846001600160a01b0316106134e15782846134e4565b83835b90925090506001600160a01b0382166135365760405162461bcd60e51b815260206004820152601460248201527348656c7065723a205a45524f5f4144445245535360601b604482015260640161065e565b9250929050565b60008080613551610cb3602087018761437e565b606081015160208201519094509091506001600160a01b031661368357805160408083015190516319b02f4960e21b81526001600160a01b03918216600482015261367c92918216906366c0bd249060240160206040518083038186803b1580156135bb57600080fd5b505afa1580156135cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f39190614119565b835160608501516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561363b57600080fd5b505afa15801561364f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136739190614119565b89600089612189565b91506138bb565b8060800151156137a1578051602082015160408084015190516319b02f4960e21b81526001600160a01b03918216600482015261367c9392918216906366c0bd249060240160206040518083038186803b1580156136e057600080fd5b505afa1580156136f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137189190614119565b845160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561376057600080fd5b505afa158015613774573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137989190614119565b8a60008a612b50565b8051602082015160408084015190516319b02f4960e21b81526001600160a01b0391821660048201526138b89392918316906366c0bd249060240160206040518083038186803b1580156137f457600080fd5b505afa158015613808573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382c9190614119565b602085015160608601516040516319b02f4960e21b81526001600160a01b0391821660048201529116906366c0bd249060240160206040518083038186803b15801561387757600080fd5b505afa15801561388b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138af9190614119565b8a60008a612e6c565b91505b50935093915050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613920919061419d565b6000604051808303816000865af19150503d806000811461395d576040519150601f19603f3d011682016040523d82523d6000602084013e613962565b606091505b509150915081801561398c57508051158061398c57508080602001905181019061398c9190613cad565b6139ee5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201526c185b9cd9995c8819985a5b1959609a1b606482015260840161065e565b5050505050565b600082613a028382614489565b91508111156104165760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161065e565b60606103ef8484600085856001600160a01b0385163b613aad5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065e565b600080866001600160a01b03168587604051613ac9919061419d565b60006040518083038185875af1925050503d8060008114613b06576040519150601f19603f3d011682016040523d82523d6000602084013e613b0b565b606091505b5091509150611f8082828660608315613b255750816103f2565b825115613b355782518084602001fd5b8160405162461bcd60e51b815260040161065e9190614215565b60008083601f840112613b6157600080fd5b50813567ffffffffffffffff811115613b7957600080fd5b6020830191508360208260051b850101111561353657600080fd5b80516001600160701b0381168114613bab57600080fd5b919050565b600060208284031215613bc257600080fd5b81356103f281614540565b600060208284031215613bdf57600080fd5b81516103f281614540565b60006020808385031215613bfd57600080fd5b825167ffffffffffffffff811115613c1457600080fd5b8301601f81018513613c2557600080fd5b8051613c38613c338261440c565b6143db565b80828252848201915084840188868560051b8701011115613c5857600080fd5b600094505b83851015613c84578051613c7081614540565b835260019490940193918501918501613c5d565b50979650505050505050565b600060208284031215613ca257600080fd5b81356103f281614558565b600060208284031215613cbf57600080fd5b81516103f281614558565b600080600080600060a08688031215613ce257600080fd5b8551613ced81614540565b6020870151909550613cfe81614540565b6040870151909450613d0f81614540565b6060870151909350613d2081614540565b6080870151909250613d3181614558565b809150509295509295909350565b600080600080600060a08688031215613d5757600080fd5b8535613d6281614540565b94506020860135613d7281614540565b93506040860135613d8281614566565b92506060860135613d9281614566565b949793965091946080013592915050565b600080600080600080600080610100898b031215613dc057600080fd5b8835613dcb81614540565b97506020890135613ddb81614540565b96506040890135613deb81614566565b95506060890135613dfb81614566565b94506080890135935060a0890135925060c0890135613e1981614540565b8092505060e089013590509295985092959890939650565b60008060008060808587031215613e4757600080fd5b8435613e5281614540565b93506020850135613e6281614566565b92506040850135613e7281614566565b9396929550929360600135925050565b600080600080600080600060e0888a031215613e9d57600080fd5b8735613ea881614540565b96506020880135613eb881614566565b95506040880135613ec881614566565b9450606088013593506080880135925060a0880135613ee681614540565b8092505060c0880135905092959891949750929550565b600080600060608486031215613f1257600080fd5b613f1b84613b94565b9250613f2960208501613b94565b9150604084015163ffffffff81168114613f4257600080fd5b809150509250925092565b600060208284031215613f5f57600080fd5b5051919050565b600080600080600060808688031215613f7e57600080fd5b85359450602086013567ffffffffffffffff811115613f9c57600080fd5b613fa888828901613b4f565b9095509350506040860135613fbc81614540565b949793965091946060013592915050565b60008060408385031215613fe057600080fd5b8235915060208084013567ffffffffffffffff811115613fff57600080fd5b8401601f8101861361401057600080fd5b803561401e613c338261440c565b80828252848201915084840189868560051b870101111561403e57600080fd5b600094505b8385101561406a57803561405681614540565b835260019490940193918501918501614043565b5080955050505050509250929050565b60008060008060008060a0878903121561409357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156140b857600080fd5b6140c489828a01613b4f565b90955093505060608701356140d881614540565b80925050608087013590509295509295509295565b60008060006060848603121561410257600080fd5b505081359360208301359350604090920135919050565b60006020828403121561412b57600080fd5b81516103f281614566565b600081518084526020808501945080840160005b838110156141665781518752958201959082019060010161414a565b509495945050505050565b600081518084526141898160208601602086016144a0565b601f01601f19169290920160200192915050565b600082516141af8184602087016144a0565b9190910192915050565b6020815260006104136020830184614136565b6040815260006141df6040830185614136565b905082151560208301529392505050565b6060815260006142036060830186614136565b60208301949094525060400152919050565b6020815260006104136020830184614171565b6020808252601a908201527f53776170526f7574657256313a20494e56414c49445f50415448000000000000604082015260600190565b60208082526028908201527f53776170526f7574657256313a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b60208082526015908201527414ddd85c149bdd5d195c958c4e8811561412549151605a1b604082015260600190565b6020808252601c908201527f53776170526f7574657256313a20494e56414c49445f524f5554455300000000604082015260600190565b60208082526024908201527f53776170526f7574657256313a204558434553534956455f494e5055545f414d60408201526313d5539560e21b606082015260800190565b84815283602082015260018060a01b03831660408201526080606082015260006132bf6080830184614171565b6000808335601e1984360301811261439557600080fd5b83018035915067ffffffffffffffff8211156143b057600080fd5b60200191503681900382131561353657600080fd5b60008235603e198336030181126141af57600080fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156144045761440461452a565b604052919050565b600067ffffffffffffffff8211156144265761442661452a565b5060051b60200190565b60008219821115614443576144436144fe565b500190565b60008261446557634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615614484576144846144fe565b500290565b60008282101561449b5761449b6144fe565b500390565b60005b838110156144bb5781810151838201526020016144a3565b838111156121835750506000910152565b6000816144db576144db6144fe565b506000190190565b60006000198214156144f7576144f76144fe565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461455557600080fd5b50565b801515811461455557600080fd5b60ff8116811461455557600080fdfea2646970667358221220c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c44364736f6c6343000807003300000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d3800000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d3800000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _factory (address): 0x28eaa01dc747c4e9d37c5ca473e7d167e90f8d38
Arg [1] : _WNativeCurrency (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000028eaa01dc747c4e9d37c5ca473e7d167e90f8d38
Arg [1] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed ByteCode Sourcemap
36710:19261:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37416:15;;-1:-1:-1;;;;;37416:15:0;37402:10;:29;37394:38;;;;;;36710:19261;;;;;53368:242;;;;;;;;;;-1:-1:-1;53368:242:0;;;;;:::i;:::-;;:::i;:::-;;;23514:25:1;;;23502:2;23487:18;53368:242:0;;;;;;;;54110:234;;;;;;;;;;-1:-1:-1;54110:234:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55351:617::-;;;;;;;;;;-1:-1:-1;55351:617:0;;;;;:::i;:::-;;:::i;45480:583::-;;;;;;;;;;-1:-1:-1;45480:583:0;;;;;:::i;:::-;;:::i;38318:677::-;;;;;;;;;;-1:-1:-1;38318:677:0;;;;;:::i;:::-;;:::i;37028:39::-;;;;;;;;;;-1:-1:-1;37028:39:0;;;;-1:-1:-1;;;;;37028:39:0;;;;;;-1:-1:-1;;;;;13470:32:1;;;13452:51;;13440:2;13425:18;37028:39:0;13306:203:1;50615:850:0;;;;;;:::i;:::-;;:::i;51473:1251::-;;;;;;;;;;-1:-1:-1;51473:1251:0;;;;;:::i;:::-;;:::i;54352:249::-;;;;;;;;;;-1:-1:-1;54352:249:0;;;;;:::i;:::-;;:::i;39003:618::-;;;;;;;;;;-1:-1:-1;39003:618:0;;;;;:::i;:::-;;:::i;54609:734::-;;;;;;;;;;-1:-1:-1;54609:734:0;;;;;:::i;:::-;;:::i;42381:941::-;;;;;;:::i;:::-;;:::i;49720:887::-;;;;;;;;;;-1:-1:-1;49720:887:0;;;;;:::i;:::-;;:::i;46071:642::-;;;;;;;;;;-1:-1:-1;46071:642:0;;;;;:::i;:::-;;:::i;36990:31::-;;;;;;;;;;-1:-1:-1;36990:31:0;;;;-1:-1:-1;;;;;36990:31:0;;;39629:823;;;;;;:::i;:::-;;:::i;53868:234::-;;;;;;;;;;-1:-1:-1;53868:234:0;;;;;:::i;:::-;;:::i;46721:638::-;;;;;;;;;;-1:-1:-1;46721:638:0;;;;;:::i;:::-;;:::i;41391:982::-;;;;;;;;;;-1:-1:-1;41391:982:0;;;;;:::i;:::-;;:::i;40460:923::-;;;;;;;;;;-1:-1:-1;40460:923:0;;;;;:::i;:::-;;:::i;53368:242::-;53513:17;53550:52;53570:8;53580:9;53591:10;53550:19;:52::i;:::-;53543:59;;53368:242;;;;;;:::o;54110:234::-;54311:7;;54242:24;;54291:45;;-1:-1:-1;;;;;54311:7:0;54320:9;54331:4;54291:19;:45::i;:::-;54284:52;;54110:234;;;;;:::o;55351:617::-;55558:7;55578:16;55597:8;-1:-1:-1;;;;;55597:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55652:38;;-1:-1:-1;;;55652:38:0;;-1:-1:-1;;;;;13470:32:1;;;55652:38:0;;;13452:51:1;55578:40:0;;-1:-1:-1;55629:20:0;;55652:18;;;;;13425::1;;55652:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55629:61;-1:-1:-1;55725:2:0;55742:32;;;;;;;;55738:135;;55807:54;;-1:-1:-1;;;55807:54:0;;25089:4:1;25077:17;;;55807:54:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55807:18:0;;;;;25032::1;;55807:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55791:70;;55738:135;55890:70;;-1:-1:-1;;;55890:70:0;;;;;24183:25:1;;;24256:4;24244:17;;24224:18;;;24217:45;-1:-1:-1;;;;;55890:41:0;;;;;24156:18:1;;55890:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55883:77;;;;;55351:617;;;;;;;;:::o;45480:583::-;45732:17;45713:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;;;;;;;;;45776:24:::1;::::0;-1:-1:-1;;;45776:24:0;;24848:4:1;24836:17;;45776:24:0::1;::::0;::::1;24818:36:1::0;45762:11:0::1;::::0;-1:-1:-1;;;;;45776:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45776:24:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45762:38:::0;-1:-1:-1;45811:58:0::1;-1:-1:-1::0;;;;;45811:21:0;::::1;45833:10;45853:4;45860:8:::0;45811:21:::1;:58::i;:::-;45892:69;45902:4;45908:9;45919:7;45928:8;45938:12;45952:8;45892:9;:69::i;:::-;45988:22;::::0;-1:-1:-1;;;45988:22:0;;24848:4:1;24836:17;;45988:22:0::1;::::0;::::1;24818:36:1::0;45880:81:0;;-1:-1:-1;45972:13:0::1;::::0;-1:-1:-1;;;;;45988:13:0;::::1;::::0;::::1;::::0;24791:18:1;;45988:22:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45972:38:::0;-1:-1:-1;46021:34:0::1;-1:-1:-1::0;;;;;46021:19:0;::::1;46041:2:::0;46045:9;46021:19:::1;:34::i;:::-;45751:312;;45480:583:::0;;;;;;;;;;:::o;38318:677::-;38543:24;38524:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;38611:7:::1;::::0;38590:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;38611:7:0::1;::::0;38620:8;;38590:45;38630:4;;;;;;38590:45;;::::1;::::0;38630:4;;38590:45;38630:4;38590:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;38590:20:0::1;::::0;-1:-1:-1;;;38590:45:0:i:1;:::-;38580:55;;38699:12;38668:7;38693:1;38676:7;:14;:18;;;;:::i;:::-;38668:27;;;;;;;;:::i;:::-;;;;;;;:43;;38646:133;;;;-1:-1:-1::0;;;38646:133:0::1;;;;;;;:::i;:::-;38790:162;38828:4;;38833:1;38828:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38890;::::0;;38850:10:::1;::::0;38875:41:::1;::::0;-1:-1:-1;;;;;38890:7:0::1;::::0;38899:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38908:4;;38913:1;38908:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38875:14;:41::i;:::-;38931:7;38939:1;38931:10;;;;;;;;:::i;:::-;;;;;;;38790:23;:162::i;:::-;38963:24;38969:7;38978:4;;38963:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38984:2:0;;-1:-1:-1;38963:5:0::1;::::0;-1:-1:-1;;38963:24:0:i:1;:::-;38318:677:::0;;;;;;;;;:::o;50615:850::-;50846:17;50827:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;50885:6:::1;;50892:1;50885:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50884:17;50876:58;;;;-1:-1:-1::0;;;50876:58:0::1;;;;;;;:::i;:::-;50945:15;50963:38;50982:6;;50989:1;50982:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50963:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50963:18:0::1;::::0;-1:-1:-1;;;50963:38:0:i:1;:::-;51002:1;50963:41;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;51034:15:::1;::::0;50963:41;;-1:-1:-1;;;;;;51023:26:0;;::::1;51034:15:::0;::::1;51023:26;51015:67;;;;-1:-1:-1::0;;;51015:67:0::1;;;;;;;:::i;:::-;51110:15;;;;;;;;;-1:-1:-1::0;;;;;51110:15:0::1;-1:-1:-1::0;;;;;51093:41:0::1;;51142:9;51093:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;51165:16;51216:60;51239:7;51248:9;51259:6;;51267:8;51216:22;:60::i;:::-;51192:84:::0;-1:-1:-1;51192:84:0;-1:-1:-1;51309:25:0;;::::1;;51287:115;;;;-1:-1:-1::0;;;51287:115:0::1;;;;;;;:::i;:::-;51413:44;-1:-1:-1::0;;;;;51413:29:0;::::1;51443:2:::0;51447:9;51413:29:::1;:44::i;:::-;50865:600;;50615:850:::0;;;;;;;;:::o;51473:1251::-;51723:17;51704:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;51762:6;;51769:17:::1;51785:1;51762:6:::0;51769:17:::1;:::i;:::-;51762:25;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:32;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;51761:33;51753:74;;;;-1:-1:-1::0;;;51753:74:0::1;;;;;;;:::i;:::-;51838:29;51870:54;51889:6:::0;;51896:17:::1;51912:1;51889:6:::0;51896:17:::1;:::i;:::-;51889:25;;;;;;;:::i;51870:54::-;51984:15;::::0;;51956:19;;51838:86;;-1:-1:-1;;;;;;51984:15:0::1;::::0;51838:86;;51956:23:::1;::::0;::::1;:::i;:::-;51943:37;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;51943:56:0::1;;51935:97;;;;-1:-1:-1::0;;;51935:97:0::1;;;;;;;:::i;:::-;52043:15;52073:6;;52080:1;52073:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52069:198;;;52116:45;52142:6;;52149:1;52142:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:18;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52116:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;52116:25:0::1;::::0;-1:-1:-1;;;52116:45:0:i:1;:::-;:55;;;52106:65;;52069:198;;;52214:38;52233:6;;52240:1;52233:9;;;;;;;:::i;52214:38::-;52253:1;52214:41;;;;;;;;:::i;:::-;;;;;;;52204:51;;52069:198;52277:69;52301:7;52310:10;52330:4;52337:8;52277:23;:69::i;:::-;52357:16;52408:59;52431:7;52440:8;52450:6;;52458:8;52408:22;:59::i;:::-;52384:83:::0;-1:-1:-1;52384:83:0;-1:-1:-1;52500:25:0;;::::1;;52478:115;;;;-1:-1:-1::0;;;52478:115:0::1;;;;;;;:::i;:::-;52621:15;::::0;52604:53:::1;::::0;-1:-1:-1;;;52604:53:0;;::::1;::::0;::::1;23514:25:1::0;;;-1:-1:-1;;;;;52621:15:0;;::::1;::::0;52604:42:::1;::::0;23487:18:1;;52604:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;52668:48;52702:2;52706:9;52668:33;:48::i;:::-;51742:982;;;51473:1251:::0;;;;;;;;;:::o;54352:249::-;54545:48;;-1:-1:-1;;;54545:48:0;;25089:4:1;25077:17;;;54545:48:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;54518:7:0;;-1:-1:-1;;;;;54545:18:0;;;;;25032::1;;54545:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;39003:618::-;39228:24;39209:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39295:7:::1;::::0;39275:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39295:7:0::1;::::0;39304:9;;39275:45;39315:4;;;;;;39275:45;;::::1;::::0;39315:4;;39275:45;39315:4;39275:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39275:19:0::1;::::0;-1:-1:-1;;;39275:45:0:i:1;:::-;39265:55;;39353:11;39339:7;39347:1;39339:10;;;;;;;;:::i;:::-;;;;;;;:25;;39331:74;;;;-1:-1:-1::0;;;39331:74:0::1;;;;;;;:::i;54609:734::-:0;54818:7;54838:16;54857:8;-1:-1:-1;;;;;54857:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54912:38;;-1:-1:-1;;;54912:38:0;;-1:-1:-1;;;;;13470:32:1;;;54912:38:0;;;13452:51:1;54838:40:0;;-1:-1:-1;54889:20:0;;54912:18;;;;;13425::1;;54912:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54889:61;;54961:29;55007:8;-1:-1:-1;;;;;55007:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54993:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54993:43:0;;54961:75;;55078:2;55047:12;55060:14;55047:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;55114:49;;-1:-1:-1;;;55114:49:0;;55091:20;;-1:-1:-1;;;;;55114:29:0;;;;;:49;;55144:12;;55158:4;;55114:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55091:72;;55196:12;55178:30;;:14;:30;;;55174:82;;;55232:12;-1:-1:-1;55225:19:0;;-1:-1:-1;;;55225:19:0;55174:82;55273:62;;-1:-1:-1;;;55273:62:0;;25089:4:1;25077:17;;;55273:62:0;;;25059:36:1;25131:17;;25111:18;;;25104:45;25165:18;;;25158:34;;;-1:-1:-1;;;;;55273:18:0;;;;;25032::1;;55273:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55266:69;54609:734;-1:-1:-1;;;;;;;;;;54609:734:0:o;42381:941::-;42592:24;42573:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;42648:15:::1;::::0;-1:-1:-1;;;;;42648:15:0::1;42637:4:::0;;42648:15:::1;42637:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42637:26:0::1;;42629:65;;;;-1:-1:-1::0;;;42629:65:0::1;;;;;;;:::i;:::-;42735:7;::::0;42715:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;42735:7:0::1;::::0;42744:9;;42715:45;42755:4;;;;;;42715:45;;::::1;::::0;42755:4;;42715:45;42755:4;42715:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;42715:19:0::1;::::0;-1:-1:-1;;;42715:45:0:i:1;:::-;42705:55;;42793:9;42779:7;42787:1;42779:10;;;;;;;;:::i;:::-;;;;;;;:23;;42771:72;;;;-1:-1:-1::0;;;42771:72:0::1;;;;;;;:::i;:::-;42871:15;::::0;42903:10;;-1:-1:-1;;;;;42871:15:0;;::::1;::::0;42854:41:::1;::::0;42903:7;;42871:15:::1;::::0;42903:10:::1;;;;:::i;:::-;;;;;;;42854:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;42956:15:0::1;::::0;::::1;43015:7:::0;;-1:-1:-1;;;;;42956:15:0;;::::1;::::0;-1:-1:-1;42949:32:0::1;::::0;-1:-1:-1;43000:41:0::1;::::0;-1:-1:-1;43015:7:0;;::::1;::::0;43024:4;;;;:7;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;43033:4;;43038:1;43033:7;;;;;;;:::i;43000:41::-;43060:7;43068:1;43060:10;;;;;;;;:::i;:::-;;;;;;;42949:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;42949:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42927:169;;;::::0;::::1;;43107:24;43113:7;43122:4;;43107:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43128:2:0;;-1:-1:-1;43107:5:0::1;::::0;-1:-1:-1;;43107:24:0:i:1;:::-;43158:7;43166:1;43158:10;;;;;;;;:::i;:::-;;;;;;;43146:9;:22;43142:173;;;43185:118;43237:10;43278:7;43286:1;43278:10;;;;;;;;:::i;:::-;;;;;;;43266:9;:22;;;;:::i;:::-;43185:33;:118::i;:::-;42381:941:::0;;;;;;;;:::o;49720:887::-;49962:17;49943:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;49992:15:::1;50022:6;;50029:1;50022:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;50018:198;;;50065:45;50091:6;;50098:1;50091:9;;;;;;;:::i;50065:45::-;:55;;;50055:65;;50018:198;;;50163:38;50182:6;;50189:1;50182:9;;;;;;;:::i;50163:38::-;50202:1;50163:41;;;;;;;;:::i;:::-;;;;;;;50153:51;;50018:198;50228:69;50252:7;50261:10;50281:4;50288:8;50228:23;:69::i;:::-;50308:16;50359:59;50382:7;50391:8;50401:6;;50409:8;50359:22;:59::i;:::-;50335:83:::0;-1:-1:-1;50335:83:0;-1:-1:-1;50451:25:0;;::::1;;50429:115;;;;-1:-1:-1::0;;;50429:115:0::1;;;;;;;:::i;:::-;50555:44;-1:-1:-1::0;;;;;50555:29:0;::::1;50585:2:::0;50589:9;50555:29:::1;:44::i;:::-;49981:626;;49720:887:::0;;;;;;;;;:::o;46071:642::-;46359:17;46340:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;46403:33:::1;::::0;-1:-1:-1;;;46403:33:0;;24848:4:1;24836:17;;46403:33:0::1;::::0;::::1;24818:36:1::0;46389:11:0::1;::::0;-1:-1:-1;;;;;46403:17:0;::::1;::::0;::::1;::::0;24791:18:1;;46403:33:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46389:47:::0;-1:-1:-1;46447:52:0::1;-1:-1:-1::0;;;;;46447:21:0;::::1;46469:10;46489:4;46496:2:::0;46447:21:::1;:52::i;:::-;46522:84;46540:4;46546:8;46556:14;46572:12;46586:2;46590:5;46597:8;46522:17;:84::i;:::-;46633:27;::::0;-1:-1:-1;;;46633:27:0;;24848:4:1;24836:17;;46633:27:0::1;::::0;::::1;24818:36:1::0;46510:96:0;;-1:-1:-1;46617:13:0::1;::::0;-1:-1:-1;;;;;46633:13:0;::::1;::::0;::::1;::::0;24791:18:1;;46633:27:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46617:43:::0;-1:-1:-1;46671:34:0::1;-1:-1:-1::0;;;;;46671:19:0;::::1;46691:2:::0;46695:9;46671:19:::1;:34::i;:::-;46378:335;;46071:642:::0;;;;;;;;;;;:::o;39629:823::-;39843:24;39824:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;39899:15:::1;::::0;-1:-1:-1;;;;;39899:15:0::1;39888:4:::0;;39899:15:::1;39888:7:::0;::::1;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;39888:26:0::1;;39880:65;;;;-1:-1:-1::0;;;39880:65:0::1;;;;;;;:::i;:::-;39987:7;::::0;39966:46:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;39987:7:0::1;::::0;39996:9:::1;::::0;39966:46;40007:4;;;;;;39966:46;;::::1;::::0;40007:4;;39966:46;40007:4;39966:46;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;39966:20:0::1;::::0;-1:-1:-1;;;39966:46:0:i:1;:::-;39956:56;;40076:12;40045:7;40070:1;40053:7;:14;:18;;;;:::i;:::-;40045:27;;;;;;;;:::i;:::-;;;;;;;:43;;40023:133;;;;-1:-1:-1::0;;;40023:133:0::1;;;;;;;:::i;:::-;40184:15;::::0;40216:10;;-1:-1:-1;;;;;40184:15:0;;::::1;::::0;40167:41:::1;::::0;40216:7;;40184:15:::1;::::0;40216:10:::1;;;;:::i;:::-;;;;;;;40167:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40269:15:0::1;::::0;::::1;40328:7:::0;;-1:-1:-1;;;;;40269:15:0;;::::1;::::0;-1:-1:-1;40262:32:0::1;::::0;-1:-1:-1;40313:41:0::1;::::0;-1:-1:-1;40328:7:0;;::::1;::::0;40337:4;;;;:7;::::1;;;;:::i;40313:41::-;40373:7;40381:1;40373:10;;;;;;;;:::i;:::-;;;;;;;40262:136;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;14395:32:1;;;;14377:51;;14459:2;14444:18;;14437:34;14365:2;14350:18;;14203:274;40262:136:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40240:169;;;::::0;::::1;;40420:24;40426:7;40435:4;;40420:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;40441:2:0;;-1:-1:-1;40420:5:0::1;::::0;-1:-1:-1;;40420:24:0:i:1;53868:234::-:0;54070:7;;54000:24;;54049:45;;-1:-1:-1;;;;;54070:7:0;54079:8;54089:4;54049:20;:45::i;46721:638::-;47007:17;46988:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;47051:29:::1;::::0;-1:-1:-1;;;47051:29:0;;24848:4:1;24836:17;;47051:29:0::1;::::0;::::1;24818:36:1::0;47037:11:0::1;::::0;-1:-1:-1;;;;;47051:13:0;::::1;::::0;::::1;::::0;24791:18:1;;47051:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47037:43:::0;-1:-1:-1;47091:52:0::1;-1:-1:-1::0;;;;;47091:21:0;::::1;47113:10;47133:4;47140:2:::0;47091:21:::1;:52::i;:::-;47166:82;47182:4;47188:8;47198:14;47214:12;47228:2;47232:5;47239:8;47166:15;:82::i;:::-;47275:31;::::0;-1:-1:-1;;;47275:31:0;;24848:4:1;24836:17;;47275:31:0::1;::::0;::::1;24818:36:1::0;47154:94:0;;-1:-1:-1;47259:13:0::1;::::0;-1:-1:-1;;;;;47275:17:0;::::1;::::0;::::1;::::0;24791:18:1;;47275:31:0::1;24676:184:1::0;41391:982:0;41624:24;41605:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;41708:15:::1;::::0;;-1:-1:-1;;;;;41708:15:0::1;::::0;41683:4;;;;41688:15:::1;::::0;41683:4;41688:15:::1;:::i;:::-;41683:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41683:40:0::1;;41661:116;;;;-1:-1:-1::0;;;41661:116:0::1;;;;;;;:::i;:::-;41819:7;::::0;41798:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;41819:7:0::1;::::0;41828:8;;41798:45;41838:4;;;;;;41798:45;;::::1;::::0;41838:4;;41798:45;41838:4;41798:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;41798:20:0::1;::::0;-1:-1:-1;;;41798:45:0:i:1;:::-;41788:55;;41907:12;41876:7;41901:1;41884:7;:14;:18;;;;:::i;:::-;41876:27;;;;;;;;:::i;:::-;;;;;;;:43;;41854:133;;;;-1:-1:-1::0;;;41854:133:0::1;;;;;;;:::i;:::-;41998:162;42036:4;;42041:1;42036:7;;;;;;;:::i;41998:162::-;42171:35;42177:7;42186:4;;42171:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42200:4:0::1;::::0;-1:-1:-1;42171:5:0::1;::::0;-1:-1:-1;;42171:35:0:i:1;:::-;42234:15;::::0;;42268:14;;-1:-1:-1;;;;;42234:15:0;;::::1;::::0;42217:42:::1;::::0;42260:7;;42268:18:::1;::::0;::::1;:::i;:::-;42260:27;;;;;;;;:::i;:::-;;;;;;;42217:71;;;;;;;;;;;;;23514:25:1::0;;23502:2;23487:18;;23368:177;42217:71:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;42299:66;42333:2;42337:7;42362:1;42345:7;:14;:18;;;;:::i;:::-;42337:27;;;;;;;;:::i;:::-;;;;;;;42299:33;:66::i;40460:923::-:0;40693:24;40674:8;37287:15;37275:8;:27;;37267:61;;;;-1:-1:-1;;;37267:61:0;;;;;;;:::i;:::-;40777:15:::1;::::0;;-1:-1:-1;;;;;40777:15:0::1;::::0;40752:4;;;;40757:15:::1;::::0;40752:4;40757:15:::1;:::i;:::-;40752:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40752:40:0::1;;40730:116;;;;-1:-1:-1::0;;;40730:116:0::1;;;;;;;:::i;:::-;40887:7;::::0;40867:45:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;-1:-1:-1;;;;;40887:7:0::1;::::0;40896:9;;40867:45;40907:4;;;;;;40867:45;;::::1;::::0;40907:4;;40867:45;40907:4;40867:45;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;40867:19:0::1;::::0;-1:-1:-1;;;40867:45:0:i:1;:::-;40857:55;;40945:11;40931:7;40939:1;40931:10;;;;;;;;:::i;:::-;;;;;;;:25;;40923:74;;;;-1:-1:-1::0;;;40923:74:0::1;;;;;;;:::i;7009:589::-:0;7145:17;7194:1;7183:8;:12;7175:58;;;;-1:-1:-1;;;7175:58:0;;23168:2:1;7175:58:0;;;23150:21:1;23207:2;23187:18;;;23180:30;23246:34;23226:18;;;23219:62;-1:-1:-1;;;23297:18:1;;;23290:31;23338:19;;7175:58:0;22966:397:1;7175:58:0;7278:1;7266:9;:13;:31;;;;;7296:1;7283:10;:14;7266:31;7244:111;;;;-1:-1:-1;;;7244:111:0;;22049:2:1;7244:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7244:111:0;21847:354:1;7244:111:0;7366:23;7392:17;:8;7405:3;7392:12;:17::i;:::-;7366:43;-1:-1:-1;7420:17:0;7440:31;7366:43;7460:10;7440:19;:31::i;:::-;7420:51;-1:-1:-1;7482:19:0;7504:40;7528:15;7504:19;:9;7518:4;7504:13;:19::i;:::-;:23;;:40::i;:::-;7482:62;-1:-1:-1;7567:23:0;7482:62;7567:9;:23;:::i;:::-;7555:35;7009:589;-1:-1:-1;;;;;;;7009:589:0:o;8969:640::-;9107:24;9167:1;9152:4;:11;:16;;9144:49;;;;-1:-1:-1;;;9144:49:0;;22408:2:1;9144:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;9144:49:0;22206:344:1;9144:49:0;9228:4;:11;9214:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9214:26:0;;9204:36;;9281:9;9251:7;9276:1;9259:7;:14;:18;;;;:::i;:::-;9251:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;9306:9;9332:1;9318:4;:11;:15;;;;:::i;:::-;9306:27;;9301:301;9335:5;;9301:301;;9363:17;;9404:108;9434:7;9460:4;9465:5;9469:1;9465;:5;:::i;:::-;9460:11;;;;;;;;:::i;:::-;;;;;;;9490:4;9495:1;9490:7;;;;;;;;:::i;:::-;;;;;;;9404:11;:108::i;:::-;9362:150;;;;9544:46;9556:7;9564:1;9556:10;;;;;;;;:::i;:::-;;;;;;;9568:9;9579:10;9544:11;:46::i;:::-;9527:7;9535:5;9539:1;9535;:5;:::i;:::-;9527:14;;;;;;;;:::i;:::-;;;;;;:63;;;;;9347:255;;9342:3;;;;;:::i;:::-;;;;9301:301;;;;8969:640;;;;;:::o;33046:248::-;33217:68;;-1:-1:-1;;;;;14081:15:1;;;33217:68:0;;;14063:34:1;14133:15;;14113:18;;;14106:43;14165:18;;;14158:34;;;33190:96:0;;33210:5;;-1:-1:-1;;;33240:27:0;13998:18:1;;33217:68:0;;;;-1:-1:-1;;33217:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;33217:68:0;-1:-1:-1;;;;;;33217:68:0;;;;;;;;;;33190:19;:96::i;:::-;33046:248;;;;:::o;43330:429::-;43579:24;;-1:-1:-1;;;43579:24:0;;24848:4:1;24836:17;;43579:24:0;;;24818:36:1;43535:17:0;;;;-1:-1:-1;;;;;43579:13:0;;;;;24791:18:1;;43579:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43565:38;-1:-1:-1;43614:51:0;-1:-1:-1;;;;;43614:26:0;;43649:4;43656:8;43614:26;:51::i;:::-;43688:63;;-1:-1:-1;;;43688:63:0;;25484:4:1;25472:17;;;43688:63:0;;;25454:36:1;25526:17;;25506:18;;;25499:45;25560:18;;;25553:34;;;25603:18;;;25596:34;;;25646:19;;;25639:35;;;-1:-1:-1;;;;;43688:9:0;;;;;25426:19:1;;43688:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43676:75;43330:429;-1:-1:-1;;;;;;;;43330:429:0:o;32827:211::-;32971:58;;-1:-1:-1;;;;;14395:32:1;;32971:58:0;;;14377:51:1;14444:18;;;14437:34;;;32944:86:0;;32964:5;;-1:-1:-1;;;32994:23:0;14350:18:1;;32971:58:0;14203:274:1;32944:86:0;32827:211;;;:::o;8342:619::-;8480:24;8540:1;8525:4;:11;:16;;8517:49;;;;-1:-1:-1;;;8517:49:0;;22408:2:1;8517:49:0;;;22390:21:1;22447:2;22427:18;;;22420:30;-1:-1:-1;;;22466:18:1;;;22459:50;22526:18;;8517:49:0;22206:344:1;8517:49:0;8601:4;:11;8587:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8587:26:0;;8577:36;;8637:8;8624:7;8632:1;8624:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;8661:9;8656:298;8690:1;8676:4;:11;:15;;;;:::i;:::-;8672:1;:19;8656:298;;;8714:17;8733:18;8755:108;8785:7;8811:4;8816:1;8811:7;;;;;;;;:::i;:::-;;;;;;;8837:4;8842:1;8846;8842:5;;;;:::i;:::-;8837:11;;;;;;;;:::i;8755:108::-;8713:150;;;;8895:47;8908:7;8916:1;8908:10;;;;;;;;:::i;:::-;;;;;;;8920:9;8931:10;8895:12;:47::i;:::-;8878:7;8886:5;:1;8890;8886:5;:::i;:::-;8878:14;;;;;;;;:::i;:::-;;;;;;:64;;;;;8698:256;;8693:3;;;;;:::i;:::-;;;;8656:298;;4550:204;4705:41;;-1:-1:-1;;;4705:41:0;;-1:-1:-1;;;;;13744:15:1;;;4705:41:0;;;13726:34:1;13796:15;;;13776:18;;;13769:43;4673:12:0;;4705:25;;;;;;13661:18:1;;4705:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5589:522::-;5874:51;;;-1:-1:-1;;;;;14081:15:1;;;5874:51:0;;;14063:34:1;14133:15;;;14113:18;;;14106:43;14165:18;;;;14158:34;;;5874:51:0;;;;;;;;;;13998:18:1;;;;5874:51:0;;;;;;;-1:-1:-1;;;;;5874:51:0;-1:-1:-1;;;5874:51:0;;;5849:87;;-1:-1:-1;;;;5849:10:0;;;;:87;;5874:51;5849:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5813:123;;;;5969:7;:57;;;;-1:-1:-1;5981:11:0;;:16;;:44;;;6012:4;6001:24;;;;;;;;;;;;:::i;:::-;5947:156;;;;-1:-1:-1;;;5947:156:0;;17749:2:1;5947:156:0;;;17731:21:1;17788:2;17768:18;;;17761:30;17827:34;17807:18;;;17800:62;-1:-1:-1;;;17878:18:1;;;17871:47;17935:19;;5947:156:0;17547:413:1;5947:156:0;5723:388;;5589:522;;;;:::o;37448:862::-;37583:9;37578:725;37612:1;37598:4;:11;:15;;;;:::i;:::-;37594:1;:19;37578:725;;;37636:13;37651:14;37670:4;37675:1;37670:7;;;;;;;;:::i;:::-;;;;;;;37679:4;37684:1;37688;37684:5;;;;:::i;:::-;37679:11;;;;;;;;:::i;:::-;;;;;;;37635:56;;;;37707:14;37727:32;37745:5;37752:6;37727:17;:32::i;:::-;-1:-1:-1;37706:53:0;-1:-1:-1;37774:17:0;37794:7;37802:5;:1;37806;37802:5;:::i;:::-;37794:14;;;;;;;;:::i;:::-;;;;;;;37774:34;;37824:18;37844;37875:6;-1:-1:-1;;;;;37866:15:0;:5;-1:-1:-1;;;;;37866:15:0;;:101;;37945:9;37964:1;37866:101;;;37910:1;37914:9;37866:101;37823:144;;;;37982:10;38013:1;37999:4;:11;:15;;;;:::i;:::-;37995:1;:19;:106;;38098:3;37995:106;;;38049:7;;38034:44;;-1:-1:-1;;;;;38049:7:0;38058:6;38066:4;38071:5;:1;38075;38071:5;:::i;:::-;38066:11;;;;;;;;:::i;:::-;;;;;;;38034:14;:44::i;:::-;38137:7;;37982:119;;-1:-1:-1;38122:38:0;;-1:-1:-1;;;;;38137:7:0;38146:5;38153:6;38122:14;:38::i;:::-;-1:-1:-1;;;;;38116:50:0;;38185:10;38214;38243:2;38274:1;38264:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38264:12:0;;38116:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37620:683;;;;;;;37615:3;;;;;:::i;:::-;;;;37578:725;;52732:147;52801:21;52853:4;52842:29;;;;;;;;;;;;:::i;48686:1026::-;48915:7;48945:8;48856:16;48966:739;48986:17;;;48966:739;;;49029:6;;49036:1;49029:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;;;;;;;:::i;:::-;49025:669;;;49089:46;49104:9;49115:6;;49122:1;49115:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;49126:8;49089:14;:46::i;:::-;49065:70;;-1:-1:-1;49065:70:0;-1:-1:-1;49025:669:0;;;49176:21;49200:38;49219:6;;49226:1;49219:9;;;;;;;:::i;49200:38::-;49176:62;;49268:4;49287:1;49273:4;:11;:15;;;;:::i;:::-;49268:21;;;;;;;;:::i;:::-;;;;;;;49257:32;;49308:24;49335:46;49356:7;;;;;;;;-1:-1:-1;;;;;49356:7:0;49365:9;49376:4;49335:20;:46::i;:::-;49308:73;;49400:166;49442:4;49447:1;49442:7;;;;;;;;:::i;:::-;;;;;;;49473:41;49488:7;;;;;;;;-1:-1:-1;;;;;49488:7:0;49497:4;49502:1;49497:7;;;;;;;;:::i;:::-;;;;;;;49506:4;49511:1;49506:7;;;;;;;;:::i;49473:41::-;49537:7;49545:1;49537:10;;;;;;;;:::i;:::-;;;;;;;49400:19;:166::i;:::-;49585:35;49591:7;49600:4;49614;49585:5;:35::i;:::-;49651:7;49676:1;49659:7;:14;:18;;;;:::i;:::-;49651:27;;;;;;;;:::i;:::-;;;;;;;49639:39;;49157:537;;49025:669;49005:3;;;;:::i;:::-;;;;48966:739;;;;48686:1026;;;;;;;;:::o;52887:473::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53049:16:0;53081:20;53117:17;53150:15;53181:13;53219:4;53208:68;;;;;;;;;;;;:::i;:::-;53296:56;;;;;;;;-1:-1:-1;;;;;53296:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;52887:473:0:o;6600:287::-;6724:12;;;6684;6724;;;;;;;;;-1:-1:-1;;;;;6702:7:0;;;6717:5;;6702:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6683:54;;;6770:7;6748:131;;;;-1:-1:-1;;;6748:131:0;;19686:2:1;6748:131:0;;;19668:21:1;19725:2;19705:18;;;19698:30;19764:34;19744:18;;;19737:62;19835:34;19815:18;;;19808:62;-1:-1:-1;;;19886:19:1;;;19879:41;19937:19;;6748:131:0;19484:478:1;43767:939:0;44008:17;44038:16;44057:8;-1:-1:-1;;;;;44057:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44112:38;;-1:-1:-1;;;44112:38:0;;-1:-1:-1;;;;;13470:32:1;;;44112:38:0;;;13452:51:1;44038:40:0;;-1:-1:-1;44089:20:0;;44112:18;;;;;13425::1;;44112:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44089:61;;44161:29;44207:8;-1:-1:-1;;;;;44207:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44193:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44193:43:0;;44161:75;;44278:2;44247:12;44260:14;44247:28;;;;;;;;;;:::i;:::-;;;;;;;;;;:33;44305;;-1:-1:-1;;;44305:33:0;;24848:4:1;24836:17;;44305:33:0;;;24818:36:1;44291:11:0;;-1:-1:-1;;;;;44305:17:0;;;;;24791:18:1;;44305:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44291:47;-1:-1:-1;44349:49:0;-1:-1:-1;;;;;44349:26:0;;44384:8;44395:2;44349:26;:49::i;:::-;44432:48;;-1:-1:-1;;;44432:48:0;;44409:20;;-1:-1:-1;;;;;44432:21:0;;;;;:48;;44454:12;;44409:20;;44471:8;;44432:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44409:71;;44513:12;44495:30;;:14;:30;;;44491:208;;44554:76;44564:4;44570:14;44586:12;44600;44614:5;44621:8;44554:9;:76::i;:::-;44542:88;;44491:208;;;44675:12;44663:24;;44491:208;44027:679;;;;;43767:939;;;;;;;;;:::o;44714:758::-;44953:17;44983:16;45002:8;-1:-1:-1;;;;;45002:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45057:38;;-1:-1:-1;;;45057:38:0;;-1:-1:-1;;;;;13470:32:1;;;45057:38:0;;;13452:51:1;44983:40:0;;-1:-1:-1;45034:20:0;;45057:18;;;;;13425::1;;45057:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45034:61;-1:-1:-1;45130:2:0;45147:32;;;;;;;;45143:145;;45212:64;45222:4;45228:14;45244;45260:2;45264:1;45267:8;45212:9;:64::i;:::-;45196:80;;45143:145;45298:65;-1:-1:-1;;;;;45298:31:0;;45338:8;45349:13;45298:31;:65::i;:::-;45386:78;;-1:-1:-1;;;45386:78:0;;;;;24500:25:1;;;24573:4;24561:17;;24541:18;;;24534:45;24595:18;;;24588:34;;;24638:18;;;24631:34;;;-1:-1:-1;;;;;45386:32:0;;;;;24472:19:1;;45386:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45374:90;44714:758;-1:-1:-1;;;;;;;;;;;44714:758:0:o;3863:151::-;3921:9;3951:6;;;:30;;-1:-1:-1;3980:1:0;3975;3966:5;3975:1;3980;3966:5;:::i;:::-;3962:9;-1:-1:-1;3961:15:0;;3962:9;3961:15;:::i;:::-;:20;3951:30;3943:63;;;;-1:-1:-1;;;3943:63:0;;16642:2:1;3943:63:0;;;16624:21:1;16681:2;16661:18;;;16654:30;-1:-1:-1;;;16700:18:1;;;16693:50;16760:18;;3943:63:0;16440:344:1;3572:137:0;3630:9;3675:1;3665:5;3669:1;3675;3665:5;:::i;:::-;3661:9;;;3660:16;;3652:49;;;;-1:-1:-1;;;3652:49:0;;16991:2:1;3652:49:0;;;16973:21:1;17030:2;17010:18;;;17003:30;-1:-1:-1;;;17049:18:1;;;17042:50;17109:18;;3652:49:0;16789:344:1;5101:480:0;5228:16;5246;5276:14;5296:26;5307:6;5315;5296:10;:26::i;:::-;5275:47;;;5334:16;5352;5394:32;5402:7;5411:6;5419;5394:7;:32::i;:::-;-1:-1:-1;;;;;5374:75:0;;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5333:118;-1:-1:-1;;;;;5333:118:0;;;-1:-1:-1;;;;;5333:118:0;;;5495:6;-1:-1:-1;;;;;5485:16:0;:6;-1:-1:-1;;;;;5485:16:0;;:88;;5554:8;5564;5485:88;;;5518:8;5528;5485:88;5462:111;;;;-1:-1:-1;5101:480:0;-1:-1:-1;;;;;;;5101:480:0:o;7719:541::-;7855:16;7904:1;7892:9;:13;7884:60;;;;-1:-1:-1;;;7884:60:0;;20518:2:1;7884:60:0;;;20500:21:1;20557:2;20537:18;;;20530:30;20596:34;20576:18;;;20569:62;-1:-1:-1;;;20647:18:1;;;20640:32;20689:19;;7884:60:0;20316:398:1;7884:60:0;7989:1;7977:9;:13;:31;;;;;8007:1;7994:10;:14;7977:31;7955:111;;;;-1:-1:-1;;;7955:111:0;;22049:2:1;7955:111:0;;;22031:21:1;22088:2;22068:18;;;22061:30;22127:32;22107:18;;;22100:60;22177:18;;7955:111:0;21847:354:1;7955:111:0;8077:17;8097:34;8126:4;8097:24;:9;8111;8097:13;:24::i;:::-;:28;;:34::i;:::-;8077:54;-1:-1:-1;8142:19:0;8164:34;8194:3;8164:25;:10;8179:9;8164:14;:25::i;:34::-;8142:56;-1:-1:-1;8220:32:0;8250:1;8221:23;8142:56;8221:9;:23;:::i;8220:32::-;8209:43;7719:541;-1:-1:-1;;;;;;7719:541:0:o;35894:716::-;36318:23;36344:69;36372:4;36344:69;;;;;;;;;;;;;;;;;36352:5;-1:-1:-1;;;;;36344:27:0;;;:69;;;;;:::i;:::-;36428:17;;36318:95;;-1:-1:-1;36428:21:0;36424:179;;36525:10;36514:30;;;;;;;;;;;;:::i;:::-;36506:85;;;;-1:-1:-1;;;36506:85:0;;22757:2:1;36506:85:0;;;22739:21:1;22796:2;22776:18;;;22769:30;22835:34;22815:18;;;22808:62;-1:-1:-1;;;22886:18:1;;;22879:40;22936:19;;36506:85:0;22555:406:1;34187:317:0;34341:39;;-1:-1:-1;;;34341:39:0;;34365:4;34341:39;;;13726:34:1;-1:-1:-1;;;;;13796:15:1;;;13776:18;;;13769:43;34318:20:0;;34383:5;;34341:15;;;;;13661:18:1;;34341:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;;;:::i;:::-;34426:69;;-1:-1:-1;;;;;14395:32:1;;34426:69:0;;;14377:51:1;14444:18;;;14437:34;;;34318:70:0;;-1:-1:-1;34399:97:0;;34419:5;;-1:-1:-1;;;34449:22:0;14350:18:1;;34426:69:0;14203:274:1;4155:387:0;4257:14;4273;4323:6;-1:-1:-1;;;;;4313:16:0;:6;-1:-1:-1;;;;;4313:16:0;;;4305:56;;;;-1:-1:-1;;;4305:56:0;;20921:2:1;4305:56:0;;;20903:21:1;20960:2;20940:18;;;20933:30;20999:29;20979:18;;;20972:57;21046:18;;4305:56:0;20719:351:1;4305:56:0;4400:6;-1:-1:-1;;;;;4391:15:0;:6;-1:-1:-1;;;;;4391:15:0;;:79;;4455:6;4463;4391:79;;;4423:6;4431;4391:79;4372:98;;-1:-1:-1;4372:98:0;-1:-1:-1;;;;;;4489:20:0;;4481:53;;;;-1:-1:-1;;;4481:53:0;;20169:2:1;4481:53:0;;;20151:21:1;20208:2;20188:18;;;20181:30;-1:-1:-1;;;20227:18:1;;;20220:50;20287:18;;4481:53:0;19967:344:1;4481:53:0;4155:387;;;;;:::o;47367:1311::-;47500:16;;;47573:41;47599:14;;;;:5;:14;:::i;47573:41::-;47636:12;;;;47673:13;;;;47636:12;;-1:-1:-1;47548:66:0;;-1:-1:-1;;;;;;47665:36:0;47661:1010;;47758:9;;47811:14;;;;;47787:39;;-1:-1:-1;;;47787:39:0;;-1:-1:-1;;;;;13470:32:1;;;47787:39:0;;;13452:51:1;47730:245:0;;47758:9;47787:23;;;;;13425:18:1;;47787:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47846:9;;47870:12;;;;47846:37;;-1:-1:-1;;;47846:37:0;;-1:-1:-1;;;;;13470:32:1;;;47846:37:0;;;13452:51:1;47846:23:0;;;;;13425:18:1;;47846:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47903:8;47931:1;47952:8;47730:9;:245::i;:::-;47718:257;;47661:1010;;;47997:4;:13;;;47993:678;;;48075:9;;48104:13;;;;48165:14;;;;;48137:43;;-1:-1:-1;;;48137:43:0;;-1:-1:-1;;;;;13470:32:1;;;48137:43:0;;;13452:51:1;48039:290:0;;48075:9;48104:13;48137:27;;;;;13425:18:1;;48137:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48200:9;;48224:12;;;;48200:37;;-1:-1:-1;;;48200:37:0;;-1:-1:-1;;;;;13470:32:1;;;48200:37:0;;;13452:51:1;48200:23:0;;;;;13425:18:1;;48200:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48257:8;48285:1;48306:8;48039:17;:290::i;47993:678::-;48408:9;;48436:13;;;;48492:14;;;;;48468:39;;-1:-1:-1;;;48468:39:0;;-1:-1:-1;;;;;13470:32:1;;;48468:39:0;;;13452:51:1;48374:285:0;;48408:9;48436:13;48468:23;;;;;13425:18:1;;48468:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48527:13;;;;48555:12;;;;48527:41;;-1:-1:-1;;;48527:41:0;;-1:-1:-1;;;;;13470:32:1;;;48527:41:0;;;13452:51:1;48527:27:0;;;;;13425:18:1;;48527:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48588:8;48616:1;48636:8;48374:15;:285::i;:::-;48362:297;;47993:678;47537:1141;47367:1311;;;;;;:::o;6119:473::-;6365:45;;;-1:-1:-1;;;;;14395:32:1;;;6365:45:0;;;14377:51:1;14444:18;;;;14437:34;;;6365:45:0;;;;;;;;;;14350:18:1;;;;6365:45:0;;;;;;;-1:-1:-1;;;;;6365:45:0;-1:-1:-1;;;6365:45:0;;;6340:81;;-1:-1:-1;;;;6340:10:0;;;;:81;;6365:45;6340:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6304:117;;;;6454:7;:57;;;;-1:-1:-1;6466:11:0;;:16;;:44;;;6497:4;6486:24;;;;;;;;;;;;:::i;:::-;6432:152;;;;-1:-1:-1;;;6432:152:0;;21635:2:1;6432:152:0;;;21617:21:1;21674:2;21654:18;;;21647:30;21713:34;21693:18;;;21686:62;-1:-1:-1;;;21764:18:1;;;21757:43;21817:19;;6432:152:0;21433:409:1;6432:152:0;6226:366;;6119:473;;;:::o;3717:138::-;3775:9;3820:1;3810:5;3814:1;3820;3810:5;:::i;:::-;3806:9;;;3805:16;;3797:50;;;;-1:-1:-1;;;3797:50:0;;15937:2:1;3797:50:0;;;15919:21:1;15976:2;15956:18;;;15949:30;-1:-1:-1;;;15995:18:1;;;15988:51;16056:18;;3797:50:0;15735:345:1;13811:229:0;13948:12;13980:52;14002:6;14010:4;14016:1;14019:12;13948;-1:-1:-1;;;;;11361:19:0;;;15218:60;;;;-1:-1:-1;;;15218:60:0;;21277:2:1;15218:60:0;;;21259:21:1;21316:2;21296:18;;;21289:30;21355:31;21335:18;;;21328:59;21404:18;;15218:60:0;21075:353:1;15218:60:0;15292:12;15306:23;15333:6;-1:-1:-1;;;;;15333:11:0;15352:5;15359:4;15333:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15291:73;;;;15382:51;15399:7;15408:10;15420:12;17767;17796:7;17792:580;;;-1:-1:-1;17827:10:0;17820:17;;17792:580;17941:17;;:21;17937:424;;18189:10;18183:17;18250:15;18237:10;18233:2;18229:19;18222:44;17937:424;18332:12;18325:20;;-1:-1:-1;;;18325:20:0;;;;;;;;:::i;14:367:1:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;386:188;465:13;;-1:-1:-1;;;;;507:42:1;;497:53;;487:81;;564:1;561;554:12;487:81;386:188;;;:::o;579:247::-;638:6;691:2;679:9;670:7;666:23;662:32;659:52;;;707:1;704;697:12;659:52;746:9;733:23;765:31;790:5;765:31;:::i;831:251::-;901:6;954:2;942:9;933:7;929:23;925:32;922:52;;;970:1;967;960:12;922:52;1002:9;996:16;1021:31;1046:5;1021:31;:::i;1087:967::-;1182:6;1213:2;1256;1244:9;1235:7;1231:23;1227:32;1224:52;;;1272:1;1269;1262:12;1224:52;1305:9;1299:16;1338:18;1330:6;1327:30;1324:50;;;1370:1;1367;1360:12;1324:50;1393:22;;1446:4;1438:13;;1434:27;-1:-1:-1;1424:55:1;;1475:1;1472;1465:12;1424:55;1504:2;1498:9;1527:60;1543:43;1583:2;1543:43;:::i;:::-;1527:60;:::i;:::-;1609:3;1633:2;1628:3;1621:15;1661:2;1656:3;1652:12;1645:19;;1692:2;1688;1684:11;1740:7;1735:2;1729;1726:1;1722:10;1718:2;1714:19;1710:28;1707:41;1704:61;;;1761:1;1758;1751:12;1704:61;1783:1;1774:10;;1793:231;1807:2;1804:1;1801:9;1793:231;;;1871:3;1865:10;1888:31;1913:5;1888:31;:::i;:::-;1932:18;;1825:1;1818:9;;;;;1970:12;;;;2002;;1793:231;;;-1:-1:-1;2043:5:1;1087:967;-1:-1:-1;;;;;;;1087:967:1:o;2059:241::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;2223:9;2210:23;2242:28;2264:5;2242:28;:::i;2305:245::-;2372:6;2425:2;2413:9;2404:7;2400:23;2396:32;2393:52;;;2441:1;2438;2431:12;2393:52;2473:9;2467:16;2492:28;2514:5;2492:28;:::i;2826:839::-;2985:6;2993;3001;3009;3017;3070:3;3058:9;3049:7;3045:23;3041:33;3038:53;;;3087:1;3084;3077:12;3038:53;3119:9;3113:16;3138:31;3163:5;3138:31;:::i;:::-;3238:2;3223:18;;3217:25;3188:5;;-1:-1:-1;3251:33:1;3217:25;3251:33;:::i;:::-;3355:2;3340:18;;3334:25;3303:7;;-1:-1:-1;3368:33:1;3334:25;3368:33;:::i;:::-;3472:2;3457:18;;3451:25;3420:7;;-1:-1:-1;3485:33:1;3451:25;3485:33;:::i;:::-;3589:3;3574:19;;3568:26;3537:7;;-1:-1:-1;3603:30:1;3568:26;3603:30;:::i;:::-;3652:7;3642:17;;;2826:839;;;;;;;;:::o;3670:772::-;3801:6;3809;3817;3825;3833;3886:3;3874:9;3865:7;3861:23;3857:33;3854:53;;;3903:1;3900;3893:12;3854:53;3942:9;3929:23;3961:31;3986:5;3961:31;:::i;:::-;4011:5;-1:-1:-1;4068:2:1;4053:18;;4040:32;4081:33;4040:32;4081:33;:::i;:::-;4133:7;-1:-1:-1;4192:2:1;4177:18;;4164:32;4205:31;4164:32;4205:31;:::i;:::-;4255:7;-1:-1:-1;4314:2:1;4299:18;;4286:32;4327:31;4286:32;4327:31;:::i;:::-;3670:772;;;;-1:-1:-1;3670:772:1;;4431:3;4416:19;4403:33;;3670:772;-1:-1:-1;;3670:772:1:o;4447:1052::-;4605:6;4613;4621;4629;4637;4645;4653;4661;4714:3;4702:9;4693:7;4689:23;4685:33;4682:53;;;4731:1;4728;4721:12;4682:53;4770:9;4757:23;4789:31;4814:5;4789:31;:::i;:::-;4839:5;-1:-1:-1;4896:2:1;4881:18;;4868:32;4909:33;4868:32;4909:33;:::i;:::-;4961:7;-1:-1:-1;5020:2:1;5005:18;;4992:32;5033:31;4992:32;5033:31;:::i;:::-;5083:7;-1:-1:-1;5142:2:1;5127:18;;5114:32;5155:31;5114:32;5155:31;:::i;:::-;5205:7;-1:-1:-1;5259:3:1;5244:19;;5231:33;;-1:-1:-1;5311:3:1;5296:19;;5283:33;;-1:-1:-1;5368:3:1;5353:19;;5340:33;5382;5340;5382;:::i;:::-;5434:7;5424:17;;;5488:3;5477:9;5473:19;5460:33;5450:43;;4447:1052;;;;;;;;;;;:::o;5504:610::-;5606:6;5614;5622;5630;5683:3;5671:9;5662:7;5658:23;5654:33;5651:53;;;5700:1;5697;5690:12;5651:53;5739:9;5726:23;5758:31;5783:5;5758:31;:::i;:::-;5808:5;-1:-1:-1;5865:2:1;5850:18;;5837:32;5878:31;5837:32;5878:31;:::i;:::-;5928:7;-1:-1:-1;5987:2:1;5972:18;;5959:32;6000:31;5959:32;6000:31;:::i;:::-;5504:610;;;;-1:-1:-1;6050:7:1;;6104:2;6089:18;6076:32;;-1:-1:-1;;5504:610:1:o;6119:890::-;6248:6;6256;6264;6272;6280;6288;6296;6349:3;6337:9;6328:7;6324:23;6320:33;6317:53;;;6366:1;6363;6356:12;6317:53;6405:9;6392:23;6424:31;6449:5;6424:31;:::i;:::-;6474:5;-1:-1:-1;6531:2:1;6516:18;;6503:32;6544:31;6503:32;6544:31;:::i;:::-;6594:7;-1:-1:-1;6653:2:1;6638:18;;6625:32;6666:31;6625:32;6666:31;:::i;:::-;6716:7;-1:-1:-1;6770:2:1;6755:18;;6742:32;;-1:-1:-1;6821:3:1;6806:19;;6793:33;;-1:-1:-1;6878:3:1;6863:19;;6850:33;6892;6850;6892;:::i;:::-;6944:7;6934:17;;;6998:3;6987:9;6983:19;6970:33;6960:43;;6119:890;;;;;;;;;;:::o;7014:450::-;7101:6;7109;7117;7170:2;7158:9;7149:7;7145:23;7141:32;7138:52;;;7186:1;7183;7176:12;7138:52;7209:40;7239:9;7209:40;:::i;:::-;7199:50;;7268:49;7313:2;7302:9;7298:18;7268:49;:::i;:::-;7258:59;;7360:2;7349:9;7345:18;7339:25;7404:10;7397:5;7393:22;7386:5;7383:33;7373:61;;7430:1;7427;7420:12;7373:61;7453:5;7443:15;;;7014:450;;;;;:::o;7469:184::-;7539:6;7592:2;7580:9;7571:7;7567:23;7563:32;7560:52;;;7608:1;7605;7598:12;7560:52;-1:-1:-1;7631:16:1;;7469:184;-1:-1:-1;7469:184:1:o;7658:709::-;7771:6;7779;7787;7795;7803;7856:3;7844:9;7835:7;7831:23;7827:33;7824:53;;;7873:1;7870;7863:12;7824:53;7909:9;7896:23;7886:33;;7970:2;7959:9;7955:18;7942:32;7997:18;7989:6;7986:30;7983:50;;;8029:1;8026;8019:12;7983:50;8068:70;8130:7;8121:6;8110:9;8106:22;8068:70;:::i;:::-;8157:8;;-1:-1:-1;8042:96:1;-1:-1:-1;;8242:2:1;8227:18;;8214:32;8255:31;8214:32;8255:31;:::i;:::-;7658:709;;;;-1:-1:-1;7658:709:1;;8357:2;8342:18;8329:32;;7658:709;-1:-1:-1;;7658:709:1:o;8372:1045::-;8465:6;8473;8526:2;8514:9;8505:7;8501:23;8497:32;8494:52;;;8542:1;8539;8532:12;8494:52;8578:9;8565:23;8555:33;;8607:2;8660;8649:9;8645:18;8632:32;8687:18;8679:6;8676:30;8673:50;;;8719:1;8716;8709:12;8673:50;8742:22;;8795:4;8787:13;;8783:27;-1:-1:-1;8773:55:1;;8824:1;8821;8814:12;8773:55;8860:2;8847:16;8883:60;8899:43;8939:2;8899:43;:::i;8883:60::-;8965:3;8989:2;8984:3;8977:15;9017:2;9012:3;9008:12;9001:19;;9048:2;9044;9040:11;9096:7;9091:2;9085;9082:1;9078:10;9074:2;9070:19;9066:28;9063:41;9060:61;;;9117:1;9114;9107:12;9060:61;9139:1;9130:10;;9149:238;9163:2;9160:1;9157:9;9149:238;;;9234:3;9221:17;9251:31;9276:5;9251:31;:::i;:::-;9295:18;;9181:1;9174:9;;;;;9333:12;;;;9365;;9149:238;;;9153:3;9406:5;9396:15;;;;;;;8372:1045;;;;;:::o;10161:778::-;10283:6;10291;10299;10307;10315;10323;10376:3;10364:9;10355:7;10351:23;10347:33;10344:53;;;10393:1;10390;10383:12;10344:53;10429:9;10416:23;10406:33;;10486:2;10475:9;10471:18;10458:32;10448:42;;10541:2;10530:9;10526:18;10513:32;10568:18;10560:6;10557:30;10554:50;;;10600:1;10597;10590:12;10554:50;10639:70;10701:7;10692:6;10681:9;10677:22;10639:70;:::i;:::-;10728:8;;-1:-1:-1;10613:96:1;-1:-1:-1;;10813:2:1;10798:18;;10785:32;10826:31;10785:32;10826:31;:::i;:::-;10876:5;10866:15;;;10928:3;10917:9;10913:19;10900:33;10890:43;;10161:778;;;;;;;;:::o;11752:316::-;11829:6;11837;11845;11898:2;11886:9;11877:7;11873:23;11869:32;11866:52;;;11914:1;11911;11904:12;11866:52;-1:-1:-1;;11937:23:1;;;12007:2;11992:18;;11979:32;;-1:-1:-1;12058:2:1;12043:18;;;12030:32;;11752:316;-1:-1:-1;11752:316:1:o;12073:247::-;12141:6;12194:2;12182:9;12173:7;12169:23;12165:32;12162:52;;;12210:1;12207;12200:12;12162:52;12242:9;12236:16;12261:29;12284:5;12261:29;:::i;12325:435::-;12378:3;12416:5;12410:12;12443:6;12438:3;12431:19;12469:4;12498:2;12493:3;12489:12;12482:19;;12535:2;12528:5;12524:14;12556:1;12566:169;12580:6;12577:1;12574:13;12566:169;;;12641:13;;12629:26;;12675:12;;;;12710:15;;;;12602:1;12595:9;12566:169;;;-1:-1:-1;12751:3:1;;12325:435;-1:-1:-1;;;;;12325:435:1:o;12765:257::-;12806:3;12844:5;12838:12;12871:6;12866:3;12859:19;12887:63;12943:6;12936:4;12931:3;12927:14;12920:4;12913:5;12909:16;12887:63;:::i;:::-;13004:2;12983:15;-1:-1:-1;;12979:29:1;12970:39;;;;13011:4;12966:50;;12765:257;-1:-1:-1;;12765:257:1:o;13027:274::-;13156:3;13194:6;13188:13;13210:53;13256:6;13251:3;13244:4;13236:6;13232:17;13210:53;:::i;:::-;13279:16;;;;;13027:274;-1:-1:-1;;13027:274:1:o;14482:261::-;14661:2;14650:9;14643:21;14624:4;14681:56;14733:2;14722:9;14718:18;14710:6;14681:56;:::i;14748:342::-;14949:2;14938:9;14931:21;14912:4;14969:56;15021:2;15010:9;15006:18;14998:6;14969:56;:::i;:::-;14961:64;;15075:6;15068:14;15061:22;15056:2;15045:9;15041:18;15034:50;14748:342;;;;;:::o;15095:411::-;15338:2;15327:9;15320:21;15301:4;15358:56;15410:2;15399:9;15395:18;15387:6;15358:56;:::i;:::-;15445:2;15430:18;;15423:34;;;;-1:-1:-1;15488:2:1;15473:18;15466:34;15350:64;15095:411;-1:-1:-1;15095:411:1:o;15511:219::-;15660:2;15649:9;15642:21;15623:4;15680:44;15720:2;15709:9;15705:18;15697:6;15680:44;:::i;16085:350::-;16287:2;16269:21;;;16326:2;16306:18;;;16299:30;16365:28;16360:2;16345:18;;16338:56;16426:2;16411:18;;16085:350::o;17138:404::-;17340:2;17322:21;;;17379:2;17359:18;;;17352:30;17418:34;17413:2;17398:18;;17391:62;-1:-1:-1;;;17484:2:1;17469:18;;17462:38;17532:3;17517:19;;17138:404::o;18372:345::-;18574:2;18556:21;;;18613:2;18593:18;;;18586:30;-1:-1:-1;;;18647:2:1;18632:18;;18625:51;18708:2;18693:18;;18372:345::o;18722:352::-;18924:2;18906:21;;;18963:2;18943:18;;;18936:30;19002;18997:2;18982:18;;18975:58;19065:2;19050:18;;18722:352::o;19079:400::-;19281:2;19263:21;;;19320:2;19300:18;;;19293:30;19359:34;19354:2;19339:18;;19332:62;-1:-1:-1;;;19425:2:1;19410:18;;19403:34;19469:3;19454:19;;19079:400::o;23550:458::-;23781:6;23770:9;23763:25;23824:6;23819:2;23808:9;23804:18;23797:34;23896:1;23892;23887:3;23883:11;23879:19;23871:6;23867:32;23862:2;23851:9;23847:18;23840:60;23936:3;23931:2;23920:9;23916:18;23909:31;23744:4;23957:45;23997:3;23986:9;23982:19;23974:6;23957:45;:::i;25685:521::-;25762:4;25768:6;25828:11;25815:25;25922:2;25918:7;25907:8;25891:14;25887:29;25883:43;25863:18;25859:68;25849:96;;25941:1;25938;25931:12;25849:96;25968:33;;26020:20;;;-1:-1:-1;26063:18:1;26052:30;;26049:50;;;26095:1;26092;26085:12;26049:50;26128:4;26116:17;;-1:-1:-1;26159:14:1;26155:27;;;26145:38;;26142:58;;;26196:1;26193;26186:12;26211:322;26302:4;26360:11;26347:25;26454:2;26450:7;26439:8;26423:14;26419:29;26415:43;26395:18;26391:68;26381:96;;26473:1;26470;26463:12;26538:275;26609:2;26603:9;26674:2;26655:13;;-1:-1:-1;;26651:27:1;26639:40;;26709:18;26694:34;;26730:22;;;26691:62;26688:88;;;26756:18;;:::i;:::-;26792:2;26785:22;26538:275;;-1:-1:-1;26538:275:1:o;26818:183::-;26878:4;26911:18;26903:6;26900:30;26897:56;;;26933:18;;:::i;:::-;-1:-1:-1;26978:1:1;26974:14;26990:4;26970:25;;26818:183::o;27006:128::-;27046:3;27077:1;27073:6;27070:1;27067:13;27064:39;;;27083:18;;:::i;:::-;-1:-1:-1;27119:9:1;;27006:128::o;27139:217::-;27179:1;27205;27195:132;;27249:10;27244:3;27240:20;27237:1;27230:31;27284:4;27281:1;27274:15;27312:4;27309:1;27302:15;27195:132;-1:-1:-1;27341:9:1;;27139:217::o;27361:168::-;27401:7;27467:1;27463;27459:6;27455:14;27452:1;27449:21;27444:1;27437:9;27430:17;27426:45;27423:71;;;27474:18;;:::i;:::-;-1:-1:-1;27514:9:1;;27361:168::o;27534:125::-;27574:4;27602:1;27599;27596:8;27593:34;;;27607:18;;:::i;:::-;-1:-1:-1;27644:9:1;;27534:125::o;27664:258::-;27736:1;27746:113;27760:6;27757:1;27754:13;27746:113;;;27836:11;;;27830:18;27817:11;;;27810:39;27782:2;27775:10;27746:113;;;27877:6;27874:1;27871:13;27868:48;;;-1:-1:-1;;27912:1:1;27894:16;;27887:27;27664:258::o;27927:136::-;27966:3;27994:5;27984:39;;28003:18;;:::i;:::-;-1:-1:-1;;;28039:18:1;;27927:136::o;28068:135::-;28107:3;-1:-1:-1;;28128:17:1;;28125:43;;;28148:18;;:::i;:::-;-1:-1:-1;28195:1:1;28184:13;;28068:135::o;28208:127::-;28269:10;28264:3;28260:20;28257:1;28250:31;28300:4;28297:1;28290:15;28324:4;28321:1;28314:15;28340:127;28401:10;28396:3;28392:20;28389:1;28382:31;28432:4;28429:1;28422:15;28456:4;28453:1;28446:15;28472:127;28533:10;28528:3;28524:20;28521:1;28514:31;28564:4;28561:1;28554:15;28588:4;28585:1;28578:15;28604:131;-1:-1:-1;;;;;28679:31:1;;28669:42;;28659:70;;28725:1;28722;28715:12;28659:70;28604:131;:::o;28740:118::-;28826:5;28819:13;28812:21;28805:5;28802:32;28792:60;;28848:1;28845;28838:12;28863:114;28947:4;28940:5;28936:16;28929:5;28926:27;28916:55;;28967:1;28964;28957:12
Swarm Source
ipfs://c1b9b93b5890006555202f0f9817bdfdb929081c6e0bd36a86da4a459b66c443
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.