Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 91 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact S For... | 5359329 | 4 hrs ago | IN | 2 S | 0.00780461 | ||||
Add Liquidity S | 5349026 | 6 hrs ago | IN | 0.99845578 S | 0.011759 | ||||
Swap Exact S For... | 5348948 | 6 hrs ago | IN | 1 S | 0.00780461 | ||||
Add Liquidity S | 5344151 | 7 hrs ago | IN | 810.86676495 S | 0.01157091 | ||||
Swap Exact S For... | 5257351 | 26 hrs ago | IN | 27 S | 0.00685305 | ||||
Swap Exact S For... | 5233045 | 31 hrs ago | IN | 3 S | 0.00780395 | ||||
Swap Exact Token... | 5137987 | 47 hrs ago | IN | 0 S | 0.00752812 | ||||
Swap Exact Token... | 5046979 | 2 days ago | IN | 0 S | 0.00948097 | ||||
Add Liquidity S | 5031290 | 2 days ago | IN | 0.3 S | 0.01162545 | ||||
Swap Exact Token... | 4879229 | 3 days ago | IN | 0 S | 0.00815391 | ||||
Swap Exact S For... | 4855543 | 3 days ago | IN | 20 S | 0.00817019 | ||||
Swap Exact S For... | 4753580 | 4 days ago | IN | 28 S | 0.00780461 | ||||
Swap Exact Token... | 4720159 | 4 days ago | IN | 0 S | 0.0189585 | ||||
Swap Exact Token... | 4719418 | 4 days ago | IN | 0 S | 0.01217906 | ||||
Swap Exact S For... | 4692890 | 5 days ago | IN | 0.1 S | 0.00908809 | ||||
Swap Exact S For... | 4462561 | 6 days ago | IN | 0.1 S | 0.01090174 | ||||
Swap Exact S For... | 4458789 | 6 days ago | IN | 0.02 S | 0.00908809 | ||||
Swap Exact Token... | 4454734 | 6 days ago | IN | 0 S | 0.00752614 | ||||
Swap Exact S For... | 4454623 | 6 days ago | IN | 2 S | 0.00780395 | ||||
Swap Exact S For... | 4314618 | 7 days ago | IN | 5 S | 0.00825363 | ||||
Swap Exact S For... | 4312254 | 7 days ago | IN | 0.01 S | 0.00963759 | ||||
Swap Exact Token... | 4311896 | 7 days ago | IN | 0 S | 0.00686345 | ||||
Swap S For Exact... | 4311843 | 7 days ago | IN | 0.03280784 S | 0.00666138 | ||||
Swap Exact S For... | 4298266 | 7 days ago | IN | 3 S | 0.01650726 | ||||
Add Liquidity S | 4298241 | 7 days ago | IN | 45 S | 0.02400409 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5359329 | 4 hrs ago | 2 S | ||||
5349026 | 6 hrs ago | 0.99845578 S | ||||
5348948 | 6 hrs ago | 1 S | ||||
5344151 | 7 hrs ago | 810.86676495 S | ||||
5257351 | 26 hrs ago | 27 S | ||||
5233045 | 31 hrs ago | 3 S | ||||
5137987 | 47 hrs ago | 163.2276015 S | ||||
5137987 | 47 hrs ago | 163.2276015 S | ||||
5046979 | 2 days ago | 7.3710251 S | ||||
5046979 | 2 days ago | 7.3710251 S | ||||
5031290 | 2 days ago | 0.00000058 S | ||||
5031290 | 2 days ago | 0.29999941 S | ||||
4879229 | 3 days ago | 2.48452764 S | ||||
4879229 | 3 days ago | 2.48452764 S | ||||
4855543 | 3 days ago | 20 S | ||||
4753580 | 4 days ago | 28 S | ||||
4720159 | 4 days ago | 8.70177913 S | ||||
4720159 | 4 days ago | 8.70177913 S | ||||
4719418 | 4 days ago | 48.34626054 S | ||||
4719418 | 4 days ago | 48.34626054 S | ||||
4692890 | 5 days ago | 0.1 S | ||||
4462561 | 6 days ago | 0.1 S | ||||
4458789 | 6 days ago | 0.02 S | ||||
4454734 | 6 days ago | 1.99281037 S | ||||
4454734 | 6 days ago | 1.99281037 S |
Loading...
Loading
Contract Name:
DeFiveRouter
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; import { IDeFiveFactory } from "./interfaces/IDeFiveFactory.sol"; import { IDeFiveRouter } from "./interfaces/IDeFiveRouter.sol"; import { IDeFivePair } from "./interfaces/IDeFivePair.sol"; import { IDeFiveToken } from "./interfaces/IDeFiveToken.sol"; import { IWS } from "./interfaces/IWS.sol"; import { TransferHelper } from "./libraries/TransferHelper.sol"; import { DeFiveLibrary } from "./libraries/DeFiveLibrary.sol"; contract DeFiveRouter is IDeFiveRouter { address public immutable override factory; address public immutable override wS; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "DeFiveRouter: EXPIRED"); _; } constructor(address _factory, address _wS) { factory = _factory; wS = _wS; } receive() external payable { assert(msg.sender == wS); // only accept S via fallback from the wS contract } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IDeFiveFactory(factory).getPair(tokenA, tokenB) == address(0)) { IDeFiveFactory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = DeFiveLibrary.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = DeFiveLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "DeFiveRouter: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = DeFiveLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "DeFiveRouter: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = DeFiveLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IDeFivePair(pair).mint(to); } function addLiquidityS( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountS, uint256 liquidity) { (amountToken, amountS) = _addLiquidity(token, wS, amountTokenDesired, msg.value, amountTokenMin, amountSMin); address pair = DeFiveLibrary.pairFor(factory, token, wS); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWS(wS).deposit{ value: amountS }(); assert(IWS(wS).transfer(pair, amountS)); liquidity = IDeFivePair(pair).mint(to); // refund dust S, if any if (msg.value > amountS) TransferHelper.safeTransferS(msg.sender, msg.value - amountS); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = DeFiveLibrary.pairFor(factory, tokenA, tokenB); IDeFivePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint256 amount0, uint256 amount1) = IDeFivePair(pair).burn(to); (address token0, ) = DeFiveLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "DeFiveRouter: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "DeFiveRouter: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityS( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountS) { (amountToken, amountS) = removeLiquidity( token, wS, liquidity, amountTokenMin, amountSMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWS(wS).withdraw(amountS); TransferHelper.safeTransferS(to, amountS); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountA, uint256 amountB) { address pair = DeFiveLibrary.pairFor(factory, tokenA, tokenB); uint256 value = approveMax ? type(uint256).max : liquidity; // Use permit to allow the router to spend liquidity tokens IDeFivePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); // Call standard removeLiquidity function (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquiditySWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountToken, uint256 amountS) { address pair = DeFiveLibrary.pairFor(factory, token, wS); uint256 value = approveMax ? type(uint256).max : liquidity; // Use permit to allow the router to spend liquidity tokens IDeFivePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); // Call standard removeLiquidityS function (amountToken, amountS) = removeLiquidityS(token, liquidity, amountTokenMin, amountSMin, to, deadline); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquiditySSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountS) { (, amountS) = removeLiquidity(token, wS, liquidity, amountTokenMin, amountSMin, address(this), deadline); TransferHelper.safeTransfer(token, to, IDeFiveToken(token).balanceOf(address(this))); IWS(wS).withdraw(amountS); TransferHelper.safeTransferS(to, amountS); } function removeLiquiditySWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint256 amountS) { address pair = DeFiveLibrary.pairFor(factory, token, wS); uint256 value = approveMax ? type(uint256).max : liquidity; IDeFivePair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); amountS = removeLiquiditySSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountSMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = DeFiveLibrary.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 ? DeFiveLibrary.pairFor(factory, output, path[i + 2]) : _to; IDeFivePair(DeFiveLibrary.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 virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = DeFiveLibrary.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.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 virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = DeFiveLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "DeFiveRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactSForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == wS, "DeFiveRouter: INVALID_PATH"); amounts = DeFiveLibrary.getAmountsOut(factory, msg.value, path); require(amounts[amounts.length - 1] >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT"); IWS(wS).deposit{ value: amounts[0] }(); assert(IWS(wS).transfer(DeFiveLibrary.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); } function swapTokensForExactS( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == wS, "DeFiveRouter: INVALID_PATH"); amounts = DeFiveLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, "DeFiveRouter: EXCESSIVE_INPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWS(wS).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferS(to, amounts[amounts.length - 1]); } function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == wS, "DeFiveRouter: INVALID_PATH"); amounts = DeFiveLibrary.getAmountsOut(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT"); TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWS(wS).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferS(to, amounts[amounts.length - 1]); } function swapSForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == wS, "DeFiveRouter: INVALID_PATH"); amounts = DeFiveLibrary.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, "DeFiveRouter: EXCESSIVE_INPUT_AMOUNT"); IWS(wS).deposit{ value: amounts[0] }(); assert(IWS(wS).transfer(DeFiveLibrary.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); // refund dust S, if any if (msg.value > amounts[0]) TransferHelper.safeTransferS(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = DeFiveLibrary.sortTokens(input, output); IDeFivePair pair = IDeFivePair(DeFiveLibrary.pairFor(factory, input, output)); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IDeFiveToken(input).balanceOf(address(pair)) - reserveInput; amountOutput = DeFiveLibrary.getAmountOut(amountInput, reserveInput, reserveOutput); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? DeFiveLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IDeFiveToken(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IDeFiveToken(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactSForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { require(path[0] == wS, "DeFiveRouter: INVALID_PATH"); uint256 amountIn = msg.value; IWS(wS).deposit{ value: amountIn }(); assert(IWS(wS).transfer(DeFiveLibrary.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = IDeFiveToken(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IDeFiveToken(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForSSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == wS, "DeFiveRouter: INVALID_PATH"); TransferHelper.safeTransferFrom( path[0], msg.sender, DeFiveLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IDeFiveToken(wS).balanceOf(address(this)); require(amountOut >= amountOutMin, "DeFiveRouter: INSUFFICIENT_OUTPUT_AMOUNT"); IWS(wS).withdraw(amountOut); TransferHelper.safeTransferS(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) public pure virtual override returns (uint256 amountB) { return DeFiveLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountOut) { return DeFiveLibrary.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) public pure virtual override returns (uint256 amountIn) { return DeFiveLibrary.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut( uint256 amountIn, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return DeFiveLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn( uint256 amountOut, address[] memory path ) public view virtual override returns (uint256[] memory amounts) { return DeFiveLibrary.getAmountsIn(factory, amountOut, path); } }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IDeFiveFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint256); event SetFeeToDevs(address indexed sender, address indexed feeToDevs); event SetFeeToGbm(address indexed sender, address indexed feeToGbm); event SetFeeToDevsSetter(address indexed sender, address indexed feeToDevsSetter); event SetFeeToGbmSetter(address indexed sender, address indexed feeToGbmSetter); function feeToDevs() external view returns (address); function feeToGbm() external view returns (address); function feeToDevsSetter() external view returns (address); function feeToGbmSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeToDevs(address _feeToDevs) external; function setFeeToGbm(address _feeToGbm) external; function setFeeToDevsSetter(address _feeToDevsSetter) external; function setFeeToGbmSetter(address _feeToGbmSetter) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; import { IDeFiveToken } from "./IDeFiveToken.sol"; interface IDeFivePair is IDeFiveToken { 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; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IDeFiveRouter { function factory() external view returns (address); function wS() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity); function addLiquidityS( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external payable returns (uint256 amountToken, uint256 amountS, uint256 liquidity); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityS( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountS); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquiditySWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountS); 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 swapExactSForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactS( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapSForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) external pure returns (uint256 amountB); 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[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function removeLiquiditySSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline ) external returns (uint256 amountS); function removeLiquiditySWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountSMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountS); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactSForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForSSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IDeFiveToken { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; interface IWS { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; import { IDeFivePair } from "../interfaces/IDeFivePair.sol"; library DeFiveLibrary { // Returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, "DeFiveLibrary: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "DeFiveLibrary: ZERO_ADDRESS"); } // Calculates the CREATE2 address for a pair without making any external calls function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint160( uint256( keccak256( abi.encodePacked( bytes1(0xff), factory, keccak256(abi.encodePacked(token0, token1)), hex"a2bd630981c20599e374cdb7af13220e18e2422c7dde970eff313f36d739c801" // init code hash ) ) ) ) ); } // Fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IDeFivePair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // Given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) { require(amountA > 0, "DeFiveLibrary: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "DeFiveLibrary: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * reserveB) / reserveA; } // 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, "DeFiveLibrary: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "DeFiveLibrary: INSUFFICIENT_LIQUIDITY"); uint256 amountInWithFee = amountIn * 9982; // 0.018% fee amountOut = (amountInWithFee * reserveOut) / (reserveIn * 10000 + amountInWithFee); } // 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, "DeFiveLibrary: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "DeFiveLibrary: INSUFFICIENT_LIQUIDITY"); amountIn = (reserveIn * amountOut * 10000) / ((reserveOut - amountOut) * 9982) + 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) { uint256 length = path.length; require(length >= 2, "DeFiveLibrary: INVALID_PATH"); amounts = new uint256[](length); amounts[0] = amountIn; for (uint256 i = 0; i < length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // Performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { uint256 length = path.length; require(length >= 2, "DeFiveLibrary: INVALID_PATH"); amounts = new uint256[](length); amounts[length - 1] = amountOut; for (uint256 i = length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
// SPDX-License-Identifier: MIT pragma solidity =0.8.4; // helper methods for interacting with tokens and sending S that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper: APPROVE_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: TRANSFER_FAILED"); } 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: TRANSFER_FROM_FAILED"); } function safeTransferS(address to, uint256 value) internal { (bool success, ) = to.call{ value: value }(new bytes(0)); require(success, "TransferHelper: S_TRANSFER_FAILED"); } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wS","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityS","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","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":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityS","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquiditySSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquiditySWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountSMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquiditySWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountS","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","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":"swapExactSForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"swapExactSForTokensSupportingFeeOnTransferTokens","outputs":[],"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":"swapExactTokensForS","outputs":[{"internalType":"uint256[]","name":"amounts","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":"swapExactTokensForSSupportingFeeOnTransferTokens","outputs":[],"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"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":"swapSForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","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":"swapTokensForExactS","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"},{"inputs":[],"name":"wS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200513038038062005130833981016040819052620000349162000070565b6001600160601b0319606092831b8116608052911b1660a052620000a7565b80516001600160a01b03811681146200006b57600080fd5b919050565b6000806040838503121562000083578182fd5b6200008e8362000053565b91506200009e6020840162000053565b90509250929050565b60805160601c60a05160601c614ef16200023f6000396000818161019f0152818161044f01528181610569015281816106d6015281816107cf015281816108a501528181610b9501528181610e1a01528181610fda0152818161107601528181611257015281816115600152818161161b0152818161168f01528181611a8001528181611ae801528181611bbe01528181611c1401528181611c4801528181611cf601528181612119015281816122cc0152818161236801528181612a0001528181612b4801528181612c710152612ebf01526000818161049b015281816105470152818161095f01528181610a9601528181610c8c01528181610cc301528181610ed3015281816110a801528181611235015281816113a5015281816116c101528181611bf201528181611edf015281816121d20152818161239a015281816125ac0152818161270c01528181612ce601528181612d7c01528181612f7901528181613962015281816139c001528181613cee01528181613edc01528181613ff8015281816140c301526141490152614ef16000f3fe60806040526004361061018f5760003560e01c80635c11d795116100d6578063bf7e14d91161007f578063d06ca61f11610059578063d06ca61f146104dd578063e8e33700146104fd578063ee2b38361461051d57600080fd5b8063bf7e14d91461043d578063c45a015514610489578063c8fd02a8146104bd57600080fd5b80638803dbee116100b05780638803dbee146103dd578063ad615dec146103fd578063baa2abde1461041d57600080fd5b80635c11d7951461038a5780637ae0a825146103aa57806385f8c259146103bd57600080fd5b80632a1f3f86116101385780633e0d80e5116101125780633e0d80e51461032957806344d2f1821461033c57806349bdd8111461035c57600080fd5b80632a1f3f86146102d65780632c1baa33146102e957806338ed17391461030957600080fd5b80631dd3621b116101695780631dd3621b146102695780631f00ca74146102965780632195995c146102b657600080fd5b806304b4d269146101e1578063054d50d41461021b57806309d669051461024957600080fd5b366101dc57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149cb565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614ccc565b610663565b604051908152602001610212565b34801561025557600080fd5b5061023b61026436600461496e565b610678565b34801561027557600080fd5b50610289610284366004614c5b565b610848565b6040516102129190614d13565b3480156102a257600080fd5b506102896102b1366004614b47565b610c85565b3480156102c257600080fd5b506102016102d136600461484a565b610cb9565b6102896102e4366004614ae2565b610dc5565b3480156102f557600080fd5b5061023b6103043660046149cb565b61122d565b34801561031557600080fd5b50610289610324366004614c5b565b61134d565b6101da610337366004614ae2565b61150d565b34801561034857600080fd5b5061020161035736600461496e565b611a26565b61036f61036a36600461496e565b611b62565b60408051938452602084019290925290820152606001610212565b34801561039657600080fd5b506101da6103a5366004614c5b565b611e4f565b6102896103b8366004614ae2565b6120c4565b3480156103c957600080fd5b5061023b6103d8366004614ccc565b612547565b3480156103e957600080fd5b506102896103f8366004614c5b565b612554565b34801561040957600080fd5b5061023b610418366004614ccc565b6126a4565b34801561042957600080fd5b506102016104383660046147d9565b6126b1565b34801561044957600080fd5b506104717f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610212565b34801561049557600080fd5b506104717f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c957600080fd5b506101da6104d8366004614c5b565b6129a5565b3480156104e957600080fd5b506102896104f8366004614b47565b612cdf565b34801561050957600080fd5b5061036f6105183660046148f3565b612d0c565b34801561052957600080fd5b50610289610538366004614c5b565b612e62565b600080600061058d7f00000000000000000000000000000000000000000000000000000000000000008e7f000000000000000000000000000000000000000000000000000000000000000061307e565b905060008761059c578c6105a0565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561062857600080fd5b505af115801561063c573d6000803e3d6000fd5b5050505061064e8e8e8e8e8e8e611a26565b909f909e509c50505050505050505050505050565b600061067084848461318b565b949350505050565b600081428110156106d05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6106ff887f000000000000000000000000000000000000000000000000000000000000000089898930896126b1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506107a09150899086906001600160a01b038316906370a082319060240160206040518083038186803b15801561076357600080fd5b505afa158015610777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079b9190614aca565b6132c8565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561081b57600080fd5b505af115801561082f573d6000803e3d6000fd5b5050505061083d8483613411565b509695505050505050565b6060814281101561089b5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866108d2600182614e1d565b8181106108ef57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061090491906147a1565b6001600160a01b03161461095a5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b6109b87f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b915086826000815181106109dc57634e487b7160e01b600052603260045260246000fd5b60200260200101511115610a575760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b610b5486866000818110610a7b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a9091906147a1565b33610b267f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610ad657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610aeb91906147a1565b8b8b6001818110610b0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b2191906147a1565b61307e565b85600081518110610b4757634e487b7160e01b600052603260045260246000fd5b60200260200101516136de565b610b9382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613855915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610bd19190614e1d565b81518110610bef57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c1591815260200190565b600060405180830381600087803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b5050505061083d848360018551610c5a9190614e1d565b81518110610c7857634e487b7160e01b600052603260045260246000fd5b6020026020010151613411565b6060610cb27f000000000000000000000000000000000000000000000000000000000000000084846134f9565b9392505050565b6000806000610ce97f00000000000000000000000000000000000000000000000000000000000000008f8f61307e565b9050600087610cf8578c610cfc565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b50505050610dab8f8f8f8f8f8f8f6126b1565b809450819550505050509b509b9950505050505050505050565b60608142811015610e185760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110610e6357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e7891906147a1565b6001600160a01b031614610ece5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b610f2c7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b9150868260018451610f3e9190614e1d565b81518110610f5c57634e487b7160e01b600052603260045260246000fd5b60200260200101511015610fd85760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061102857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61111e7f0000000000000000000000000000000000000000000000000000000000000000898960008181106110e857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110fd91906147a1565b8a8a6001818110610b0c57634e487b7160e01b600052603260045260246000fd5b8460008151811061113f57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016111789291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ca9190614a60565b6111e457634e487b7160e01b600052600160045260246000fd5b61122382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b5095945050505050565b60008061127b7f00000000000000000000000000000000000000000000000000000000000000008d7f000000000000000000000000000000000000000000000000000000000000000061307e565b905060008661128a578b61128e565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b5050505061133c8d8d8d8d8d8d610678565b9d9c50505050505050505050505050565b606081428110156113a05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6113fe7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b91508682600184516114109190614e1d565b8151811061142e57634e487b7160e01b600052603260045260246000fd5b602002602001015110156114aa5760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6114ce86866000818110610a7b57634e487b7160e01b600052603260045260246000fd5b61083d82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b804281101561155e5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106115a957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115be91906147a1565b6001600160a01b0316146116145760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561167457600080fd5b505af1158015611688573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6117017f0000000000000000000000000000000000000000000000000000000000000000898960008181106110e857634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117999190614a60565b6117b357634e487b7160e01b600052600160045260246000fd5b600086866117c2600182614e1d565b8181106117df57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117f491906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561185057600080fd5b505afa158015611864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118889190614aca565b90506118c8878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c5d915050565b878188886118d7600182614e1d565b8181106118f457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061190991906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024015b60206040518083038186803b15801561196657600080fd5b505afa15801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190614aca565b6119a89190614e1d565b1015611a1c5760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b5050505050505050565b6000808242811015611a7a5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611aa9897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6126b1565b9093509150611ab98986856132c8565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b3457600080fd5b505af1158015611b48573d6000803e3d6000fd5b50505050611b568583613411565b50965096945050505050565b60008060008342811015611bb85760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611be68a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613fb1565b90945092506000611c387f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061307e565b9050611c468b3383886136de565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ca157600080fd5b505af1158015611cb5573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb92506044019050602060405180830381600087803b158015611d3e57600080fd5b505af1158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190614a60565b611d9057634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611dec57600080fd5b505af1158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190614aca565b925083341115611e4157611e4133611e3c8634614e1d565b613411565b505096509650969350505050565b8042811015611ea05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611f2585856000818110611ec457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ed991906147a1565b33611f1f7f0000000000000000000000000000000000000000000000000000000000000000898960008181106110e857634e487b7160e01b600052603260045260246000fd5b8a6136de565b60008585611f34600182614e1d565b818110611f5157634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f6691906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffa9190614aca565b905061203a868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c5d915050565b86818787612049600182614e1d565b81811061206657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061207b91906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a082319060240161194e565b606081428110156121175760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061216257634e487b7160e01b600052603260045260246000fd5b905060200201602081019061217791906147a1565b6001600160a01b0316146121cd5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b61222b7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b9150348260008151811061224f57634e487b7160e01b600052603260045260246000fd5b602002602001015111156122ca5760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061231a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123da7f0000000000000000000000000000000000000000000000000000000000000000898960008181106110e857634e487b7160e01b600052603260045260246000fd5b846000815181106123fb57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016124349291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561244e57600080fd5b505af1158015612462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124869190614a60565b6124a057634e487b7160e01b600052600160045260246000fd5b6124df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b8160008151811061250057634e487b7160e01b600052603260045260246000fd5b602002602001015134111561122357611223338360008151811061253457634e487b7160e01b600052603260045260246000fd5b602002602001015134611e3c9190614e1d565b60006106708484846142e0565b606081428110156125a75760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6126057f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b9150868260008151811061262957634e487b7160e01b600052603260045260246000fd5b602002602001015111156114aa5760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b600061067084848461441a565b60008082428110156127055760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b60006127327f00000000000000000000000000000000000000000000000000000000000000008c8c61307e565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561279c57600080fd5b505af11580156127b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d49190614a60565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561283557600080fd5b505af1158015612849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286d9190614c38565b91509150600061287d8e8e614528565b509050806001600160a01b03168e6001600160a01b0316146128a05781836128a3565b82825b90975095508a87101561291e5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b898610156129945760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050505097509795505050505050565b80428110156129f65760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585612a2d600182614e1d565b818110612a4a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612a5f91906147a1565b6001600160a01b031614612ab55760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b612ad985856000818110611ec457634e487b7160e01b600052603260045260246000fd5b612b17858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c5d915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015612b9257600080fd5b505afa158015612ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bca9190614aca565b905086811015612c425760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612cbd57600080fd5b505af1158015612cd1573d6000803e3d6000fd5b50505050611a1c8482613411565b6060610cb27f00000000000000000000000000000000000000000000000000000000000000008484613a95565b60008060008342811015612d625760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b612d708c8c8c8c8c8c613fb1565b90945092506000612da27f00000000000000000000000000000000000000000000000000000000000000008e8e61307e565b9050612db08d3383886136de565b612dbc8c3383876136de565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e509190614aca565b92505050985098509895505050505050565b60608142811015612eb55760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686612eec600182614e1d565b818110612f0957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612f1e91906147a1565b6001600160a01b031614612f745760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b612fd27f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b9150868260018451612fe49190614e1d565b8151811061300257634e487b7160e01b600052603260045260246000fd5b60200260200101511015610a575760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b600080600061308d8585614528565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527fa2bd630981c20599e374cdb7af13220e18e2422c7dde970eff313f36d739c801609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008084116132025760405162461bcd60e51b815260206004820152602860248201527f4465466976654c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156132125750600082115b6132845760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000613292856126fe614dfe565b9050806132a185612710614dfe565b6132ab9190614dc6565b6132b58483614dfe565b6132bf9190614dde565b95945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133529190614cf7565b6000604051808303816000865af19150503d806000811461338f576040519150601f19603f3d011682016040523d82523d6000602084013e613394565b606091505b50915091508180156133be5750805115806133be5750808060200190518101906133be9190614a60565b61340a5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106c7565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161343b9190614cf7565b60006040518083038185875af1925050503d8060008114613478576040519150601f19603f3d011682016040523d82523d6000602084013e61347d565b606091505b50509050806134f45760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657248656c7065723a20535f5452414e534645525f4641494c4560448201527f440000000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050565b8051606090600281101561354f5760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a20494e56414c49445f50415448000000000060448201526064016106c7565b8067ffffffffffffffff81111561357657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561359f578160200160208202803683370190505b50915083826135af600184614e1d565b815181106135cd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015260006135e5600183614e1d565b90505b80156136d5576000806136548887613601600187614e1d565b8151811061361f57634e487b7160e01b600052603260045260246000fd5b602002602001015188868151811061364757634e487b7160e01b600052603260045260246000fd5b6020026020010151614638565b9150915061368a85848151811061367b57634e487b7160e01b600052603260045260246000fd5b602002602001015183836142e0565b85613696600186614e1d565b815181106136b457634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806136cd90614e60565b9150506135e8565b50509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916137709190614cf7565b6000604051808303816000865af19150503d80600081146137ad576040519150601f19603f3d011682016040523d82523d6000602084013e6137b2565b606091505b50915091508180156137dc5750805115806137dc5750808060200190518101906137dc9190614a60565b61384d5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050505050565b60005b600183516138669190614e1d565b811015613a8f5760008084838151811061389057634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138a69190614dc6565b815181106138c457634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006138dc8383614528565b5090506000876138ed866001614dc6565b8151811061390b57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139395782600061393d565b6000835b91509150600060028a516139519190614e1d565b881061395d57886139b9565b6139b97f0000000000000000000000000000000000000000000000000000000000000000878c61398e8c6002614dc6565b815181106139ac57634e487b7160e01b600052603260045260246000fd5b602002602001015161307e565b90506139e67f0000000000000000000000000000000000000000000000000000000000000000888861307e565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a23576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a439493929190614d57565b600060405180830381600087803b158015613a5d57600080fd5b505af1158015613a71573d6000803e3d6000fd5b50505050505050505050508080613a8790614e77565b915050613858565b50505050565b80516060906002811015613aeb5760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a20494e56414c49445f50415448000000000060448201526064016106c7565b8067ffffffffffffffff811115613b1257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b3b578160200160208202803683370190505b5091508382600081518110613b6057634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b613b7a600183614e1d565b8110156136d557600080613bdc88878581518110613ba857634e487b7160e01b600052603260045260246000fd5b602002602001015188866001613bbe9190614dc6565b8151811061364757634e487b7160e01b600052603260045260246000fd5b91509150613c12858481518110613c0357634e487b7160e01b600052603260045260246000fd5b6020026020010151838361318b565b85613c1e856001614dc6565b81518110613c3c57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c5590614e77565b915050613b6f565b60005b60018351613c6e9190614e1d565b8110156134f457600080848381518110613c9857634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613cae9190614dc6565b81518110613ccc57634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613ce48383614528565b5090506000613d147f0000000000000000000000000000000000000000000000000000000000000000858561307e565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d5557600080fd5b505afa158015613d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8d9190614a7c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613dd5578284613dd8565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e3a57600080fd5b505afa158015613e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e729190614aca565b613e7c9190614e1d565b9550613e8986838361318b565b945050505050600080856001600160a01b0316886001600160a01b031614613eb357826000613eb7565b6000835b91509150600060028c51613ecb9190614e1d565b8a10613ed7578a613f08565b613f087f0000000000000000000000000000000000000000000000000000000000000000898e61398e8e6002614dc6565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f639086908690869060248101614d57565b600060405180830381600087803b158015613f7d57600080fd5b505af1158015613f91573d6000803e3d6000fd5b505050505050505050505050508080613fa990614e77565b915050613c60565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b15801561403c57600080fd5b505afa158015614050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407491906147bd565b6001600160a01b03161415614141576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c6539690604401602060405180830381600087803b15801561410757600080fd5b505af115801561411b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413f91906147bd565b505b60008061416f7f00000000000000000000000000000000000000000000000000000000000000008b8b614638565b91509150816000148015614181575080155b15614191578793508692506142d3565b600061419e89848461441a565b9050878111614228578581101561421d5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b8894509250826142d1565b600061423589848661441a565b90508981111561425557634e487b7160e01b600052600160045260246000fd5b878110156142cb5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b94508793505b505b5050965096945050505050565b60008084116143575760405162461bcd60e51b815260206004820152602960248201527f4465466976654c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e54000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156143675750600082115b6143d95760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b6143e38483614e1d565b6143ef906126fe614dfe565b6143f98585614dfe565b61440590612710614dfe565b61440f9190614dde565b610670906001614dc6565b60008084116144915760405162461bcd60e51b815260206004820152602260248201527f4465466976654c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e5400000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156144a15750600082115b6145135760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b8261451e8386614dfe565b6106709190614dde565b600080826001600160a01b0316846001600160a01b031614156145b35760405162461bcd60e51b815260206004820152602260248201527f4465466976654c6962726172793a204944454e544943414c5f4144445245535360448201527f455300000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b826001600160a01b0316846001600160a01b0316106145d35782846145d6565b83835b90925090506001600160a01b0382166146315760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a205a45524f5f41444452455353000000000060448201526064016106c7565b9250929050565b60008060006146478585614528565b50905060008061465888888861307e565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561469057600080fd5b505afa1580156146a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c89190614a7c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461470d578082614710565b81815b90999098509650505050505050565b803561472a81614ebe565b919050565b60008083601f840112614740578081fd5b50813567ffffffffffffffff811115614757578182fd5b6020830191508360208260051b850101111561463157600080fd5b80516dffffffffffffffffffffffffffff8116811461472a57600080fd5b803560ff8116811461472a57600080fd5b6000602082840312156147b2578081fd5b8135610cb281614ebe565b6000602082840312156147ce578081fd5b8151610cb281614ebe565b600080600080600080600060e0888a0312156147f3578283fd5b87356147fe81614ebe565b9650602088013561480e81614ebe565b955060408801359450606088013593506080880135925060a088013561483381614ebe565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e03121561486b578384fd5b8b3561487681614ebe565b9a5060208c013561488681614ebe565b995060408c0135985060608c0135975060808c0135965060a08c01356148ab81614ebe565b955060c08c0135945060e08c01356148c281614ed6565b93506148d16101008d01614790565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b03121561490f578384fd5b883561491a81614ebe565b9750602089013561492a81614ebe565b965060408901359550606089013594506080890135935060a0890135925060c089013561495681614ebe565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215614986578182fd5b863561499181614ebe565b955060208701359450604087013593506060870135925060808701356149b681614ebe565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d0312156149ea578384fd5b8a356149f581614ebe565b995060208b0135985060408b0135975060608b0135965060808b0135614a1a81614ebe565b955060a08b0135945060c08b0135614a3181614ed6565b9350614a3f60e08c01614790565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614a71578081fd5b8151610cb281614ed6565b600080600060608486031215614a90578081fd5b614a9984614772565b9250614aa760208501614772565b9150604084015163ffffffff81168114614abf578182fd5b809150509250925092565b600060208284031215614adb578081fd5b5051919050565b600080600080600060808688031215614af9578283fd5b85359450602086013567ffffffffffffffff811115614b16578384fd5b614b228882890161472f565b9095509350506040860135614b3681614ebe565b949793965091946060013592915050565b60008060408385031215614b59578182fd5b8235915060208084013567ffffffffffffffff80821115614b78578384fd5b818601915086601f830112614b8b578384fd5b813581811115614b9d57614b9d614ea8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614be057614be0614ea8565b604052828152858101935084860182860187018b1015614bfe578788fd5b8795505b83861015614c2757614c138161471f565b855260019590950194938601938601614c02565b508096505050505050509250929050565b60008060408385031215614c4a578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614c73578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614c97578485fd5b614ca389828a0161472f565b9095509350506060870135614cb781614ebe565b80925050608087013590509295509295509295565b600080600060608486031215614ce0578081fd5b505081359360208301359350604090920135919050565b60008251614d09818460208701614e34565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d4b57835183529284019291840191600101614d2f565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614d918160a0850160208701614e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614dd957614dd9614e92565b500190565b600082614df957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e1857614e18614e92565b500290565b600082821015614e2f57614e2f614e92565b500390565b60005b83811015614e4f578181015183820152602001614e37565b83811115613a8f5750506000910152565b600081614e6f57614e6f614e92565b506000190190565b6000600019821415614e8b57614e8b614e92565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614ed357600080fd5b50565b8015158114614ed357600080fdfea164736f6c6343000804000a00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x60806040526004361061018f5760003560e01c80635c11d795116100d6578063bf7e14d91161007f578063d06ca61f11610059578063d06ca61f146104dd578063e8e33700146104fd578063ee2b38361461051d57600080fd5b8063bf7e14d91461043d578063c45a015514610489578063c8fd02a8146104bd57600080fd5b80638803dbee116100b05780638803dbee146103dd578063ad615dec146103fd578063baa2abde1461041d57600080fd5b80635c11d7951461038a5780637ae0a825146103aa57806385f8c259146103bd57600080fd5b80632a1f3f86116101385780633e0d80e5116101125780633e0d80e51461032957806344d2f1821461033c57806349bdd8111461035c57600080fd5b80632a1f3f86146102d65780632c1baa33146102e957806338ed17391461030957600080fd5b80631dd3621b116101695780631dd3621b146102695780631f00ca74146102965780632195995c146102b657600080fd5b806304b4d269146101e1578063054d50d41461021b57806309d669051461024957600080fd5b366101dc57336001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816146101da57634e487b7160e01b600052600160045260246000fd5b005b600080fd5b3480156101ed57600080fd5b506102016101fc3660046149cb565b61053d565b604080519283526020830191909152015b60405180910390f35b34801561022757600080fd5b5061023b610236366004614ccc565b610663565b604051908152602001610212565b34801561025557600080fd5b5061023b61026436600461496e565b610678565b34801561027557600080fd5b50610289610284366004614c5b565b610848565b6040516102129190614d13565b3480156102a257600080fd5b506102896102b1366004614b47565b610c85565b3480156102c257600080fd5b506102016102d136600461484a565b610cb9565b6102896102e4366004614ae2565b610dc5565b3480156102f557600080fd5b5061023b6103043660046149cb565b61122d565b34801561031557600080fd5b50610289610324366004614c5b565b61134d565b6101da610337366004614ae2565b61150d565b34801561034857600080fd5b5061020161035736600461496e565b611a26565b61036f61036a36600461496e565b611b62565b60408051938452602084019290925290820152606001610212565b34801561039657600080fd5b506101da6103a5366004614c5b565b611e4f565b6102896103b8366004614ae2565b6120c4565b3480156103c957600080fd5b5061023b6103d8366004614ccc565b612547565b3480156103e957600080fd5b506102896103f8366004614c5b565b612554565b34801561040957600080fd5b5061023b610418366004614ccc565b6126a4565b34801561042957600080fd5b506102016104383660046147d9565b6126b1565b34801561044957600080fd5b506104717f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b6040516001600160a01b039091168152602001610212565b34801561049557600080fd5b506104717f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e681565b3480156104c957600080fd5b506101da6104d8366004614c5b565b6129a5565b3480156104e957600080fd5b506102896104f8366004614b47565b612cdf565b34801561050957600080fd5b5061036f6105183660046148f3565b612d0c565b34801561052957600080fd5b50610289610538366004614c5b565b612e62565b600080600061058d7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861307e565b905060008761059c578c6105a0565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561062857600080fd5b505af115801561063c573d6000803e3d6000fd5b5050505061064e8e8e8e8e8e8e611a26565b909f909e509c50505050505050505050505050565b600061067084848461318b565b949350505050565b600081428110156106d05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064015b60405180910390fd5b6106ff887f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3889898930896126b1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506107a09150899086906001600160a01b038316906370a082319060240160206040518083038186803b15801561076357600080fd5b505afa158015610777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079b9190614aca565b6132c8565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561081b57600080fd5b505af115801561082f573d6000803e3d6000fd5b5050505061083d8483613411565b509695505050505050565b6060814281101561089b5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad381686866108d2600182614e1d565b8181106108ef57634e487b7160e01b600052603260045260246000fd5b905060200201602081019061090491906147a1565b6001600160a01b03161461095a5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b6109b87f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b915086826000815181106109dc57634e487b7160e01b600052603260045260246000fd5b60200260200101511115610a575760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b610b5486866000818110610a7b57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a9091906147a1565b33610b267f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68a8a6000818110610ad657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610aeb91906147a1565b8b8b6001818110610b0c57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610b2191906147a1565b61307e565b85600081518110610b4757634e487b7160e01b600052603260045260246000fd5b60200260200101516136de565b610b9382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613855915050565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316632e1a7d4d8360018551610bd19190614e1d565b81518110610bef57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610c1591815260200190565b600060405180830381600087803b158015610c2f57600080fd5b505af1158015610c43573d6000803e3d6000fd5b5050505061083d848360018551610c5a9190614e1d565b81518110610c7857634e487b7160e01b600052603260045260246000fd5b6020026020010151613411565b6060610cb27f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e684846134f9565b9392505050565b6000806000610ce97f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68f8f61307e565b9050600087610cf8578c610cfc565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c481018790529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b158015610d8457600080fd5b505af1158015610d98573d6000803e3d6000fd5b50505050610dab8f8f8f8f8f8f8f6126b1565b809450819550505050509b509b9950505050505050505050565b60608142811015610e185760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686866000818110610e6357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610e7891906147a1565b6001600160a01b031614610ece5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b610f2c7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e634888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b9150868260018451610f3e9190614e1d565b81518110610f5c57634e487b7160e01b600052603260045260246000fd5b60200260200101511015610fd85760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db08360008151811061102857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561105b57600080fd5b505af115801561106f573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb61111e7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898960008181106110e857634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110fd91906147a1565b8a8a6001818110610b0c57634e487b7160e01b600052603260045260246000fd5b8460008151811061113f57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016111789291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561119257600080fd5b505af11580156111a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ca9190614a60565b6111e457634e487b7160e01b600052600160045260246000fd5b61122382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b5095945050505050565b60008061127b7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68d7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861307e565b905060008661128a578b61128e565b6000195b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c481018690529091506001600160a01b0383169063d505accf9060e401600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b5050505061133c8d8d8d8d8d8d610678565b9d9c50505050505050505050505050565b606081428110156113a05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6113fe7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e689888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b91508682600184516114109190614e1d565b8151811061142e57634e487b7160e01b600052603260045260246000fd5b602002602001015110156114aa5760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6114ce86866000818110610a7b57634e487b7160e01b600052603260045260246000fd5b61083d82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b804281101561155e5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316858560008181106115a957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906115be91906147a1565b6001600160a01b0316146116145760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b60003490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561167457600080fd5b505af1158015611688573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb6117017f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898960008181106110e857634e487b7160e01b600052603260045260246000fd5b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b15801561176157600080fd5b505af1158015611775573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117999190614a60565b6117b357634e487b7160e01b600052600160045260246000fd5b600086866117c2600182614e1d565b8181106117df57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906117f491906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291909116906370a082319060240160206040518083038186803b15801561185057600080fd5b505afa158015611864573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118889190614aca565b90506118c8878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613c5d915050565b878188886118d7600182614e1d565b8181106118f457634e487b7160e01b600052603260045260246000fd5b905060200201602081019061190991906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291909116906370a08231906024015b60206040518083038186803b15801561196657600080fd5b505afa15801561197a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199e9190614aca565b6119a89190614e1d565b1015611a1c5760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b5050505050505050565b6000808242811015611a7a5760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611aa9897f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388a8a8a308a6126b1565b9093509150611ab98986856132c8565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611b3457600080fd5b505af1158015611b48573d6000803e3d6000fd5b50505050611b568583613411565b50965096945050505050565b60008060008342811015611bb85760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611be68a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b348c8c613fb1565b90945092506000611c387f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3861307e565b9050611c468b3383886136de565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ca157600080fd5b505af1158015611cb5573d6000803e3d6000fd5b50506040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018990527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816935063a9059cbb92506044019050602060405180830381600087803b158015611d3e57600080fd5b505af1158015611d52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d769190614a60565b611d9057634e487b7160e01b600052600160045260246000fd5b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015611dec57600080fd5b505af1158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e249190614aca565b925083341115611e4157611e4133611e3c8634614e1d565b613411565b505096509650969350505050565b8042811015611ea05760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b611f2585856000818110611ec457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ed991906147a1565b33611f1f7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898960008181106110e857634e487b7160e01b600052603260045260246000fd5b8a6136de565b60008585611f34600182614e1d565b818110611f5157634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f6691906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015291909116906370a082319060240160206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffa9190614aca565b905061203a868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613c5d915050565b86818787612049600182614e1d565b81811061206657634e487b7160e01b600052603260045260246000fd5b905060200201602081019061207b91906147a1565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015291909116906370a082319060240161194e565b606081428110156121175760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b03168686600081811061216257634e487b7160e01b600052603260045260246000fd5b905060200201602081019061217791906147a1565b6001600160a01b0316146121cd5760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b61222b7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b9150348260008151811061224f57634e487b7160e01b600052603260045260246000fd5b602002602001015111156122ca5760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db08360008151811061231a57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561234d57600080fd5b505af1158015612361573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb6123da7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898960008181106110e857634e487b7160e01b600052603260045260246000fd5b846000815181106123fb57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518363ffffffff1660e01b81526004016124349291906001600160a01b03929092168252602082015260400190565b602060405180830381600087803b15801561244e57600080fd5b505af1158015612462573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124869190614a60565b6124a057634e487b7160e01b600052600160045260246000fd5b6124df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613855915050565b8160008151811061250057634e487b7160e01b600052603260045260246000fd5b602002602001015134111561122357611223338360008151811061253457634e487b7160e01b600052603260045260246000fd5b602002602001015134611e3c9190614e1d565b60006106708484846142e0565b606081428110156125a75760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6126057f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506134f992505050565b9150868260008151811061262957634e487b7160e01b600052603260045260246000fd5b602002602001015111156114aa5760405162461bcd60e51b8152602060048201526024808201527f446546697665526f757465723a204558434553534956455f494e5055545f414d60448201527f4f554e540000000000000000000000000000000000000000000000000000000060648201526084016106c7565b600061067084848461441a565b60008082428110156127055760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b60006127327f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68c8c61307e565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd90606401602060405180830381600087803b15801561279c57600080fd5b505af11580156127b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127d49190614a60565b506040517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015260009182918416906389afcb44906024016040805180830381600087803b15801561283557600080fd5b505af1158015612849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286d9190614c38565b91509150600061287d8e8e614528565b509050806001600160a01b03168e6001600160a01b0316146128a05781836128a3565b82825b90975095508a87101561291e5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b898610156129945760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050505097509795505050505050565b80428110156129f65760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168585612a2d600182614e1d565b818110612a4a57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612a5f91906147a1565b6001600160a01b031614612ab55760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b612ad985856000818110611ec457634e487b7160e01b600052603260045260246000fd5b612b17858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613c5d915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316906370a082319060240160206040518083038186803b158015612b9257600080fd5b505afa158015612ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bca9190614aca565b905086811015612c425760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015612cbd57600080fd5b505af1158015612cd1573d6000803e3d6000fd5b50505050611a1c8482613411565b6060610cb27f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68484613a95565b60008060008342811015612d625760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b612d708c8c8c8c8c8c613fb1565b90945092506000612da27f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68e8e61307e565b9050612db08d3383886136de565b612dbc8c3383876136de565b6040517f6a6278420000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152821690636a62784290602401602060405180830381600087803b158015612e1857600080fd5b505af1158015612e2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e509190614aca565b92505050985098509895505050505050565b60608142811015612eb55760405162461bcd60e51b815260206004820152601560248201527f446546697665526f757465723a2045585049524544000000000000000000000060448201526064016106c7565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168686612eec600182614e1d565b818110612f0957634e487b7160e01b600052603260045260246000fd5b9050602002016020810190612f1e91906147a1565b6001600160a01b031614612f745760405162461bcd60e51b815260206004820152601a60248201527f446546697665526f757465723a20494e56414c49445f5041544800000000000060448201526064016106c7565b612fd27f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e689888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a9592505050565b9150868260018451612fe49190614e1d565b8151811061300257634e487b7160e01b600052603260045260246000fd5b60200260200101511015610a575760405162461bcd60e51b815260206004820152602860248201527f446546697665526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b600080600061308d8585614528565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085811b821660208085019190915285821b83166034850152845180850360280181526048850190955284519401939093207fff000000000000000000000000000000000000000000000000000000000000006068840152928b901b166069820152607d8101919091527fa2bd630981c20599e374cdb7af13220e18e2422c7dde970eff313f36d739c801609d820152919350915060bd01604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b60008084116132025760405162461bcd60e51b815260206004820152602860248201527f4465466976654c6962726172793a20494e53554646494349454e545f494e505560448201527f545f414d4f554e5400000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156132125750600082115b6132845760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000613292856126fe614dfe565b9050806132a185612710614dfe565b6132ab9190614dc6565b6132b58483614dfe565b6132bf9190614dde565b95945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133529190614cf7565b6000604051808303816000865af19150503d806000811461338f576040519150601f19603f3d011682016040523d82523d6000602084013e613394565b606091505b50915091508180156133be5750805115806133be5750808060200190518101906133be9190614a60565b61340a5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c45440060448201526064016106c7565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161343b9190614cf7565b60006040518083038185875af1925050503d8060008114613478576040519150601f19603f3d011682016040523d82523d6000602084013e61347d565b606091505b50509050806134f45760405162461bcd60e51b815260206004820152602160248201527f5472616e7366657248656c7065723a20535f5452414e534645525f4641494c4560448201527f440000000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050565b8051606090600281101561354f5760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a20494e56414c49445f50415448000000000060448201526064016106c7565b8067ffffffffffffffff81111561357657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561359f578160200160208202803683370190505b50915083826135af600184614e1d565b815181106135cd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015260006135e5600183614e1d565b90505b80156136d5576000806136548887613601600187614e1d565b8151811061361f57634e487b7160e01b600052603260045260246000fd5b602002602001015188868151811061364757634e487b7160e01b600052603260045260246000fd5b6020026020010151614638565b9150915061368a85848151811061367b57634e487b7160e01b600052603260045260246000fd5b602002602001015183836142e0565b85613696600186614e1d565b815181106136b457634e487b7160e01b600052603260045260246000fd5b602002602001018181525050505080806136cd90614e60565b9150506135e8565b50509392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916137709190614cf7565b6000604051808303816000865af19150503d80600081146137ad576040519150601f19603f3d011682016040523d82523d6000602084013e6137b2565b606091505b50915091508180156137dc5750805115806137dc5750808060200190518101906137dc9190614a60565b61384d5760405162461bcd60e51b8152602060048201526024808201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f464160448201527f494c45440000000000000000000000000000000000000000000000000000000060648201526084016106c7565b505050505050565b60005b600183516138669190614e1d565b811015613a8f5760008084838151811061389057634e487b7160e01b600052603260045260246000fd5b6020026020010151858460016138a69190614dc6565b815181106138c457634e487b7160e01b600052603260045260246000fd5b60200260200101519150915060006138dc8383614528565b5090506000876138ed866001614dc6565b8151811061390b57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146139395782600061393d565b6000835b91509150600060028a516139519190614e1d565b881061395d57886139b9565b6139b97f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6878c61398e8c6002614dc6565b815181106139ac57634e487b7160e01b600052603260045260246000fd5b602002602001015161307e565b90506139e67f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6888861307e565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613a23576020820181803683370190505b506040518563ffffffff1660e01b8152600401613a439493929190614d57565b600060405180830381600087803b158015613a5d57600080fd5b505af1158015613a71573d6000803e3d6000fd5b50505050505050505050508080613a8790614e77565b915050613858565b50505050565b80516060906002811015613aeb5760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a20494e56414c49445f50415448000000000060448201526064016106c7565b8067ffffffffffffffff811115613b1257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015613b3b578160200160208202803683370190505b5091508382600081518110613b6057634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b613b7a600183614e1d565b8110156136d557600080613bdc88878581518110613ba857634e487b7160e01b600052603260045260246000fd5b602002602001015188866001613bbe9190614dc6565b8151811061364757634e487b7160e01b600052603260045260246000fd5b91509150613c12858481518110613c0357634e487b7160e01b600052603260045260246000fd5b6020026020010151838361318b565b85613c1e856001614dc6565b81518110613c3c57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505050508080613c5590614e77565b915050613b6f565b60005b60018351613c6e9190614e1d565b8110156134f457600080848381518110613c9857634e487b7160e01b600052603260045260246000fd5b602002602001015185846001613cae9190614dc6565b81518110613ccc57634e487b7160e01b600052603260045260246000fd5b6020026020010151915091506000613ce48383614528565b5090506000613d147f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6858561307e565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613d5557600080fd5b505afa158015613d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8d9190614a7c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150600080876001600160a01b03168a6001600160a01b031614613dd5578284613dd8565b83835b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015292945090925083918c16906370a082319060240160206040518083038186803b158015613e3a57600080fd5b505afa158015613e4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e729190614aca565b613e7c9190614e1d565b9550613e8986838361318b565b945050505050600080856001600160a01b0316886001600160a01b031614613eb357826000613eb7565b6000835b91509150600060028c51613ecb9190614e1d565b8a10613ed7578a613f08565b613f087f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6898e61398e8e6002614dc6565b604080516000815260208101918290527f022c0d9f000000000000000000000000000000000000000000000000000000009091529091506001600160a01b0387169063022c0d9f90613f639086908690869060248101614d57565b600060405180830381600087803b158015613f7d57600080fd5b505af1158015613f91573d6000803e3d6000fd5b505050505050505050505050508080613fa990614e77565b915050613c60565b6040517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b0387811660048301528681166024830152600091829182917f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e69091169063e6a439059060440160206040518083038186803b15801561403c57600080fd5b505afa158015614050573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407491906147bd565b6001600160a01b03161415614141576040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015288811660248301527f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6169063c9c6539690604401602060405180830381600087803b15801561410757600080fd5b505af115801561411b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061413f91906147bd565b505b60008061416f7f00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e68b8b614638565b91509150816000148015614181575080155b15614191578793508692506142d3565b600061419e89848461441a565b9050878111614228578581101561421d5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b8894509250826142d1565b600061423589848661441a565b90508981111561425557634e487b7160e01b600052600160045260246000fd5b878110156142cb5760405162461bcd60e51b815260206004820152602360248201527f446546697665526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e54000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b94508793505b505b5050965096945050505050565b60008084116143575760405162461bcd60e51b815260206004820152602960248201527f4465466976654c6962726172793a20494e53554646494349454e545f4f55545060448201527f55545f414d4f554e54000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156143675750600082115b6143d95760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b6143e38483614e1d565b6143ef906126fe614dfe565b6143f98585614dfe565b61440590612710614dfe565b61440f9190614dde565b610670906001614dc6565b60008084116144915760405162461bcd60e51b815260206004820152602260248201527f4465466976654c6962726172793a20494e53554646494349454e545f414d4f5560448201527f4e5400000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b6000831180156144a15750600082115b6145135760405162461bcd60e51b815260206004820152602560248201527f4465466976654c6962726172793a20494e53554646494349454e545f4c49515560448201527f494449545900000000000000000000000000000000000000000000000000000060648201526084016106c7565b8261451e8386614dfe565b6106709190614dde565b600080826001600160a01b0316846001600160a01b031614156145b35760405162461bcd60e51b815260206004820152602260248201527f4465466976654c6962726172793a204944454e544943414c5f4144445245535360448201527f455300000000000000000000000000000000000000000000000000000000000060648201526084016106c7565b826001600160a01b0316846001600160a01b0316106145d35782846145d6565b83835b90925090506001600160a01b0382166146315760405162461bcd60e51b815260206004820152601b60248201527f4465466976654c6962726172793a205a45524f5f41444452455353000000000060448201526064016106c7565b9250929050565b60008060006146478585614528565b50905060008061465888888861307e565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561469057600080fd5b505afa1580156146a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146c89190614a7c565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff169150826001600160a01b0316876001600160a01b03161461470d578082614710565b81815b90999098509650505050505050565b803561472a81614ebe565b919050565b60008083601f840112614740578081fd5b50813567ffffffffffffffff811115614757578182fd5b6020830191508360208260051b850101111561463157600080fd5b80516dffffffffffffffffffffffffffff8116811461472a57600080fd5b803560ff8116811461472a57600080fd5b6000602082840312156147b2578081fd5b8135610cb281614ebe565b6000602082840312156147ce578081fd5b8151610cb281614ebe565b600080600080600080600060e0888a0312156147f3578283fd5b87356147fe81614ebe565b9650602088013561480e81614ebe565b955060408801359450606088013593506080880135925060a088013561483381614ebe565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e03121561486b578384fd5b8b3561487681614ebe565b9a5060208c013561488681614ebe565b995060408c0135985060608c0135975060808c0135965060a08c01356148ab81614ebe565b955060c08c0135945060e08c01356148c281614ed6565b93506148d16101008d01614790565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b03121561490f578384fd5b883561491a81614ebe565b9750602089013561492a81614ebe565b965060408901359550606089013594506080890135935060a0890135925060c089013561495681614ebe565b8092505060e089013590509295985092959890939650565b60008060008060008060c08789031215614986578182fd5b863561499181614ebe565b955060208701359450604087013593506060870135925060808701356149b681614ebe565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d0312156149ea578384fd5b8a356149f581614ebe565b995060208b0135985060408b0135975060608b0135965060808b0135614a1a81614ebe565b955060a08b0135945060c08b0135614a3181614ed6565b9350614a3f60e08c01614790565b92506101008b013591506101208b013590509295989b9194979a5092959850565b600060208284031215614a71578081fd5b8151610cb281614ed6565b600080600060608486031215614a90578081fd5b614a9984614772565b9250614aa760208501614772565b9150604084015163ffffffff81168114614abf578182fd5b809150509250925092565b600060208284031215614adb578081fd5b5051919050565b600080600080600060808688031215614af9578283fd5b85359450602086013567ffffffffffffffff811115614b16578384fd5b614b228882890161472f565b9095509350506040860135614b3681614ebe565b949793965091946060013592915050565b60008060408385031215614b59578182fd5b8235915060208084013567ffffffffffffffff80821115614b78578384fd5b818601915086601f830112614b8b578384fd5b813581811115614b9d57614b9d614ea8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715614be057614be0614ea8565b604052828152858101935084860182860187018b1015614bfe578788fd5b8795505b83861015614c2757614c138161471f565b855260019590950194938601938601614c02565b508096505050505050509250929050565b60008060408385031215614c4a578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215614c73578384fd5b8635955060208701359450604087013567ffffffffffffffff811115614c97578485fd5b614ca389828a0161472f565b9095509350506060870135614cb781614ebe565b80925050608087013590509295509295509295565b600080600060608486031215614ce0578081fd5b505081359360208301359350604090920135919050565b60008251614d09818460208701614e34565b9190910192915050565b6020808252825182820181905260009190848201906040850190845b81811015614d4b57835183529284019291840191600101614d2f565b50909695505050505050565b8481528360208201526001600160a01b03831660408201526080606082015260008251806080840152614d918160a0850160208701614e34565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160a00195945050505050565b60008219821115614dd957614dd9614e92565b500190565b600082614df957634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614e1857614e18614e92565b500290565b600082821015614e2f57614e2f614e92565b500390565b60005b83811015614e4f578181015183820152602001614e37565b83811115613a8f5750506000910152565b600081614e6f57614e6f614e92565b506000190190565b6000600019821415614e8b57614e8b614e92565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114614ed357600080fd5b50565b8015158114614ed357600080fdfea164736f6c6343000804000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _factory (address): 0x47524ca6578E172878aBf6fD6f3E1Cd106c551e6
Arg [1] : _wS (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000047524ca6578e172878abf6fd6f3e1cd106c551e6
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.