More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 18,297 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 92478648 | 11 days ago | IN | 0 FTM | 0.00023153 | ||||
Approve | 92478634 | 11 days ago | IN | 0 FTM | 0.00023153 | ||||
Approve | 92478618 | 11 days ago | IN | 0 FTM | 0.00023153 | ||||
Approve | 89583584 | 44 days ago | IN | 0 FTM | 0.00059169 | ||||
Approve | 89054920 | 49 days ago | IN | 0 FTM | 0.00054024 | ||||
Approve | 89054909 | 49 days ago | IN | 0 FTM | 0.00054024 | ||||
Approve | 88689779 | 52 days ago | IN | 0 FTM | 0.00023153 | ||||
Approve | 88689772 | 52 days ago | IN | 0 FTM | 0.00023153 | ||||
Approve | 88627179 | 53 days ago | IN | 0 FTM | 0.00151783 | ||||
Approve | 87923830 | 60 days ago | IN | 0 FTM | 0.02086378 | ||||
Approve | 87923819 | 60 days ago | IN | 0 FTM | 0.02086378 | ||||
Approve | 87564385 | 63 days ago | IN | 0 FTM | 0.00169791 | ||||
Approve | 87139545 | 67 days ago | IN | 0 FTM | 0.00092613 | ||||
Approve | 87139245 | 67 days ago | IN | 0 FTM | 0.00095186 | ||||
Approve | 86594503 | 73 days ago | IN | 0 FTM | 0.00048879 | ||||
Approve | 86594499 | 73 days ago | IN | 0 FTM | 0.00048879 | ||||
Approve | 86465747 | 74 days ago | IN | 0 FTM | 0.00054024 | ||||
Approve | 86354224 | 75 days ago | IN | 0 FTM | 0.00054024 | ||||
Approve | 86352670 | 75 days ago | IN | 0 FTM | 0.0005793 | ||||
Approve | 86352501 | 75 days ago | IN | 0 FTM | 0.0005793 | ||||
Approve | 86352242 | 75 days ago | IN | 0 FTM | 0.00051452 | ||||
Approve | 86318644 | 75 days ago | IN | 0 FTM | 0.00028298 | ||||
Approve | 86138051 | 77 days ago | IN | 0 FTM | 0.00054024 | ||||
Approve | 86087655 | 77 days ago | IN | 0 FTM | 0.00038589 | ||||
Approve | 85985720 | 78 days ago | IN | 0 FTM | 0.00051452 |
Latest 2 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
30523775 | 967 days ago | Contract Creation | 0 FTM | |||
30523775 | 967 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
BaseV1Pair
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-03-01 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface erc20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function approve(address spender, uint value) external returns (bool); } library Math { function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IBaseV1Callee { function hook(address sender, uint amount0, uint amount1, bytes calldata data) external; } // Base V1 Fees contract is used as a 1:1 pair relationship to split out fees, this ensures that the curve does not need to be modified for LP shares contract BaseV1Fees { address internal immutable pair; // The pair it is bonded to address internal immutable token0; // token0 of pair, saved localy and statically for gas optimization address internal immutable token1; // Token1 of pair, saved localy and statically for gas optimization constructor(address _token0, address _token1) { pair = msg.sender; token0 = _token0; token1 = _token1; } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Allow the pair to transfer fees to users function claimFeesFor(address recipient, uint amount0, uint amount1) external { require(msg.sender == pair); if (amount0 > 0) _safeTransfer(token0, recipient, amount0); if (amount1 > 0) _safeTransfer(token1, recipient, amount1); } } // The base pair of pools, either stable or volatile contract BaseV1Pair { string public name; string public symbol; uint8 public constant decimals = 18; // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public immutable stable; uint public totalSupply = 0; mapping(address => mapping (address => uint)) public allowance; mapping(address => uint) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; uint internal constant MINIMUM_LIQUIDITY = 10**3; address public immutable token0; address public immutable token1; address public immutable fees; address immutable factory; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } // Capture oracle reading every 30 minutes uint constant periodSize = 1800; Observation[] public observations; uint internal immutable decimals0; uint internal immutable decimals1; uint public reserve0; uint public reserve1; uint public blockTimestampLast; uint public reserve0CumulativeLast; uint public reserve1CumulativeLast; // index0 and index1 are used to accumulate fees, this is split out from normal trades to keep the swap "clean" // this further allows LP holders to easily claim fees for tokens they have/staked uint public index0 = 0; uint public index1 = 0; // position assigned to each LP to track their current index0 & index1 vs the global position mapping(address => uint) public supplyIndex0; mapping(address => uint) public supplyIndex1; // tracks the amount of unclaimed, but claimable tokens off of fees for token0 and token1 mapping(address => uint) public claimable0; mapping(address => uint) public claimable1; event Fees(address indexed sender, uint amount0, uint amount1); event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint reserve0, uint reserve1); event Claim(address indexed sender, address indexed recipient, uint amount0, uint amount1); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); constructor() { factory = msg.sender; (address _token0, address _token1, bool _stable) = BaseV1Factory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); fees = address(new BaseV1Fees(_token0, _token1)); if (_stable) { name = string(abi.encodePacked("StableV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); symbol = string(abi.encodePacked("sAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); } else { name = string(abi.encodePacked("VolatileV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); symbol = string(abi.encodePacked("vAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); } decimals0 = 10**erc20(_token0).decimals(); decimals1 = 10**erc20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function observationLength() external view returns (uint) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length-1]; } function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1) { return (decimals0, decimals1, reserve0, reserve1, stable, token0, token1); } function tokens() external view returns (address, address) { return (token0, token1); } // claim accumulated but unclaimed fees (viewable via claimable0 and claimable1) function claimFees() external returns (uint claimed0, uint claimed1) { _updateFor(msg.sender); claimed0 = claimable0[msg.sender]; claimed1 = claimable1[msg.sender]; if (claimed0 > 0 || claimed1 > 0) { claimable0[msg.sender] = 0; claimable1[msg.sender] = 0; BaseV1Fees(fees).claimFeesFor(msg.sender, claimed0, claimed1); emit Claim(msg.sender, msg.sender, claimed0, claimed1); } } // Accrue fees on token0 function _update0(uint amount) internal { _safeTransfer(token0, fees, amount); // transfer the fees out to BaseV1Fees uint256 _ratio = amount * 1e18 / totalSupply; // 1e18 adjustment is removed during claim if (_ratio > 0) { index0 += _ratio; } emit Fees(msg.sender, amount, 0); } // Accrue fees on token1 function _update1(uint amount) internal { _safeTransfer(token1, fees, amount); uint256 _ratio = amount * 1e18 / totalSupply; if (_ratio > 0) { index1 += _ratio; } emit Fees(msg.sender, 0, amount); } // this function MUST be called on any balance changes, otherwise can be used to infinitely claim fees // Fees are segregated from core funds, so fees can never put liquidity at risk function _updateFor(address recipient) internal { uint _supplied = balanceOf[recipient]; // get LP balance of `recipient` if (_supplied > 0) { uint _supplyIndex0 = supplyIndex0[recipient]; // get last adjusted index0 for recipient uint _supplyIndex1 = supplyIndex1[recipient]; uint _index0 = index0; // get global index0 for accumulated fees uint _index1 = index1; supplyIndex0[recipient] = _index0; // update user current position to global position supplyIndex1[recipient] = _index1; uint _delta0 = _index0 - _supplyIndex0; // see if there is any difference that need to be accrued uint _delta1 = _index1 - _supplyIndex1; if (_delta0 > 0) { uint _share = _supplied * _delta0 / 1e18; // add accrued difference for each supplied token claimable0[recipient] += _share; } if (_delta1 > 0) { uint _share = _supplied * _delta1 / 1e18; claimable1[recipient] += _share; } } else { supplyIndex0[recipient] = index0; // new users are set to the default global state supplyIndex1[recipient] = index1; } } function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint _reserve0, uint _reserve1) internal { uint blockTimestamp = block.timestamp; uint timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push(Observation(blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast)); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns (uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint amountIn) external view returns (uint amountOut) { Observation memory _observation = lastObservation(); (uint reserve0Cumulative, uint reserve1Cumulative,) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length-2]; } uint timeElapsed = block.timestamp - _observation.timestamp; uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } // as per `current`, however allows user configured granularity, up to the full window size function quote(address tokenIn, uint amountIn, uint granularity) external view returns (uint amountOut) { uint [] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint priceAverageCumulative; for (uint i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample(address tokenIn, uint amountIn, uint points, uint window) public view returns (uint[] memory) { uint[] memory _prices = new uint[](points); uint length = observations.length-1; uint i = length - (points * window); uint nextIndex = 0; uint index = 0; for (; i < length; i+=window) { nextIndex = i + window; uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); index = index + 1; } return _prices; } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint liquidity) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); uint _balance0 = erc20(token0).balanceOf(address(this)); uint _balance1 = erc20(token1).balanceOf(address(this)); uint _amount0 = _balance0 - _reserve0; uint _amount1 = _balance1 - _reserve1; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(_amount0 * _totalSupply / _reserve0, _amount1 * _totalSupply / _reserve1); } require(liquidity > 0, 'ILM'); // BaseV1: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function burn(address to) external lock returns (uint amount0, uint amount1) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint _balance0 = erc20(_token0).balanceOf(address(this)); uint _balance1 = erc20(_token1).balanceOf(address(this)); uint _liquidity = balanceOf[address(this)]; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = _liquidity * _balance0 / _totalSupply; // using balances ensures pro-rata distribution amount1 = _liquidity * _balance1 / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, 'ILB'); // BaseV1: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_token1).balanceOf(address(this)); _update(_balance0, _balance1, _reserve0, _reserve1); emit Burn(msg.sender, amount0, amount1, to); } // this low-level function should be called from a contract which performs important safety checks function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { require(!BaseV1Factory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, 'IOA'); // BaseV1: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, 'IL'); // BaseV1: INSUFFICIENT_LIQUIDITY uint _balance0; uint _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, 'IT'); // BaseV1: INVALID_TO if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IBaseV1Callee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_token1).balanceOf(address(this)); } uint amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, 'IIA'); // BaseV1: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _update0(amount0In / 10000); // accrue fees for token0 and move them out of pool if (amount1In > 0) _update1(amount1In / 10000); // accrue fees for token1 and move them out of pool _balance0 = erc20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = erc20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), 'K'); // BaseV1: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer(_token0, to, erc20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, erc20(_token1).balanceOf(address(this)) - (reserve1)); } // force reserves to match balances function sync() external lock { _update(erc20(token0).balanceOf(address(this)), erc20(token1).balanceOf(address(this)), reserve0, reserve1); } function _f(uint x0, uint y) internal pure returns (uint) { return x0*(y*y/1e18*y/1e18)/1e18+(x0*x0/1e18*x0/1e18)*y/1e18; } function _d(uint x0, uint y) internal pure returns (uint) { return 3*x0*(y*y/1e18)/1e18+(x0*x0/1e18*x0/1e18); } function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) { for (uint i = 0; i < 255; i++) { uint y_prev = y; uint k = _f(x0, y); if (k < xy) { uint dy = (xy - k)*1e18/_d(x0, y); y = y + dy; } else { uint dy = (k - xy)*1e18/_d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut(uint amountIn, address tokenIn) external view returns (uint) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); amountIn -= amountIn / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1) internal view returns (uint) { if (stable) { uint xy = _k(_reserve0, _reserve1); _reserve0 = _reserve0 * 1e18 / decimals0; _reserve1 = _reserve1 * 1e18 / decimals1; (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? amountIn * 1e18 / decimals0 : amountIn * 1e18 / decimals1; uint y = reserveB - _get_y(amountIn+reserveA, xy, reserveB); return y * (tokenIn == token0 ? decimals1 : decimals0) / 1e18; } else { (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return amountIn * reserveB / (reserveA + amountIn); } } function _k(uint x, uint y) internal view returns (uint) { if (stable) { uint _x = x * 1e18 / decimals0; uint _y = y * 1e18 / decimals1; uint _a = (_x * _y) / 1e18; uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return _a * _b / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint amount) internal { _updateFor(dst); // balances must be updated on mint/burn/transfer totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint amount) internal { _updateFor(dst); totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'BaseV1: EXPIRED'); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256('1'), block.chainid, address(this) ) ); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, 'BaseV1: INVALID_SIGNATURE'); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint amount) external returns (bool) { address spender = msg.sender; uint spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint).max) { uint newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint amount) internal { _updateFor(src); // update fee position for src _updateFor(dst); // update fee position for dst balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract BaseV1Factory { bool public isPaused; address public pauser; address public pendingPauser; mapping(address => mapping(address => mapping(bool => address))) public getPair; address[] public allPairs; mapping(address => bool) public isPair; // simplified check if its a pair, given that `stable` flag might not be available in peripherals address internal _temp0; address internal _temp1; bool internal _temp; event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint); constructor() { pauser = msg.sender; isPaused = false; } function allPairsLength() external view returns (uint) { return allPairs.length; } function setPauser(address _pauser) external { require(msg.sender == pauser); pendingPauser = _pauser; } function acceptPauser() external { require(msg.sender == pendingPauser); pauser = pendingPauser; } function setPause(bool _state) external { require(msg.sender == pauser); isPaused = _state; } function pairCodeHash() external pure returns (bytes32) { return keccak256(type(BaseV1Pair).creationCode); } function getInitializable() external view returns (address, address, bool) { return (_temp0, _temp1, _temp); } function createPair(address tokenA, address tokenB, bool stable) external returns (address pair) { require(tokenA != tokenB, 'IA'); // BaseV1: IDENTICAL_ADDRESSES (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'ZA'); // BaseV1: ZERO_ADDRESS require(getPair[token0][token1][stable] == address(0), 'PE'); // BaseV1: PAIR_EXISTS - single check is sufficient bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); // notice salt includes stable as well, 3 parameters (_temp0, _temp1, _temp) = (token0, token1, stable); pair = address(new BaseV1Pair{salt:salt}()); getPair[token0][token1][stable] = pair; getPair[token1][token0][stable] = pair; // populate mapping in the reverse direction allPairs.push(pair); isPair[pair] = true; emit PairCreated(token0, token1, stable, pair, allPairs.length); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"current","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"_reserve0","type":"uint256"},{"internalType":"uint256","name":"_reserve1","type":"uint256"},{"internalType":"uint256","name":"_blockTimestampLast","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastObservation","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"internalType":"struct BaseV1Pair.Observation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"uint256","name":"dec0","type":"uint256"},{"internalType":"uint256","name":"dec1","type":"uint256"},{"internalType":"uint256","name":"r0","type":"uint256"},{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"bool","name":"st","type":"bool"},{"internalType":"address","name":"t0","type":"address"},{"internalType":"address","name":"t1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"granularity","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"sample","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61016060405260006002556000600d556000600e5560016013553480156200002657600080fd5b50336001600160a01b0316610100816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620007c8565b8015156080526001600160a01b0380831660c052831660a052604051929550909350915083908390620000df90620006f7565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000113573d6000803e3d6000fd5b506001600160a01b031660e05280156200034557826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000190919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001f9919081019062000863565b6040516020016200020c9291906200091b565b604051602081830303815290604052600090805190602001906200023292919062000705565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000272573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200029c919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620002db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000305919081019062000863565b6040516020016200031892919062000976565b604051602081830303815290604052600190805190602001906200033e92919062000705565b506200055e565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000384573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003ae919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620003ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000417919081019062000863565b6040516020016200042a929190620009c7565b604051602081830303815290604052600090805190602001906200045092919062000705565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000490573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ba919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000523919081019062000863565b6040516020016200053692919062000a24565b604051602081830303815290604052600190805190602001906200055c92919062000705565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200059d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005c3919062000a46565b620005d090600a62000b87565b6101208181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000617573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200063d919062000a46565b6200064a90600a62000b87565b6101405250506040805160608101825242815260006020820181815292820181815260078054600181018255925291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860039092029182015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555062000bd5565b610370806200410c83390190565b828054620007139062000b98565b90600052602060002090601f01602090048101928262000737576000855562000782565b82601f106200075257805160ff191683800117855562000782565b8280016001018555821562000782579182015b828111156200078257825182559160200191906001019062000765565b506200079092915062000794565b5090565b5b8082111562000790576000815560010162000795565b80516001600160a01b0381168114620007c357600080fd5b919050565b600080600060608486031215620007de57600080fd5b620007e984620007ab565b9250620007f960208501620007ab565b9150604084015180151581146200080f57600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200084d57818101518382015260200162000833565b838111156200085d576000848401525b50505050565b6000602082840312156200087657600080fd5b81516001600160401b03808211156200088e57600080fd5b818401915084601f830112620008a357600080fd5b815181811115620008b857620008b86200081a565b604051601f8201601f19908116603f01168101908382118183101715620008e357620008e36200081a565b81604052828152876020848701011115620008fd57600080fd5b6200091083602083016020880162000830565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200094781600f85016020880162000830565b602f60f81b600f9184019182015283516200096a81601084016020880162000830565b01601001949350505050565b6473414d4d2d60d81b8152600083516200099881600585016020880162000830565b602f60f81b6005918401918201528351620009bb81600684016020880162000830565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351620009f581601185016020880162000830565b602f60f81b601191840191820152835162000a1881601284016020880162000830565b01601201949350505050565b6476414d4d2d60d81b8152600083516200099881600585016020880162000830565b60006020828403121562000a5957600080fd5b815160ff8116811462000a6b57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000ac957816000190482111562000aad5762000aad62000a72565b8085161562000abb57918102915b93841c939080029062000a8d565b509250929050565b60008262000ae25750600162000b81565b8162000af15750600062000b81565b816001811462000b0a576002811462000b155762000b35565b600191505062000b81565b60ff84111562000b295762000b2962000a72565b50506001821b62000b81565b5060208310610133831016604e8410600b841016171562000b5a575081810a62000b81565b62000b66838362000a88565b806000190482111562000b7d5762000b7d62000a72565b0290505b92915050565b600062000a6b60ff84168362000ad1565b600181811c9082168062000bad57607f821691505b6020821081141562000bcf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516133e062000d2c6000396000818161043101528181612308015281816125f2015281816126b401526127bf01526000818161040e015281816122c7015281816125b3015281816126f60152612799015260006107b80152600081816105f201528181611b150152818161212e01526121fb0152600081816104bb0152818161064701528181610714015281816108f301528181610b9b015281816113ae01528181611595015281816119bc01528181611f9401526121da0152600081816102f90152818161049301528181610622015281816108d201528181610b7a01528181611318015281816115730152818161199a01528181611f0c0152818161210d015281816126340152818161267b015281816127600152612803015260008181610397015281816104630152818161229f015261257f01526133e06000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063bda39cad116100c3578063d294f09311610087578063d294f09314610736578063d505accf1461073e578063dd62ed3e14610751578063ebeb31db1461077c578063f140a35a14610784578063fff6cae91461079757600080fd5b8063bda39cad146106eb578063bf944dbc146106f4578063c245febc146106fd578063c5700a0214610706578063d21220a71461070f57600080fd5b80639d63848a116101155780639d63848a146106145780639e8cc04b146106725780639f767c8814610685578063a1ac4d13146106a5578063a9059cbb146106c5578063bc25cf77146106d857600080fd5b80637ecebe001461057357806389afcb44146105935780638a7b8cf2146105bb57806395d89b41146105e55780639af1d35a146105ed57600080fd5b8063252c09d7116101ea5780634d5a9f8a116101ae5780634d5a9f8a146104f1578063517b3f82146105115780635881c475146105245780635a76f25e146105375780636a6278421461054057806370a082311461055357600080fd5b8063252c09d7146103cc578063313ce567146103df57806332c0defd146103f9578063392f37e914610402578063443cb4bc146104e857600080fd5b806313345fe11161023c57806313345fe11461033357806318160ddd146103535780631df8c7171461036a578063205aabf11461037257806322be3de11461039257806323b872dd146103b957600080fd5b8063022c0d9f1461027957806306fdde031461028e5780630902f1ac146102ac578063095ea7b3146102d15780630dfe1681146102f4575b600080fd5b61028c610287366004612e5f565b61079f565b005b610296610d7e565b6040516102a39190612f23565b60405180910390f35b600854600954600a545b604080519384526020840192909252908201526060016102a3565b6102e46102df366004612f56565b610e0c565b60405190151581526020016102a3565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a3565b610346610341366004612f80565b610e79565b6040516102a39190612fb9565b61035c60025481565b6040519081526020016102a3565b6102b6611081565b61035c610380366004612ffd565b60106020526000908152604090205481565b6102e47f000000000000000000000000000000000000000000000000000000000000000081565b6102e46103c7366004613018565b6110f0565b6102b66103da366004613054565b6111b9565b6103e7601281565b60405160ff90911681526020016102a3565b61035c600d5481565b600854600954604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102a3565b61035c60085481565b61035c6104ff366004612ffd565b60116020526000908152604090205481565b61035c61051f366004612f56565b6111ec565b61034661053236600461306d565b6112d5565b61035c60095481565b61035c61054e366004612ffd565b6112e4565b61035c610561366004612ffd565b60046020526000908152604090205481565b61035c610581366004612ffd565b60066020526000908152604090205481565b6105a66105a1366004612ffd565b611541565b604080519283526020830191909152016102a3565b6105c361185e565b60408051825181526020808401519082015291810151908201526060016102a3565b6102966118de565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102a3565b61035c61068036600461306d565b6118eb565b61035c610693366004612ffd565b600f6020526000908152604090205481565b61035c6106b3366004612ffd565b60126020526000908152604090205481565b6102e46106d3366004612f56565b611958565b61028c6106e6366004612ffd565b61196e565b61035c600e5481565b61035c600b5481565b61035c600c5481565b61035c600a5481565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a6611a8c565b61028c61074c3660046130a0565b611bb3565b61035c61075f366004613113565b600360209081526000928352604080842090915290825290205481565b60075461035c565b61035c610792366004613146565b611ea8565b61028c611edf565b6013546001146107ae57600080fd5b60026013819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613169565b1561084257600080fd5b60008511806108515750600084115b6108885760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600854600954818710801561089c57508086105b6108cd5760405162461bcd60e51b8152602060048201526002602482015261125360f21b604482015260640161087f565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109405750806001600160a01b0316896001600160a01b031614155b6109715760405162461bcd60e51b8152602060048201526002602482015261125560f21b604482015260640161087f565b8a1561098257610982828a8d612019565b891561099357610993818a8c612019565b8615610a0057604051639a7bff7960e01b81526001600160a01b038a1690639a7bff79906109cd9033908f908f908e908e9060040161318b565b600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad391906131d7565b9250505060008985610ae59190613206565b8311610af2576000610b06565b610afc8a86613206565b610b069084613206565b90506000610b148a86613206565b8311610b21576000610b35565b610b2b8a86613206565b610b359084613206565b90506000821180610b465750600081115b610b785760405162461bcd60e51b815260206004820152600360248201526249494160e81b604482015260640161087f565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008315610bd457610bd4610bcf6127108661321d565b612108565b8215610bee57610bee610be96127108561321d565b6121d5565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906131d7565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906131d7565b9450610ccd888861229b565b610cd7878761229b565b1015610d095760405162461bcd60e51b81526020600482015260016024820152604b60f81b604482015260640161087f565b5050610d17848488886123e7565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601355505050505050505050565b60008054610d8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610db79061323f565b8015610e045780601f10610dd957610100808354040283529160200191610e04565b820191906000526020600020905b815481529060010190602001808311610de757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e679086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610e9657610e96613274565b604051908082528060200260200182016040528015610ebf578160200160208202803683370190505b50600754909150600090610ed590600190613206565b90506000610ee3858761328a565b610eed9083613206565b90506000805b8383101561107157610f0587846132a9565b9150600060078481548110610f1c57610f1c6132c1565b90600052602060002090600302016000015460078481548110610f4157610f416132c1565b906000526020600020906003020160000154610f5d9190613206565b905060008160078681548110610f7557610f756132c1565b90600052602060002090600302016001015460078681548110610f9a57610f9a6132c1565b906000526020600020906003020160010154610fb69190613206565b610fc0919061321d565b905060008260078781548110610fd857610fd86132c1565b90600052602060002090600302016002015460078781548110610ffd57610ffd6132c1565b9060005260206000209060030201600201546110199190613206565b611023919061321d565b90506110318c8e848461257b565b888581518110611043576110436132c1565b60209081029190910101526110598460016132a9565b9350505050868361106a91906132a9565b9250610ef3565b509293505050505b949350505050565b600b54600c54426000808061109f600854600954600a549192909190565b9250925092508381146110e85760006110b88286613206565b90506110c4818561328a565b6110ce90886132a9565b96506110da818461328a565b6110e490876132a9565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061112a57506000198114155b156111a057600061113b8583613206565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6111ab868686612870565b6001925050505b9392505050565b600781815481106111c957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806111f761185e565b9050600080611204611081565b508451919350915042141561126d576007805461122390600290613206565b81548110611233576112336132c1565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b825160009061127c9042613206565b90506000818560200151856112919190613206565b61129b919061321d565b90506000828660400151856112b09190613206565b6112ba919061321d565b90506112c8888a848461257b565b9998505050505050505050565b60606110798484846001610e79565b60006013546001146112f557600080fd5b60026013556008546009546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906131d7565b905060006114278584613206565b905060006114358584613206565b60025490915080611473576103e8611455611450848661328a565b612930565b61145f9190613206565b975061146e60006103e86129a0565b6114a8565b6114a587611481838661328a565b61148b919061321d565b87611496848661328a565b6114a0919061321d565b612a33565b97505b600088116114de5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b604482015260640161087f565b6114e889896129a0565b6114f4858589896123e7565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601355509395945050505050565b60008060135460011461155357600080fd5b60026013556008546009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906131d7565b30600090815260046020526040902054600254919250908061169d858461328a565b6116a7919061321d565b9950806116b4848461328a565b6116be919061321d565b985060008a1180156116d05750600089115b6117025760405162461bcd60e51b815260206004820152600360248201526224a62160e91b604482015260640161087f565b61170c3083612a49565b611717868c8c612019565b611722858c8b612019565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f591906131d7565b925061180384848a8a6123e7565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601381905550915091565b61188260405180606001604052806000815260200160008152602001600081525090565b6007805461189290600190613206565b815481106118a2576118a26132c1565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610d8b9061323f565b6000806118fb8585856001610e79565b90506000805b82518110156119435782818151811061191c5761191c6132c1565b60200260200101518261192f91906132a9565b91508061193b816132d7565b915050611901565b5061194e848261321d565b9695505050505050565b6000611965338484612870565b50600192915050565b60135460011461197d57600080fd5b60026013556008546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611a4a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906131d7565b611a459190613206565b612019565b6009546040516370a0823160e01b8152306004820152611a829183918691906001600160a01b038416906370a08231906024016119fa565b5050600160135550565b600080611a9833612ad4565b50503360009081526011602090815260408083205460129092529091205481151580611ac45750600081115b15611baf573360008181526011602090815260408083208390556012909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063533cf5ce90606401600060405180830381600087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611bf55760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b604482015260640161087f565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c2591906132f2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611cdb836132d7565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611d5492919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611dbf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611df55750886001600160a01b0316816001600160a01b0316145b611e415760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e415455524500000000000000604482015260640161087f565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b60085460095460009190611ebe6127108661321d565b611ec89086613206565b9450611ed68585848461257b565b95945050505050565b601354600114611eee57600080fd5b60026013556040516370a0823160e01b8152306004820152612012907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7f91906131d7565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200791906131d7565b6008546009546123e7565b6001601355565b6000836001600160a01b03163b1161203057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161208c919061338e565b6000604051808303816000865af19150503d80600081146120c9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ce565b606091505b50915091508180156120f85750805115806120f85750808060200190518101906120f89190613169565b61210157600080fd5b5050505050565b6121537f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612019565b60025460009061216b83670de0b6b3a764000061328a565b612175919061321d565b905080156121955780600d600082825461218f91906132a9565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b6122207f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612019565b60025460009061223883670de0b6b3a764000061328a565b612242919061321d565b905080156122625780600e600082825461225c91906132a9565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291016121c9565b60007f0000000000000000000000000000000000000000000000000000000000000000156123d65760007f00000000000000000000000000000000000000000000000000000000000000006122f885670de0b6b3a764000061328a565b612302919061321d565b905060007f000000000000000000000000000000000000000000000000000000000000000061233985670de0b6b3a764000061328a565b612343919061321d565b90506000670de0b6b3a764000061235a838561328a565b612364919061321d565b90506000670de0b6b3a764000061237b848061328a565b612385919061321d565b670de0b6b3a7640000612398868061328a565b6123a2919061321d565b6123ac91906132a9565b9050670de0b6b3a76400006123c1828461328a565b6123cb919061321d565b945050505050610e73565b6123e0828461328a565b9050610e73565b600a5442906000906123f99083613206565b905060008111801561240a57508315155b801561241557508215155b1561245c57612424818561328a565b600b600082825461243591906132a9565b909155506124459050818461328a565b600c600082825461245691906132a9565b90915550505b600061246661185e565b80519091506124759084613206565b915061070882111561252a5760408051606081018252848152600b5460208201908152600c549282019283526007805460018101825560009190915291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600390930292830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555b60088790556009869055600a83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156127fe5760006125af848461229b565b90507f00000000000000000000000000000000000000000000000000000000000000006125e485670de0b6b3a764000061328a565b6125ee919061321d565b93507f000000000000000000000000000000000000000000000000000000000000000061262384670de0b6b3a764000061328a565b61262d919061321d565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612672578486612675565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146126f4577f00000000000000000000000000000000000000000000000000000000000000006126e589670de0b6b3a764000061328a565b6126ef919061321d565b612731565b7f000000000000000000000000000000000000000000000000000000000000000061272789670de0b6b3a764000061328a565b612731919061321d565b97506000612749612742848b6132a9565b8584612c34565b6127539083613206565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b0316146127bd577f00000000000000000000000000000000000000000000000000000000000000006127df565b7f00000000000000000000000000000000000000000000000000000000000000005b6127e9908361328a565b6127f3919061321d565b945050505050611079565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612841578385612844565b84845b909250905061285387836132a9565b61285d828961328a565b612867919061321d565b92505050611079565b61287983612ad4565b61288282612ad4565b6001600160a01b038316600090815260046020526040812080548392906128aa908490613206565b90915550506001600160a01b038216600090815260046020526040812080548392906128d79084906132a9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292391815260200190565b60405180910390a3505050565b60006003821115612991575080600061294a60028361321d565b6129559060016132a9565b90505b8181101561298b57905080600281612970818661321d565b61297a91906132a9565b612984919061321d565b9050612958565b50919050565b811561299b575060015b919050565b6129a982612ad4565b80600260008282546129bb91906132a9565b90915550506001600160a01b038216600090815260046020526040812080548392906129e89084906132a9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612a4257816111b2565b5090919050565b612a5282612ad4565b8060026000828254612a649190613206565b90915550506001600160a01b03821660009081526004602052604081208054839290612a91908490613206565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612a27565b6001600160a01b0381166000908152600460205260409020548015612c02576001600160a01b0382166000908152600f60209081526040808320805460108085529285208054600d54600e54948190559490955282905593612b368584613206565b90506000612b448584613206565b90508115612b9f576000670de0b6b3a7640000612b61848a61328a565b612b6b919061321d565b6001600160a01b038a16600090815260116020526040812080549293508392909190612b989084906132a9565b9091555050505b8015612bf8576000670de0b6b3a7640000612bba838a61328a565b612bc4919061321d565b6001600160a01b038a16600090815260126020526040812080549293508392909190612bf19084906132a9565b9091555050505b5050505050505050565b600d546001600160a01b0383166000908152600f6020908152604080832093909355600e546010909152919020555050565b6000805b60ff811015612d3a57826000612c4e8783612d43565b905085811015612c9e576000612c648887612de0565b612c6e8389613206565b612c8090670de0b6b3a764000061328a565b612c8a919061321d565b9050612c9681876132a9565b955050612ce0565b6000612caa8887612de0565b612cb48884613206565b612cc690670de0b6b3a764000061328a565b612cd0919061321d565b9050612cdc8187613206565b9550505b81851115612d09576001612cf48387613206565b11612d04578493505050506111b2565b612d25565b6001612d158684613206565b11612d25578493505050506111b2565b50508080612d32906132d7565b915050612c38565b50909392505050565b6000670de0b6b3a764000082818581612d5c828061328a565b612d66919061321d565b612d70919061328a565b612d7a919061321d565b612d84919061328a565b612d8e919061321d565b670de0b6b3a7640000808481612da4828061328a565b612dae919061321d565b612db8919061328a565b612dc2919061321d565b612dcc908661328a565b612dd6919061321d565b6111b291906132a9565b6000670de0b6b3a76400008381612df7828061328a565b612e01919061321d565b612e0b919061328a565b612e15919061321d565b670de0b6b3a764000080612e29858061328a565b612e33919061321d565b612e3e86600361328a565b612dcc919061328a565b80356001600160a01b038116811461299b57600080fd5b600080600080600060808688031215612e7757600080fd5b8535945060208601359350612e8e60408701612e48565b9250606086013567ffffffffffffffff80821115612eab57600080fd5b818801915088601f830112612ebf57600080fd5b813581811115612ece57600080fd5b896020828501011115612ee057600080fd5b9699959850939650602001949392505050565b60005b83811015612f0e578181015183820152602001612ef6565b83811115612f1d576000848401525b50505050565b6020815260008251806020840152612f42816040850160208701612ef3565b601f01601f19169190910160400192915050565b60008060408385031215612f6957600080fd5b612f7283612e48565b946020939093013593505050565b60008060008060808587031215612f9657600080fd5b612f9f85612e48565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b81811015612ff157835183529284019291840191600101612fd5565b50909695505050505050565b60006020828403121561300f57600080fd5b6111b282612e48565b60008060006060848603121561302d57600080fd5b61303684612e48565b925061304460208501612e48565b9150604084013590509250925092565b60006020828403121561306657600080fd5b5035919050565b60008060006060848603121561308257600080fd5b61308b84612e48565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156130bb57600080fd5b6130c488612e48565b96506130d260208901612e48565b95506040880135945060608801359350608088013560ff811681146130f657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561312657600080fd5b61312f83612e48565b915061313d60208401612e48565b90509250929050565b6000806040838503121561315957600080fd5b8235915061313d60208401612e48565b60006020828403121561317b57600080fd5b815180151581146111b257600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6000602082840312156131e957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613218576132186131f0565b500390565b60008261323a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061325357607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156132a4576132a46131f0565b500290565b600082198211156132bc576132bc6131f0565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156132eb576132eb6131f0565b5060010190565b600080835481600182811c91508083168061330e57607f831692505b602080841082141561332e57634e487b7160e01b86526022600452602486fd5b818015613342576001811461335357613380565b60ff19861689528489019650613380565b60008a81526020902060005b868110156133785781548b82015290850190830161335f565b505084890196505b509498975050505050505050565b600082516133a0818460208701612ef3565b919091019291505056fea26469706673582212207f58bd00d2eb96a539b3386a208faf0f615fc5343486932c3b3ede7daebbb1e364736f6c634300080b003360e060405234801561001057600080fd5b5060405161037038038061037083398101604081905261002f91610066565b336080526001600160a01b0391821660a0521660c052610099565b80516001600160a01b038116811461006157600080fd5b919050565b6000806040838503121561007957600080fd5b6100828361004a565b91506100906020840161004a565b90509250929050565b60805160a05160c0516102ab6100c5600039600060b601526000608501526000605001526102ab6000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063533cf5ce14610030575b600080fd5b61004361003e3660046101d0565b610045565b005b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461007a57600080fd5b81156100ab576100ab7f000000000000000000000000000000000000000000000000000000000000000084846100e1565b80156100dc576100dc7f000000000000000000000000000000000000000000000000000000000000000084836100e1565b505050565b6000836001600160a01b03163b116100f857600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916101549190610211565b6000604051808303816000865af19150503d8060008114610191576040519150601f19603f3d011682016040523d82523d6000602084013e610196565b606091505b50915091508180156101c05750805115806101c05750808060200190518101906101c0919061024c565b6101c957600080fd5b5050505050565b6000806000606084860312156101e557600080fd5b83356001600160a01b03811681146101fc57600080fd5b95602085013595506040909401359392505050565b6000825160005b818110156102325760208186018101518583015201610218565b81811115610241576000828501525b509190910192915050565b60006020828403121561025e57600080fd5b8151801515811461026e57600080fd5b939250505056fea2646970667358221220ff8d5cca7112533e8b3f4bd124fe1df06f370b59c00b61b393e9bdc701da368364736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063bda39cad116100c3578063d294f09311610087578063d294f09314610736578063d505accf1461073e578063dd62ed3e14610751578063ebeb31db1461077c578063f140a35a14610784578063fff6cae91461079757600080fd5b8063bda39cad146106eb578063bf944dbc146106f4578063c245febc146106fd578063c5700a0214610706578063d21220a71461070f57600080fd5b80639d63848a116101155780639d63848a146106145780639e8cc04b146106725780639f767c8814610685578063a1ac4d13146106a5578063a9059cbb146106c5578063bc25cf77146106d857600080fd5b80637ecebe001461057357806389afcb44146105935780638a7b8cf2146105bb57806395d89b41146105e55780639af1d35a146105ed57600080fd5b8063252c09d7116101ea5780634d5a9f8a116101ae5780634d5a9f8a146104f1578063517b3f82146105115780635881c475146105245780635a76f25e146105375780636a6278421461054057806370a082311461055357600080fd5b8063252c09d7146103cc578063313ce567146103df57806332c0defd146103f9578063392f37e914610402578063443cb4bc146104e857600080fd5b806313345fe11161023c57806313345fe11461033357806318160ddd146103535780631df8c7171461036a578063205aabf11461037257806322be3de11461039257806323b872dd146103b957600080fd5b8063022c0d9f1461027957806306fdde031461028e5780630902f1ac146102ac578063095ea7b3146102d15780630dfe1681146102f4575b600080fd5b61028c610287366004612e5f565b61079f565b005b610296610d7e565b6040516102a39190612f23565b60405180910390f35b600854600954600a545b604080519384526020840192909252908201526060016102a3565b6102e46102df366004612f56565b610e0c565b60405190151581526020016102a3565b61031b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b6040516001600160a01b0390911681526020016102a3565b610346610341366004612f80565b610e79565b6040516102a39190612fb9565b61035c60025481565b6040519081526020016102a3565b6102b6611081565b61035c610380366004612ffd565b60106020526000908152604090205481565b6102e47f000000000000000000000000000000000000000000000000000000000000000081565b6102e46103c7366004613018565b6110f0565b6102b66103da366004613054565b6111b9565b6103e7601281565b60405160ff90911681526020016102a3565b61035c600d5481565b600854600954604080517f0000000000000000000000000000000000000000000000000de0b6b3a764000081527f0000000000000000000000000000000000000000000000000de0b6b3a764000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83811660a08301527f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb71660c082015260e0016102a3565b61035c60085481565b61035c6104ff366004612ffd565b60116020526000908152604090205481565b61035c61051f366004612f56565b6111ec565b61034661053236600461306d565b6112d5565b61035c60095481565b61035c61054e366004612ffd565b6112e4565b61035c610561366004612ffd565b60046020526000908152604090205481565b61035c610581366004612ffd565b60066020526000908152604090205481565b6105a66105a1366004612ffd565b611541565b604080519283526020830191909152016102a3565b6105c361185e565b60408051825181526020808401519082015291810151908201526060016102a3565b6102966118de565b61031b7f000000000000000000000000d9aa26b264fdccbe166f44e40f6a1832e3d7abd481565b604080516001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83811682527f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb7166020820152016102a3565b61035c61068036600461306d565b6118eb565b61035c610693366004612ffd565b600f6020526000908152604090205481565b61035c6106b3366004612ffd565b60126020526000908152604090205481565b6102e46106d3366004612f56565b611958565b61028c6106e6366004612ffd565b61196e565b61035c600e5481565b61035c600b5481565b61035c600c5481565b61035c600a5481565b61031b7f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb781565b6105a6611a8c565b61028c61074c3660046130a0565b611bb3565b61035c61075f366004613113565b600360209081526000928352604080842090915290825290205481565b60075461035c565b61035c610792366004613146565b611ea8565b61028c611edf565b6013546001146107ae57600080fd5b60026013819055507f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc286001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613169565b1561084257600080fd5b60008511806108515750600084115b6108885760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600854600954818710801561089c57508086105b6108cd5760405162461bcd60e51b8152602060048201526002602482015261125360f21b604482015260640161087f565b6000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb76001600160a01b03898116908316148015906109405750806001600160a01b0316896001600160a01b031614155b6109715760405162461bcd60e51b8152602060048201526002602482015261125560f21b604482015260640161087f565b8a1561098257610982828a8d612019565b891561099357610993818a8c612019565b8615610a0057604051639a7bff7960e01b81526001600160a01b038a1690639a7bff79906109cd9033908f908f908e908e9060040161318b565b600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad391906131d7565b9250505060008985610ae59190613206565b8311610af2576000610b06565b610afc8a86613206565b610b069084613206565b90506000610b148a86613206565b8311610b21576000610b35565b610b2b8a86613206565b610b359084613206565b90506000821180610b465750600081115b610b785760405162461bcd60e51b815260206004820152600360248201526249494160e81b604482015260640161087f565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb78315610bd457610bd4610bcf6127108661321d565b612108565b8215610bee57610bee610be96127108561321d565b6121d5565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906131d7565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906131d7565b9450610ccd888861229b565b610cd7878761229b565b1015610d095760405162461bcd60e51b81526020600482015260016024820152604b60f81b604482015260640161087f565b5050610d17848488886123e7565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601355505050505050505050565b60008054610d8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610db79061323f565b8015610e045780601f10610dd957610100808354040283529160200191610e04565b820191906000526020600020905b815481529060010190602001808311610de757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e679086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610e9657610e96613274565b604051908082528060200260200182016040528015610ebf578160200160208202803683370190505b50600754909150600090610ed590600190613206565b90506000610ee3858761328a565b610eed9083613206565b90506000805b8383101561107157610f0587846132a9565b9150600060078481548110610f1c57610f1c6132c1565b90600052602060002090600302016000015460078481548110610f4157610f416132c1565b906000526020600020906003020160000154610f5d9190613206565b905060008160078681548110610f7557610f756132c1565b90600052602060002090600302016001015460078681548110610f9a57610f9a6132c1565b906000526020600020906003020160010154610fb69190613206565b610fc0919061321d565b905060008260078781548110610fd857610fd86132c1565b90600052602060002090600302016002015460078781548110610ffd57610ffd6132c1565b9060005260206000209060030201600201546110199190613206565b611023919061321d565b90506110318c8e848461257b565b888581518110611043576110436132c1565b60209081029190910101526110598460016132a9565b9350505050868361106a91906132a9565b9250610ef3565b509293505050505b949350505050565b600b54600c54426000808061109f600854600954600a549192909190565b9250925092508381146110e85760006110b88286613206565b90506110c4818561328a565b6110ce90886132a9565b96506110da818461328a565b6110e490876132a9565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061112a57506000198114155b156111a057600061113b8583613206565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6111ab868686612870565b6001925050505b9392505050565b600781815481106111c957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806111f761185e565b9050600080611204611081565b508451919350915042141561126d576007805461122390600290613206565b81548110611233576112336132c1565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b825160009061127c9042613206565b90506000818560200151856112919190613206565b61129b919061321d565b90506000828660400151856112b09190613206565b6112ba919061321d565b90506112c8888a848461257b565b9998505050505050505050565b60606110798484846001610e79565b60006013546001146112f557600080fd5b60026013556008546009546040516370a0823160e01b81523060048201526000907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a0823190602401602060405180830381865afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb716906370a0823190602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906131d7565b905060006114278584613206565b905060006114358584613206565b60025490915080611473576103e8611455611450848661328a565b612930565b61145f9190613206565b975061146e60006103e86129a0565b6114a8565b6114a587611481838661328a565b61148b919061321d565b87611496848661328a565b6114a0919061321d565b612a33565b97505b600088116114de5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b604482015260640161087f565b6114e889896129a0565b6114f4858589896123e7565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601355509395945050505050565b60008060135460011461155357600080fd5b60026013556008546009546040516370a0823160e01b81523060048201527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83907f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb7906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906131d7565b30600090815260046020526040902054600254919250908061169d858461328a565b6116a7919061321d565b9950806116b4848461328a565b6116be919061321d565b985060008a1180156116d05750600089115b6117025760405162461bcd60e51b815260206004820152600360248201526224a62160e91b604482015260640161087f565b61170c3083612a49565b611717868c8c612019565b611722858c8b612019565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f591906131d7565b925061180384848a8a6123e7565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601381905550915091565b61188260405180606001604052806000815260200160008152602001600081525090565b6007805461189290600190613206565b815481106118a2576118a26132c1565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610d8b9061323f565b6000806118fb8585856001610e79565b90506000805b82518110156119435782818151811061191c5761191c6132c1565b60200260200101518261192f91906132a9565b91508061193b816132d7565b915050611901565b5061194e848261321d565b9695505050505050565b6000611965338484612870565b50600192915050565b60135460011461197d57600080fd5b60026013556008546040516370a0823160e01b81523060048201527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83917f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb791611a4a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906131d7565b611a459190613206565b612019565b6009546040516370a0823160e01b8152306004820152611a829183918691906001600160a01b038416906370a08231906024016119fa565b5050600160135550565b600080611a9833612ad4565b50503360009081526011602090815260408083205460129092529091205481151580611ac45750600081115b15611baf573360008181526011602090815260408083208390556012909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f000000000000000000000000d9aa26b264fdccbe166f44e40f6a1832e3d7abd4169063533cf5ce90606401600060405180830381600087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611bf55760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b604482015260640161087f565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c2591906132f2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611cdb836132d7565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611d5492919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611dbf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611df55750886001600160a01b0316816001600160a01b0316145b611e415760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e415455524500000000000000604482015260640161087f565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b60085460095460009190611ebe6127108661321d565b611ec89086613206565b9450611ed68585848461257b565b95945050505050565b601354600114611eee57600080fd5b60026013556040516370a0823160e01b8152306004820152612012907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a0823190602401602060405180830381865afa158015611f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7f91906131d7565b6040516370a0823160e01b81523060048201527f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb76001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200791906131d7565b6008546009546123e7565b6001601355565b6000836001600160a01b03163b1161203057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161208c919061338e565b6000604051808303816000865af19150503d80600081146120c9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ce565b606091505b50915091508180156120f85750805115806120f85750808060200190518101906120f89190613169565b61210157600080fd5b5050505050565b6121537f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f000000000000000000000000d9aa26b264fdccbe166f44e40f6a1832e3d7abd483612019565b60025460009061216b83670de0b6b3a764000061328a565b612175919061321d565b905080156121955780600d600082825461218f91906132a9565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b6122207f0000000000000000000000006c021ae822bea943b2e66552bde1d2696a53fbb77f000000000000000000000000d9aa26b264fdccbe166f44e40f6a1832e3d7abd483612019565b60025460009061223883670de0b6b3a764000061328a565b612242919061321d565b905080156122625780600e600082825461225c91906132a9565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291016121c9565b60007f0000000000000000000000000000000000000000000000000000000000000000156123d65760007f0000000000000000000000000000000000000000000000000de0b6b3a76400006122f885670de0b6b3a764000061328a565b612302919061321d565b905060007f0000000000000000000000000000000000000000000000000de0b6b3a764000061233985670de0b6b3a764000061328a565b612343919061321d565b90506000670de0b6b3a764000061235a838561328a565b612364919061321d565b90506000670de0b6b3a764000061237b848061328a565b612385919061321d565b670de0b6b3a7640000612398868061328a565b6123a2919061321d565b6123ac91906132a9565b9050670de0b6b3a76400006123c1828461328a565b6123cb919061321d565b945050505050610e73565b6123e0828461328a565b9050610e73565b600a5442906000906123f99083613206565b905060008111801561240a57508315155b801561241557508215155b1561245c57612424818561328a565b600b600082825461243591906132a9565b909155506124459050818461328a565b600c600082825461245691906132a9565b90915550505b600061246661185e565b80519091506124759084613206565b915061070882111561252a5760408051606081018252848152600b5460208201908152600c549282019283526007805460018101825560009190915291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600390930292830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555b60088790556009869055600a83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156127fe5760006125af848461229b565b90507f0000000000000000000000000000000000000000000000000de0b6b3a76400006125e485670de0b6b3a764000061328a565b6125ee919061321d565b93507f0000000000000000000000000000000000000000000000000de0b6b3a764000061262384670de0b6b3a764000061328a565b61262d919061321d565b92506000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316876001600160a01b031614612672578486612675565b85855b915091507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316876001600160a01b0316146126f4577f0000000000000000000000000000000000000000000000000de0b6b3a76400006126e589670de0b6b3a764000061328a565b6126ef919061321d565b612731565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000061272789670de0b6b3a764000061328a565b612731919061321d565b97506000612749612742848b6132a9565b8584612c34565b6127539083613206565b9050670de0b6b3a76400007f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316896001600160a01b0316146127bd577f0000000000000000000000000000000000000000000000000de0b6b3a76400006127df565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400005b6127e9908361328a565b6127f3919061321d565b945050505050611079565b6000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316866001600160a01b031614612841578385612844565b84845b909250905061285387836132a9565b61285d828961328a565b612867919061321d565b92505050611079565b61287983612ad4565b61288282612ad4565b6001600160a01b038316600090815260046020526040812080548392906128aa908490613206565b90915550506001600160a01b038216600090815260046020526040812080548392906128d79084906132a9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292391815260200190565b60405180910390a3505050565b60006003821115612991575080600061294a60028361321d565b6129559060016132a9565b90505b8181101561298b57905080600281612970818661321d565b61297a91906132a9565b612984919061321d565b9050612958565b50919050565b811561299b575060015b919050565b6129a982612ad4565b80600260008282546129bb91906132a9565b90915550506001600160a01b038216600090815260046020526040812080548392906129e89084906132a9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612a4257816111b2565b5090919050565b612a5282612ad4565b8060026000828254612a649190613206565b90915550506001600160a01b03821660009081526004602052604081208054839290612a91908490613206565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612a27565b6001600160a01b0381166000908152600460205260409020548015612c02576001600160a01b0382166000908152600f60209081526040808320805460108085529285208054600d54600e54948190559490955282905593612b368584613206565b90506000612b448584613206565b90508115612b9f576000670de0b6b3a7640000612b61848a61328a565b612b6b919061321d565b6001600160a01b038a16600090815260116020526040812080549293508392909190612b989084906132a9565b9091555050505b8015612bf8576000670de0b6b3a7640000612bba838a61328a565b612bc4919061321d565b6001600160a01b038a16600090815260126020526040812080549293508392909190612bf19084906132a9565b9091555050505b5050505050505050565b600d546001600160a01b0383166000908152600f6020908152604080832093909355600e546010909152919020555050565b6000805b60ff811015612d3a57826000612c4e8783612d43565b905085811015612c9e576000612c648887612de0565b612c6e8389613206565b612c8090670de0b6b3a764000061328a565b612c8a919061321d565b9050612c9681876132a9565b955050612ce0565b6000612caa8887612de0565b612cb48884613206565b612cc690670de0b6b3a764000061328a565b612cd0919061321d565b9050612cdc8187613206565b9550505b81851115612d09576001612cf48387613206565b11612d04578493505050506111b2565b612d25565b6001612d158684613206565b11612d25578493505050506111b2565b50508080612d32906132d7565b915050612c38565b50909392505050565b6000670de0b6b3a764000082818581612d5c828061328a565b612d66919061321d565b612d70919061328a565b612d7a919061321d565b612d84919061328a565b612d8e919061321d565b670de0b6b3a7640000808481612da4828061328a565b612dae919061321d565b612db8919061328a565b612dc2919061321d565b612dcc908661328a565b612dd6919061321d565b6111b291906132a9565b6000670de0b6b3a76400008381612df7828061328a565b612e01919061321d565b612e0b919061328a565b612e15919061321d565b670de0b6b3a764000080612e29858061328a565b612e33919061321d565b612e3e86600361328a565b612dcc919061328a565b80356001600160a01b038116811461299b57600080fd5b600080600080600060808688031215612e7757600080fd5b8535945060208601359350612e8e60408701612e48565b9250606086013567ffffffffffffffff80821115612eab57600080fd5b818801915088601f830112612ebf57600080fd5b813581811115612ece57600080fd5b896020828501011115612ee057600080fd5b9699959850939650602001949392505050565b60005b83811015612f0e578181015183820152602001612ef6565b83811115612f1d576000848401525b50505050565b6020815260008251806020840152612f42816040850160208701612ef3565b601f01601f19169190910160400192915050565b60008060408385031215612f6957600080fd5b612f7283612e48565b946020939093013593505050565b60008060008060808587031215612f9657600080fd5b612f9f85612e48565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b81811015612ff157835183529284019291840191600101612fd5565b50909695505050505050565b60006020828403121561300f57600080fd5b6111b282612e48565b60008060006060848603121561302d57600080fd5b61303684612e48565b925061304460208501612e48565b9150604084013590509250925092565b60006020828403121561306657600080fd5b5035919050565b60008060006060848603121561308257600080fd5b61308b84612e48565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156130bb57600080fd5b6130c488612e48565b96506130d260208901612e48565b95506040880135945060608801359350608088013560ff811681146130f657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561312657600080fd5b61312f83612e48565b915061313d60208401612e48565b90509250929050565b6000806040838503121561315957600080fd5b8235915061313d60208401612e48565b60006020828403121561317b57600080fd5b815180151581146111b257600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6000602082840312156131e957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613218576132186131f0565b500390565b60008261323a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061325357607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156132a4576132a46131f0565b500290565b600082198211156132bc576132bc6131f0565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156132eb576132eb6131f0565b5060010190565b600080835481600182811c91508083168061330e57607f831692505b602080841082141561332e57634e487b7160e01b86526022600452602486fd5b818015613342576001811461335357613380565b60ff19861689528489019650613380565b60008a81526020902060005b868110156133785781548b82015290850190830161335f565b505084890196505b509498975050505050505050565b600082516133a0818460208701612ef3565b919091019291505056fea26469706673582212207f58bd00d2eb96a539b3386a208faf0f615fc5343486932c3b3ede7daebbb1e364736f6c634300080b0033
Deployed Bytecode Sourcemap
2455:23414:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17225:2431;;;;;;:::i;:::-;;:::i;:::-;;2484:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9927:223;10052:8;;10083;;10124:18;;9927:223;;;;1852:25:1;;;1908:2;1893:18;;1886:34;;;;1936:18;;;1929:34;1840:2;1825:18;9927:223:0;1650:319:1;23264:206:0;;;;;;:::i;:::-;;:::i;:::-;;;2398:14:1;;2391:22;2373:41;;2361:2;2346:18;23264:206:0;2233:187:1;3288:31:0;;;;;;;;-1:-1:-1;;;;;2589:32:1;;;2571:51;;2559:2;2544:18;3288:31:0;2425:203:1;13622:902:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2767:27::-;;;;;;;;;3812:25:1;;;3800:2;3785:18;2767:27:0;3666:177:1;11306:777:0;;;:::i;4460:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;2730:28;;;;;24704:511;;;;;;:::i;:::-;;:::i;3744:33::-;;;;;;:::i;:::-;;:::i;2536:35::-;;2569:2;2536:35;;;;;4729:4:1;4717:17;;;4699:36;;4687:2;4672:18;2536:35:0;4557:184:1;4250:22:0;;;;;;6852:208;7009:8;;7019;;6852:208;;;6987:9;5055:25:1;;6998:9:0;5111:2:1;5096:18;;5089:34;5139:18;;;5132:34;;;;5197:2;5182:18;;5175:34;7029:6:0;5253:14:1;5246:22;5240:3;5225:19;;5218:51;-1:-1:-1;;;;;7037:6:0;5344:15:1;;5296:3;5323:19;;5316:44;7045:6:0;5397:15:1;5391:3;5376:19;;5369:44;5042:3;5027:19;6852:208:0;4746:673:1;3868:20:0;;;;;;4608:42;;;;;;:::i;:::-;;;;;;;;;;;;;;12177:723;;;;;;:::i;:::-;;:::i;13453:161::-;;;;;;:::i;:::-;;:::i;3895:20::-;;;;;;14679:1072;;;;;;:::i;:::-;;:::i;2872:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3184:38;;;;;;:::i;:::-;;;;;;;;;;;;;;15906:1207;;;;;;:::i;:::-;;:::i;:::-;;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;;5898:18;15906:1207:0;5751:248:1;6715:129:0;;;:::i;:::-;;;;6224:13:1;;6206:32;;6294:4;6282:17;;;6276:24;6254:20;;;6247:54;6345:17;;;6339:24;6317:20;;;6310:54;6194:2;6179:18;6715:129:0;6004:366:1;2509:20:0;;;:::i;3364:29::-;;;;;7068:101;;;;-1:-1:-1;;;;;7146:6:0;6605:15:1;;6587:34;;7154:6:0;6657:15:1;6652:2;6637:18;;6630:43;6522:18;7068:101:0;6375:304:1;13005:396:0;;;;;;:::i;:::-;;:::i;4409:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;4657:42;;;;;;:::i;:::-;;;;;;;;;;;;;;24547:149;;;;;;:::i;:::-;;:::i;19705:294::-;;;;;;:::i;:::-;;:::i;4279:22::-;;;;;;3961:34;;;;;;4002;;;;;;3922:30;;;;;;3326:31;;;;;7263:489;;;:::i;23478:1061::-;;;;;;:::i;:::-;;:::i;2803:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;6604:103;6680:12;:19;6604:103;;21186:303;;;;;;:::i;:::-;;:::i;20048:156::-;;;:::i;17225:2431::-;6513:9;;6526:1;6513:14;6505:23;;;;;;6551:1;6539:9;:13;;;;17354:7:::1;-1:-1:-1::0;;;;;17340:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17339:34;17331:43;;;::::0;::::1;;17406:1;17393:10;:14;:32;;;;17424:1;17411:10;:14;17393:32;17385:48;;;::::0;-1:-1:-1;;;17385:48:0;;8390:2:1;17385:48:0::1;::::0;::::1;8372:21:1::0;8429:1;8409:18;;;8402:29;-1:-1:-1;;;8447:18:1;;;8440:33;8490:18;;17385:48:0::1;;;;;;;;;17519:8;::::0;17529::::1;::::0;17557:22;;::::1;:48:::0;::::1;;;;17596:9;17583:10;:22;17557:48;17549:63;;;::::0;-1:-1:-1;;;17549:63:0;;8721:2:1;17549:63:0::1;::::0;::::1;8703:21:1::0;8760:1;8740:18;;;8733:29;-1:-1:-1;;;8778:18:1;;;8771:32;8820:18;;17549:63:0::1;8519:325:1::0;17549:63:0::1;17659:14;::::0;17813:6:::1;17821;-1:-1:-1::0;;;;;17847:13:0;;::::1;::::0;;::::1;;::::0;::::1;::::0;:30:::1;;;17870:7;-1:-1:-1::0;;;;;17864:13:0::1;:2;-1:-1:-1::0;;;;;17864:13:0::1;;;17847:30;17839:45;;;::::0;-1:-1:-1;;;17839:45:0;;9051:2:1;17839:45:0::1;::::0;::::1;9033:21:1::0;9090:1;9070:18;;;9063:29;-1:-1:-1;;;9108:18:1;;;9101:32;9150:18;;17839:45:0::1;8849:325:1::0;17839:45:0::1;17921:14:::0;;17917:58:::1;;17937:38;17951:7;17960:2;17964:10;17937:13;:38::i;:::-;18024:14:::0;;18020:58:::1;;18040:38;18054:7;18063:2;18067:10;18040:13;:38::i;:::-;18127:15:::0;;18123:85:::1;;18144:64;::::0;-1:-1:-1;;;18144:64:0;;-1:-1:-1;;;;;18144:22:0;::::1;::::0;::::1;::::0;:64:::1;::::0;18167:10:::1;::::0;18179;;18191;;18203:4;;;;18144:64:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18123:85;18265:39;::::0;-1:-1:-1;;;18265:39:0;;18298:4:::1;18265:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;18265:24:0;::::1;::::0;::::1;::::0;2544:18:1;;18265:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18327;::::0;-1:-1:-1;;;18327:39:0;;18360:4:::1;18327:39;::::0;::::1;2571:51:1::0;18253::0;;-1:-1:-1;;;;;;18327:24:0;::::1;::::0;::::1;::::0;2544:18:1;;18327:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18315:51;;17709:669;;18388:14;18429:10;18417:9;:22;;;;:::i;:::-;18405:9;:34;:77;;18481:1;18405:77;;;18455:22;18467:10:::0;18455:9;:22:::1;:::i;:::-;18442:36;::::0;:9;:36:::1;:::i;:::-;18388:94:::0;-1:-1:-1;18493:14:0::1;18522:22;18534:10:::0;18522:9;:22:::1;:::i;:::-;18510:9;:34;:77;;18586:1;18510:77;;;18560:22;18572:10:::0;18560:9;:22:::1;:::i;:::-;18547:36;::::0;:9;:36:::1;:::i;:::-;18493:94;;18618:1;18606:9;:13;:30;;;;18635:1;18623:9;:13;18606:30;18598:46;;;::::0;-1:-1:-1;;;18598:46:0;;10469:2:1;18598:46:0::1;::::0;::::1;10451:21:1::0;10508:1;10488:18;;;10481:29;-1:-1:-1;;;10526:18:1;;;10519:33;10569:18;;18598:46:0::1;10267:326:1::0;18598:46:0::1;18805:6;18813;18835:13:::0;;18831:46:::1;;18850:27;18859:17;18871:5;18859:9:::0;:17:::1;:::i;:::-;18850:8;:27::i;:::-;18944:13:::0;;18940:46:::1;;18959:27;18968:17;18980:5;18968:9:::0;:17:::1;:::i;:::-;18959:8;:27::i;:::-;19061:39;::::0;-1:-1:-1;;;19061:39:0;;19094:4:::1;19061:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;19061:24:0;::::1;::::0;::::1;::::0;2544:18:1;;19061:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19280;::::0;-1:-1:-1;;;19280:39:0;;19313:4:::1;19280:39;::::0;::::1;2571:51:1::0;19049::0;;-1:-1:-1;;;;;;19280:24:0;::::1;::::0;::::1;::::0;2544:18:1;;19280:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19268:51;;19448:24;19451:9;19462;19448:2;:24::i;:::-;19420;19423:9;19434;19420:2;:24::i;:::-;:52;;19412:66;;;::::0;-1:-1:-1;;;19412:66:0;;11022:2:1;19412:66:0::1;::::0;::::1;11004:21:1::0;11061:1;11041:18;;;11034:29;-1:-1:-1;;;11079:18:1;;;11072:31;11120:18;;19412:66:0::1;10820:324:1::0;19412:66:0::1;18692:811;;19515:51;19523:9;19534;19545;19556;19515:7;:51::i;:::-;19582:66;::::0;;11380:25:1;;;11436:2;11421:18;;11414:34;;;11464:18;;;11457:34;;;11522:2;11507:18;;11500:34;;;-1:-1:-1;;;;;19582:66:0;::::1;::::0;19587:10:::1;::::0;19582:66:::1;::::0;11367:3:1;11352:19;19582:66:0::1;;;;;;;-1:-1:-1::0;;6587:1:0;6575:9;:13;-1:-1:-1;;;;;;;;;17225:2431:0:o;2484:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23264:206::-;23356:10;23329:4;23346:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;23346:30:0;;;;;;;;;;:39;;;23403:37;23329:4;;23346:30;;23403:37;;;;23379:6;3812:25:1;;3800:2;3785:18;;3666:177;23403:37:0;;;;;;;;-1:-1:-1;23458:4:0;23264:206;;;;;:::o;13622:902::-;13717:13;13743:21;13778:6;13767:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13767:18:0;-1:-1:-1;13812:12:0;:19;13743:42;;-1:-1:-1;13798:11:0;;13812:21;;13832:1;;13812:21;:::i;:::-;13798:35;-1:-1:-1;13844:6:0;13863:15;13872:6;13863;:15;:::i;:::-;13853:26;;:6;:26;:::i;:::-;13844:35;;13890:14;13919:10;13946:546;13957:6;13953:1;:10;13946:546;;;14003:10;14007:6;14003:1;:10;:::i;:::-;13991:22;;14028:16;14083:12;14096:1;14083:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;14047:12;14060:9;14047:23;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:61;;;;:::i;:::-;14028:80;;14123:14;14224:11;14186:12;14199:1;14186:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;14141:12;14154:9;14141:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;14140:95;;;;:::i;:::-;14123:112;;14250:14;14351:11;14313:12;14326:1;14313:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;14268:12;14281:9;14268:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;14267:95;;;;:::i;:::-;14250:112;;14394:54;14408:8;14418:7;14427:9;14438;14394:13;:54::i;:::-;14377:7;14385:5;14377:14;;;;;;;;:::i;:::-;;;;;;;;;;:71;14471:9;:5;14479:1;14471:9;:::i;:::-;14463:17;;13976:516;;;13968:6;13965:9;;;;;:::i;:::-;;;13946:546;;;-1:-1:-1;14509:7:0;;-1:-1:-1;;;;13622:902:0;;;;;;;:::o;11306:777::-;11508:22;;11562;;11461:15;11362:23;;;11759:13;10052:8;;10083;;10124:18;;10052:8;;10083;;10124:18;9927:223;11759:13;11698:74;;;;;;11810:14;11787:19;:37;11783:293;;11889:16;11908:36;11925:19;11908:14;:36;:::i;:::-;11889:55;-1:-1:-1;11981:23:0;11889:55;11981:9;:23;:::i;:::-;11959:45;;;;:::i;:::-;;-1:-1:-1;12041:23:0;12053:11;12041:9;:23;:::i;:::-;12019:45;;;;:::i;:::-;;;11826:250;11783:293;11433:650;;;11306:777;;;:::o;24704:511::-;-1:-1:-1;;;;;24863:14:0;;24783:4;24863:14;;;:9;:14;;;;;;;;24818:10;24863:23;;;;;;;;24783:4;;24818:10;;24863:23;24903:14;;;;;:52;;;-1:-1:-1;;24921:16:0;:34;;24903:52;24899:241;;;24972:17;24992:25;25011:6;24992:16;:25;:::i;:::-;-1:-1:-1;;;;;25032:14:0;;;;;;;:9;:14;;;;;;;;:23;;;;;;;;;;;;;:38;;;25092:36;;3812:25:1;;;25032:38:0;;-1:-1:-1;25032:23:0;;:14;;25092:36;;3785:18:1;25092:36:0;;;;;;;24957:183;24899:241;25152:33;25168:3;25173;25178:6;25152:15;:33::i;:::-;25203:4;25196:11;;;;24704:511;;;;;;:::o;3744:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3744:33:0;:::o;12177:723::-;12249:14;12276:31;12310:17;:15;:17::i;:::-;12276:51;;12339:23;12364;12392:25;:23;:25::i;:::-;-1:-1:-1;12451:22:0;;12338:79;;-1:-1:-1;12338:79:0;-1:-1:-1;12432:15:0;:41;12428:124;;;12505:12;12518:19;;:21;;12538:1;;12518:21;:::i;:::-;12505:35;;;;;;;;:::i;:::-;;;;;;;;;;;12490:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12428:124;12601:22;;12564:16;;12583:40;;:15;:40;:::i;:::-;12564:59;;12634:14;12708:11;12673:12;:31;;;12652:18;:52;;;;:::i;:::-;12651:68;;;;:::i;:::-;12634:85;;12730:14;12804:11;12769:12;:31;;;12748:18;:52;;;;:::i;:::-;12747:68;;;;:::i;:::-;12730:85;;12838:54;12852:8;12862:7;12871:9;12882;12838:13;:54::i;:::-;12826:66;12177:723;-1:-1:-1;;;;;;;;;12177:723:0:o;13453:161::-;13537:13;13570:36;13577:7;13586:8;13596:6;13604:1;13570:6;:36::i;14679:1072::-;14728:14;6513:9;;6526:1;6513:14;6505:23;;;;;;6551:1;6539:9;:13;14791:8:::1;::::0;14801::::1;::::0;14838:38:::1;::::0;-1:-1:-1;;;14838:38:0;;14870:4:::1;14838:38;::::0;::::1;2571:51:1::0;14756:14:0::1;::::0;14844:6:::1;-1:-1:-1::0;;;;;14838:23:0::1;::::0;::::1;::::0;2544:18:1;;14838:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14904;::::0;-1:-1:-1;;;14904:38:0;;14936:4:::1;14904:38;::::0;::::1;2571:51:1::0;14821:55:0;;-1:-1:-1;14887:14:0::1;::::0;-1:-1:-1;;;;;14910:6:0::1;14904:23;::::0;::::1;::::0;2544:18:1;;14904:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14887:55:::0;-1:-1:-1;14953:13:0::1;14969:21;14981:9:::0;14969;:21:::1;:::i;:::-;14953:37:::0;-1:-1:-1;15001:13:0::1;15017:21;15029:9:::0;15017;:21:::1;:::i;:::-;15071:11;::::0;15001:37;;-1:-1:-1;15175:17:0;15171:345:::1;;3274:5;15221:30;15231:19;15242:8:::0;15231;:19:::1;:::i;:::-;15221:9;:30::i;:::-;:50;;;;:::i;:::-;15209:62;;15286:36;15300:1;3274:5;15286;:36::i;:::-;15171:345;;;15422:82;15457:9:::0;15431:23:::1;15442:12:::0;15431:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;15494:9:::0;15468:23:::1;15479:12:::0;15468:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;15422:8;:82::i;:::-;15410:94;;15171:345;15546:1;15534:9;:13;15526:29;;;::::0;-1:-1:-1;;;15526:29:0;;12702:2:1;15526:29:0::1;::::0;::::1;12684:21:1::0;12741:1;12721:18;;;12714:29;-1:-1:-1;;;12759:18:1;;;12752:33;12802:18;;15526:29:0::1;12500:326:1::0;15526:29:0::1;15607:20;15613:2;15617:9;15607:5;:20::i;:::-;15640:51;15648:9;15659;15670;15681;15640:7;:51::i;:::-;15707:36;::::0;;5925:25:1;;;5981:2;5966:18;;5959:34;;;15712:10:0::1;::::0;15707:36:::1;::::0;5898:18:1;15707:36:0::1;;;;;;;-1:-1:-1::0;;6587:1:0;6575:9;:13;-1:-1:-1;14679:1072:0;;;-1:-1:-1;;;;;14679:1072:0:o;15906:1207::-;15955:12;15969;6513:9;;6526:1;6513:14;6505:23;;;;;;6551:1;6539:9;:13;16030:8:::1;::::0;16040::::1;::::0;16141:39:::1;::::0;-1:-1:-1;;;16141:39:0;;16174:4:::1;16141:39;::::0;::::1;2571:51:1::0;16098:6:0::1;::::0;16106::::1;::::0;15995:14:::1;::::0;-1:-1:-1;;;;;16141:24:0;::::1;::::0;::::1;::::0;2544:18:1;;16141:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16208;::::0;-1:-1:-1;;;16208:39:0;;16241:4:::1;16208:39;::::0;::::1;2571:51:1::0;16124:56:0;;-1:-1:-1;16191:14:0::1;::::0;-1:-1:-1;;;;;16208:24:0;::::1;::::0;::::1;::::0;2544:18:1;;16208:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16294:4;16258:15;16276:24:::0;;;:9:::1;:24;::::0;;;;;16333:11:::1;::::0;16191:56;;-1:-1:-1;16276:24:0;16333:11;16443:22:::1;16456:9:::0;16276:24;16443:22:::1;:::i;:::-;:37;;;;:::i;:::-;16433:47:::0;-1:-1:-1;16574:12:0;16549:22:::1;16562:9:::0;16549:10;:22:::1;:::i;:::-;:37;;;;:::i;:::-;16539:47;;16663:1;16653:7;:11;:26;;;;;16678:1;16668:7;:11;16653:26;16645:42;;;::::0;-1:-1:-1;;;16645:42:0;;13033:2:1;16645:42:0::1;::::0;::::1;13015:21:1::0;13072:1;13052:18;;;13045:29;-1:-1:-1;;;13090:18:1;;;13083:33;13133:18;;16645:42:0::1;12831:326:1::0;16645:42:0::1;16739:32;16753:4;16760:10;16739:5;:32::i;:::-;16782:35;16796:7;16805:2;16809:7;16782:13;:35::i;:::-;16828;16842:7;16851:2;16855:7;16828:13;:35::i;:::-;16886:39;::::0;-1:-1:-1;;;16886:39:0;;16919:4:::1;16886:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;16886:24:0;::::1;::::0;::::1;::::0;2544:18:1;;16886:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16948;::::0;-1:-1:-1;;;16948:39:0;;16981:4:::1;16948:39;::::0;::::1;2571:51:1::0;16874::0;;-1:-1:-1;;;;;;16948:24:0;::::1;::::0;::::1;::::0;2544:18:1;;16948:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16936:51;;17000;17008:9;17019;17030;17041;17000:7;:51::i;:::-;17067:38;::::0;;5925:25:1;;;5981:2;5966:18;;5959:34;;;-1:-1:-1;;;;;17067:38:0;::::1;::::0;17072:10:::1;::::0;17067:38:::1;::::0;5898:18:1;17067:38:0::1;;;;;;;15983:1130;;;;;;;;6587:1:::0;6575:9;:13;;;;15906:1207;;;:::o;6715:129::-;6763:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;6763:18:0;6801:12;6814:19;;:21;;6834:1;;6814:21;:::i;:::-;6801:35;;;;;;;;:::i;:::-;;;;;;;;;;;6794:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6715:129;:::o;2509:20::-;;;;;;;:::i;13005:396::-;13093:14;13120:22;13145:41;13152:7;13161:8;13171:11;13184:1;13145:6;:41::i;:::-;13120:66;-1:-1:-1;13197:27:0;;13235:105;13256:7;:14;13252:1;:18;13235:105;;;13318:7;13326:1;13318:10;;;;;;;;:::i;:::-;;;;;;;13292:36;;;;;:::i;:::-;;-1:-1:-1;13272:3:0;;;;:::i;:::-;;;;13235:105;;;-1:-1:-1;13357:36:0;13382:11;13357:22;:36;:::i;:::-;13350:43;13005:396;-1:-1:-1;;;;;;13005:396:0:o;24547:149::-;24609:4;24626:40;24642:10;24654:3;24659:6;24626:15;:40::i;:::-;-1:-1:-1;24684:4:0;24547:149;;;;:::o;19705:294::-;6513:9;;6526:1;6513:14;6505:23;;;;;;6551:1;6539:9;:13;19890:8:::1;::::0;19847:39:::1;::::0;-1:-1:-1;;;19847:39:0;;19880:4:::1;19847:39;::::0;::::1;2571:51:1::0;19794:6:0::1;::::0;19802::::1;::::0;19820:80:::1;::::0;19794:6;;19843:2;;19890:8;-1:-1:-1;;;;;19847:24:0;::::1;::::0;::::1;::::0;2544:18:1;;19847:39:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;19820:13;:80::i;:::-;19981:8;::::0;19938:39:::1;::::0;-1:-1:-1;;;19938:39:0;;19971:4:::1;19938:39;::::0;::::1;2571:51:1::0;19911:80:0::1;::::0;19925:7;;19934:2;;19981:8;-1:-1:-1;;;;;19938:24:0;::::1;::::0;::::1;::::0;2544:18:1;;19938:39:0::1;2425:203:1::0;19911:80:0::1;-1:-1:-1::0;;6587:1:0;6575:9;:13;-1:-1:-1;19705:294:0:o;7263:489::-;7302:13;7317;7343:22;7354:10;7343;:22::i;:::-;-1:-1:-1;;7400:10:0;7389:22;;;;:10;:22;;;;;;;;;7433:10;:22;;;;;;;7472:12;;;;:28;;;7499:1;7488:8;:12;7472:28;7468:277;;;7528:10;7542:1;7517:22;;;:10;:22;;;;;;;;:26;;;7558:10;:22;;;;;;:26;;;;7601:61;-1:-1:-1;;;7601:61:0;;;;;13504:51:1;;;;13571:18;;;13564:34;;;13614:18;;;13607:34;;;-1:-1:-1;;;;;7612:4:0;7601:29;;;;13477:18:1;;7601:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7684:49:0;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;7702:10:0;;-1:-1:-1;7702:10:0;;-1:-1:-1;7684:49:0;;5898:18:1;7684:49:0;;;;;;;7468:277;7263:489;;:::o;23478:1061::-;23624:15;23612:8;:27;;23604:55;;;;-1:-1:-1;;;23604:55:0;;13854:2:1;23604:55:0;;;13836:21:1;13893:2;13873:18;;;13866:30;-1:-1:-1;;;13912:18:1;;;13905:45;13967:18;;23604:55:0;13652:339:1;23604:55:0;23742:95;23872:4;23856:22;;;;;;:::i;:::-;;;;;;;;;;23713:277;;;15493:25:1;;;;15534:18;;15527:34;;;;23897:14:0;15577:18:1;;;15570:34;23930:13:0;15620:18:1;;;15613:34;23970:4:0;15663:19:1;;;15656:61;15465:19;;23713:277:0;;;-1:-1:-1;;23713:277:0;;;;;;;;;23689:312;;23713:277;23689:312;;;;23670:16;:331;;;-1:-1:-1;;;;;24213:13:0;;24012:14;24213:13;;;:6;:13;;;;;;:15;;3111:66;;24190:5;;24197:7;;24206:5;;24213:15;24012:14;24213:15;;;:::i;:::-;;;;-1:-1:-1;24162:77:0;;;;;;16015:25:1;;;;-1:-1:-1;;;;;16114:15:1;;;16094:18;;;16087:43;16166:15;;;;16146:18;;;16139:43;16198:18;;;16191:34;16241:19;;;16234:35;16285:19;;;16278:35;;;15987:19;;24162:77:0;;;;;;;;;;;;24152:88;;;;;;24053:202;;;;;;;;-1:-1:-1;;;16582:27:1;;16634:1;16625:11;;16618:27;;;;16670:2;16661:12;;16654:28;16707:2;16698:12;;16324:392;24053:202:0;;;;-1:-1:-1;;24053:202:0;;;;;;;;;24029:237;;24053:202;24029:237;;;;24277:24;24304:26;;;;;;;;;16948:25:1;;;17021:4;17009:17;;16989:18;;;16982:45;;;;17043:18;;;17036:34;;;17086:18;;;17079:34;;;24029:237:0;;-1:-1:-1;24277:24:0;24304:26;;16920:19:1;;24304:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24304:26:0;;-1:-1:-1;;24304:26:0;;;-1:-1:-1;;;;;;;24349:30:0;;;;;;:59;;;24403:5;-1:-1:-1;;;;;24383:25:0;:16;-1:-1:-1;;;;;24383:25:0;;24349:59;24341:97;;;;-1:-1:-1;;;24341:97:0;;17326:2:1;24341:97:0;;;17308:21:1;17365:2;17345:18;;;17338:30;17404:27;17384:18;;;17377:55;17449:18;;24341:97:0;17124:349:1;24341:97:0;-1:-1:-1;;;;;24449:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;24500:31;;3812:25:1;;;24500:31:0;;3785:18:1;24500:31:0;;;;;;;23593:946;;23478:1061;;;;;;;:::o;21186:303::-;21316:8;;21326;;21263:4;;21316:8;21358:16;21369:5;21358:8;:16;:::i;:::-;21346:28;;;;:::i;:::-;;;21427:54;21441:8;21451:7;21460:9;21471;21427:13;:54::i;:::-;21420:61;21186:303;-1:-1:-1;;;;;21186:303:0:o;20048:156::-;6513:9;;6526:1;6513:14;6505:23;;;;;;6551:1;6539:9;:13;20097:38:::1;::::0;-1:-1:-1;;;20097:38:0;;20129:4:::1;20097:38;::::0;::::1;2571:51:1::0;20089:107:0::1;::::0;20103:6:::1;-1:-1:-1::0;;;;;20097:23:0::1;::::0;::::1;::::0;2544:18:1;;20097:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20137;::::0;-1:-1:-1;;;20137:38:0;;20169:4:::1;20137:38;::::0;::::1;2571:51:1::0;20143:6:0::1;-1:-1:-1::0;;;;;20137:23:0::1;::::0;::::1;::::0;2544:18:1;;20137:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20177:8;;20187;;20089:7;:107::i;:::-;6587:1:::0;6575:9;:13;20048:156::o;25542:324::-;25653:1;25633:5;-1:-1:-1;;;;;25633:17:0;;:21;25625:30;;;;;;25722:58;;;-1:-1:-1;;;;;17670:32:1;;;25722:58:0;;;17652:51:1;17719:18;;;;17712:34;;;25722:58:0;;;;;;;;;;17625:18:1;;;;25722:58:0;;;;;;;-1:-1:-1;;;;;25722:58:0;-1:-1:-1;;;25722:58:0;;;25711:70;;-1:-1:-1;;;;25711:10:0;;;;:70;;25722:58;25711:70;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:115;;;;25800:7;:57;;;;-1:-1:-1;25812:11:0;;:16;;:44;;;25843:4;25832:24;;;;;;;;;;;;:::i;:::-;25792:66;;;;;;25614:252;;25542:324;;;:::o;7790:343::-;7841:35;7855:6;7863:4;7869:6;7841:13;:35::i;:::-;7959:11;;7926:14;;7943:13;:6;7952:4;7943:13;:::i;:::-;:27;;;;:::i;:::-;7926:44;-1:-1:-1;8028:10:0;;8024:59;;8065:6;8055;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;8024:59:0;8098:27;;;5925:25:1;;;8123:1:0;5981:2:1;5966:18;;5959:34;8103:10:0;;8098:27;;5898:18:1;8098:27:0;;;;;;;;7830:303;7790:343;:::o;8171:261::-;8222:35;8236:6;8244:4;8250:6;8222:13;:35::i;:::-;8301:11;;8268:14;;8285:13;:6;8294:4;8285:13;:::i;:::-;:27;;;;:::i;:::-;8268:44;-1:-1:-1;8327:10:0;;8323:59;;8364:6;8354;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;8323:59:0;8397:27;;;8414:1;5925:25:1;;5981:2;5966:18;;5959:34;;;8402:10:0;;8397:27;;5898:18:1;8397:27:0;5751:248:1;22389:401:0;22440:4;22461:6;22457:326;;;22484:7;22505:9;22494:8;:1;22498:4;22494:8;:::i;:::-;:20;;;;:::i;:::-;22484:30;-1:-1:-1;22529:7:0;22550:9;22539:8;:1;22543:4;22539:8;:::i;:::-;:20;;;;:::i;:::-;22529:30;-1:-1:-1;22574:7:0;22596:4;22585:7;22529:30;22585:2;:7;:::i;:::-;22584:16;;;;:::i;:::-;22574:26;-1:-1:-1;22615:7:0;22657:4;22646:7;22651:2;;22646:7;:::i;:::-;22645:16;;;;:::i;:::-;22638:4;22627:7;22632:2;;22627:7;:::i;:::-;22626:16;;;;:::i;:::-;:35;;;;:::i;:::-;22615:47;-1:-1:-1;22694:4:0;22684:7;22615:47;22684:2;:7;:::i;:::-;:14;;;;:::i;:::-;22677:21;;;;;;;;22457:326;22755:5;22759:1;22755;:5;:::i;:::-;22748:12;;;;10235:965;10418:18;;10356:15;;10334:19;;10401:35;;10356:15;10401:35;:::i;:::-;10382:54;;10488:1;10474:11;:15;:33;;;;-1:-1:-1;10493:14:0;;;10474:33;:51;;;;-1:-1:-1;10511:14:0;;;10474:51;10470:197;;;10568:23;10580:11;10568:9;:23;:::i;:::-;10542:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;10632:23:0;;-1:-1:-1;10644:11:0;10632:9;:23;:::i;:::-;10606:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;10470:197:0;10679:25;10707:17;:15;:17::i;:::-;10766:16;;10679:45;;-1:-1:-1;10749:33:0;;:14;:33;:::i;:::-;10735:47;;3731:4;10900:11;:24;10896:151;;;10959:75;;;;;;;;;;;10987:22;;10959:75;;;;;;11011:22;;10959:75;;;;;;10941:12;:94;;;;;;;-1:-1:-1;10941:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;10896:151;11057:8;:19;;;11087:8;:19;;;11117:18;:35;;;11168:24;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;11168:24:0;;5898:18:1;11168:24:0;;;;;;;10323:877;;;10235:965;;;;:::o;21497:884::-;21607:4;21628:6;21624:750;;;21651:7;21662:24;21665:9;21676;21662:2;:24::i;:::-;21651:35;-1:-1:-1;21732:9:0;21713:16;:9;21725:4;21713:16;:::i;:::-;:28;;;;:::i;:::-;21701:40;-1:-1:-1;21787:9:0;21768:16;:9;21780:4;21768:16;:::i;:::-;:28;;;;:::i;:::-;21756:40;;21812:13;21827;21855:6;-1:-1:-1;;;;;21844:17:0;:7;-1:-1:-1;;;;;21844:17:0;;:67;;21890:9;21901;21844:67;;;21865:9;21876;21844:67;21811:100;;;;21948:6;-1:-1:-1;;;;;21937:17:0;:7;-1:-1:-1;;;;;21937:17:0;;:77;;22005:9;21987:15;:8;21998:4;21987:15;:::i;:::-;:27;;;;:::i;:::-;21937:77;;;21975:9;21957:15;:8;21968:4;21957:15;:::i;:::-;:27;;;;:::i;:::-;21926:88;-1:-1:-1;22029:6:0;22049:39;22056:17;22065:8;21926:88;22056:17;:::i;:::-;22075:2;22079:8;22049:6;:39::i;:::-;22038:50;;:8;:50;:::i;:::-;22029:59;;22160:4;22126:6;-1:-1:-1;;;;;22115:17:0;:7;-1:-1:-1;;;;;22115:17:0;;:41;;22147:9;22115:41;;;22135:9;22115:41;22110:47;;:1;:47;:::i;:::-;:54;;;;:::i;:::-;22103:61;;;;;;;;21624:750;22198:13;22213;22241:6;-1:-1:-1;;;;;22230:17:0;:7;-1:-1:-1;;;;;22230:17:0;;:67;;22276:9;22287;22230:67;;;22251:9;22262;22230:67;22197:100;;-1:-1:-1;22197:100:0;-1:-1:-1;22342:19:0;22353:8;22197:100;22342:19;:::i;:::-;22319;22330:8;22319;:19;:::i;:::-;:43;;;;:::i;:::-;22312:50;;;;;;25223:311;25307:15;25318:3;25307:10;:15::i;:::-;25364;25375:3;25364:10;:15::i;:::-;-1:-1:-1;;;;;25423:14:0;;;;;;:9;:14;;;;;:24;;25441:6;;25423:14;:24;;25441:6;;25423:24;:::i;:::-;;;;-1:-1:-1;;;;;;;25458:14:0;;;;;;:9;:14;;;;;:24;;25476:6;;25458:14;:24;;25476:6;;25458:24;:::i;:::-;;;;;;;;25514:3;-1:-1:-1;;;;;25500:26:0;25509:3;-1:-1:-1;;;;;25500:26:0;;25519:6;25500:26;;;;3812:25:1;;3800:2;3785:18;;3666:177;25500:26:0;;;;;;;;25223:311;;;:::o;705:303::-;750:6;777:1;773;:5;769:232;;;-1:-1:-1;799:1:0;815:6;824:5;828:1;799;824:5;:::i;:::-;:9;;832:1;824:9;:::i;:::-;815:18;;848:92;859:1;855;:5;848:92;;;885:1;-1:-1:-1;885:1:0;923;885;910:5;885:1;910;:5;:::i;:::-;:9;;;;:::i;:::-;909:15;;;;:::i;:::-;905:19;;848:92;;;780:171;705:303;;;:::o;769:232::-;961:6;;957:44;;-1:-1:-1;988:1:0;957:44;705:303;;;:::o;22798:250::-;22859:15;22870:3;22859:10;:15::i;:::-;22950:6;22935:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;22967:14:0;;;;;;:9;:14;;;;;:24;;22985:6;;22967:14;:24;;22985:6;;22967:24;:::i;:::-;;;;-1:-1:-1;;23007:33:0;;3812:25:1;;;-1:-1:-1;;;;;23007:33:0;;;23024:1;;23007:33;;3800:2:1;3785:18;23007:33:0;;;;;;;;22798:250;;:::o;602:97::-;654:4;682:1;678;:5;:13;;690:1;678:13;;;-1:-1:-1;686:1:0;;671:20;-1:-1:-1;602:97:0:o;23056:200::-;23117:15;23128:3;23117:10;:15::i;:::-;23158:6;23143:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;23175:14:0;;;;;;:9;:14;;;;;:24;;23193:6;;23175:14;:24;;23193:6;;23175:24;:::i;:::-;;;;-1:-1:-1;;23215:33:0;;3812:25:1;;;23237:1:0;;-1:-1:-1;;;;;23215:33:0;;;;;3800:2:1;3785:18;23215:33:0;3666:177:1;8633:1286:0;-1:-1:-1;;;;;8709:20:0;;8692:14;8709:20;;;:9;:20;;;;;;8777:13;;8773:1139;;-1:-1:-1;;;;;8828:23:0;;8807:18;8828:23;;;:12;:23;;;;;;;;;;8929:12;:23;;;;;;;;8982:6;;9060;;9081:33;;;;9180:23;;;;:33;;;8828:23;9243;8828;8982:6;9243:23;:::i;:::-;9228:38;-1:-1:-1;9339:12:0;9354:23;9364:13;9354:7;:23;:::i;:::-;9339:38;-1:-1:-1;9396:11:0;;9392:192;;9428:11;9464:4;9442:19;9454:7;9442:9;:19;:::i;:::-;:26;;;;:::i;:::-;-1:-1:-1;;;;;9537:21:0;;;;;;:10;:21;;;;;:31;;9428:40;;-1:-1:-1;9428:40:0;;9537:21;;;:31;;9428:40;;9537:31;:::i;:::-;;;;-1:-1:-1;;;9392:192:0;9602:11;;9598:142;;9634:11;9670:4;9648:19;9660:7;9648:9;:19;:::i;:::-;:26;;;;:::i;:::-;-1:-1:-1;;;;;9693:21:0;;;;;;:10;:21;;;;;:31;;9634:40;;-1:-1:-1;9634:40:0;;9693:21;;;:31;;9634:40;;9693:31;:::i;:::-;;;;-1:-1:-1;;;9598:142:0;8792:959;;;;;;8681:1238;8633:1286;:::o;8773:1139::-;9798:6;;-1:-1:-1;;;;;9772:23:0;;;;;;:12;:23;;;;;;;;:32;;;;9894:6;;9868:12;:23;;;;;;:32;8681:1238;8633:1286;:::o;20490:688::-;20555:4;;20572:580;20593:3;20589:1;:7;20572:580;;;20632:1;20618:11;20657:9;20660:2;20632:1;20657:2;:9::i;:::-;20648:18;;20689:2;20685:1;:6;20681:212;;;20712:7;20736:9;20739:2;20743:1;20736:2;:9::i;:::-;20723:6;20728:1;20723:2;:6;:::i;:::-;20722:13;;20731:4;20722:13;:::i;:::-;:23;;;;:::i;:::-;20712:33;-1:-1:-1;20768:6:0;20712:33;20768:1;:6;:::i;:::-;20764:10;;20693:97;20681:212;;;20815:7;20839:9;20842:2;20846:1;20839:2;:9::i;:::-;20826:6;20830:2;20826:1;:6;:::i;:::-;20825:13;;20834:4;20825:13;:::i;:::-;:23;;;;:::i;:::-;20815:33;-1:-1:-1;20871:6:0;20815:33;20871:1;:6;:::i;:::-;20867:10;;20796:97;20681:212;20915:6;20911:1;:10;20907:234;;;20960:1;20946:10;20950:6;20946:1;:10;:::i;:::-;:15;20942:72;;20993:1;20986:8;;;;;;;20942:72;20907:234;;;21072:1;21058:10;21067:1;21058:6;:10;:::i;:::-;:15;21054:72;;21105:1;21098:8;;;;;;;21054:72;20603:549;;20598:3;;;;;:::i;:::-;;;;20572:580;;;-1:-1:-1;21169:1:0;;20490:688;-1:-1:-1;;;20490:688:0:o;20212:137::-;20264:4;20337;20335:1;20337:4;20326:2;20337:4;20315:5;20326:2;;20315:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;20314:22;;;;:::i;:::-;:27;;;;:::i;:::-;20309:4;;20301:1;20309:4;20292:3;20301:1;;20292:3;:::i;:::-;:8;;;;:::i;:::-;:10;;;;:::i;:::-;:15;;;;:::i;:::-;20288:20;;:2;:20;:::i;:::-;:25;;;;:::i;:::-;:53;;;;:::i;20357:125::-;20409:4;20469;20466:2;20469:4;20455:5;20466:2;;20455:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;20449:4;;20439:3;20441:1;;20439:3;:::i;:::-;:8;;;;:::i;:::-;20433:4;20435:2;20433:1;:4;:::i;:::-;:15;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:802;289:6;297;305;313;321;374:3;362:9;353:7;349:23;345:33;342:53;;;391:1;388;381:12;342:53;427:9;414:23;404:33;;484:2;473:9;469:18;456:32;446:42;;507:38;541:2;530:9;526:18;507:38;:::i;:::-;497:48;;596:2;585:9;581:18;568:32;619:18;660:2;652:6;649:14;646:34;;;676:1;673;666:12;646:34;714:6;703:9;699:22;689:32;;759:7;752:4;748:2;744:13;740:27;730:55;;781:1;778;771:12;730:55;821:2;808:16;847:2;839:6;836:14;833:34;;;863:1;860;853:12;833:34;908:7;903:2;894:6;890:2;886:15;882:24;879:37;876:57;;;929:1;926;919:12;876:57;192:802;;;;-1:-1:-1;192:802:1;;-1:-1:-1;960:2:1;952:11;;982:6;192:802;-1:-1:-1;;;192:802:1:o;999:258::-;1071:1;1081:113;1095:6;1092:1;1089:13;1081:113;;;1171:11;;;1165:18;1152:11;;;1145:39;1117:2;1110:10;1081:113;;;1212:6;1209:1;1206:13;1203:48;;;1247:1;1238:6;1233:3;1229:16;1222:27;1203:48;;999:258;;;:::o;1262:383::-;1411:2;1400:9;1393:21;1374:4;1443:6;1437:13;1486:6;1481:2;1470:9;1466:18;1459:34;1502:66;1561:6;1556:2;1545:9;1541:18;1536:2;1528:6;1524:15;1502:66;:::i;:::-;1629:2;1608:15;-1:-1:-1;;1604:29:1;1589:45;;;;1636:2;1585:54;;1262:383;-1:-1:-1;;1262:383:1:o;1974:254::-;2042:6;2050;2103:2;2091:9;2082:7;2078:23;2074:32;2071:52;;;2119:1;2116;2109:12;2071:52;2142:29;2161:9;2142:29;:::i;:::-;2132:39;2218:2;2203:18;;;;2190:32;;-1:-1:-1;;;1974:254:1:o;2633:391::-;2719:6;2727;2735;2743;2796:3;2784:9;2775:7;2771:23;2767:33;2764:53;;;2813:1;2810;2803:12;2764:53;2836:29;2855:9;2836:29;:::i;:::-;2826:39;2912:2;2897:18;;2884:32;;-1:-1:-1;2963:2:1;2948:18;;2935:32;;3014:2;2999:18;2986:32;;-1:-1:-1;2633:391:1;-1:-1:-1;;;2633:391:1:o;3029:632::-;3200:2;3252:21;;;3322:13;;3225:18;;;3344:22;;;3171:4;;3200:2;3423:15;;;;3397:2;3382:18;;;3171:4;3466:169;3480:6;3477:1;3474:13;3466:169;;;3541:13;;3529:26;;3610:15;;;;3575:12;;;;3502:1;3495:9;3466:169;;;-1:-1:-1;3652:3:1;;3029:632;-1:-1:-1;;;;;;3029:632:1:o;3848:186::-;3907:6;3960:2;3948:9;3939:7;3935:23;3931:32;3928:52;;;3976:1;3973;3966:12;3928:52;3999:29;4018:9;3999:29;:::i;4039:328::-;4116:6;4124;4132;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;4224:29;4243:9;4224:29;:::i;:::-;4214:39;;4272:38;4306:2;4295:9;4291:18;4272:38;:::i;:::-;4262:48;;4357:2;4346:9;4342:18;4329:32;4319:42;;4039:328;;;;;:::o;4372:180::-;4431:6;4484:2;4472:9;4463:7;4459:23;4455:32;4452:52;;;4500:1;4497;4490:12;4452:52;-1:-1:-1;4523:23:1;;4372:180;-1:-1:-1;4372:180:1:o;5424:322::-;5501:6;5509;5517;5570:2;5558:9;5549:7;5545:23;5541:32;5538:52;;;5586:1;5583;5576:12;5538:52;5609:29;5628:9;5609:29;:::i;:::-;5599:39;5685:2;5670:18;;5657:32;;-1:-1:-1;5736:2:1;5721:18;;;5708:32;;5424:322;-1:-1:-1;;;5424:322:1:o;6684:693::-;6795:6;6803;6811;6819;6827;6835;6843;6896:3;6884:9;6875:7;6871:23;6867:33;6864:53;;;6913:1;6910;6903:12;6864:53;6936:29;6955:9;6936:29;:::i;:::-;6926:39;;6984:38;7018:2;7007:9;7003:18;6984:38;:::i;:::-;6974:48;;7069:2;7058:9;7054:18;7041:32;7031:42;;7120:2;7109:9;7105:18;7092:32;7082:42;;7174:3;7163:9;7159:19;7146:33;7219:4;7212:5;7208:16;7201:5;7198:27;7188:55;;7239:1;7236;7229:12;7188:55;6684:693;;;;-1:-1:-1;6684:693:1;;;;7262:5;7314:3;7299:19;;7286:33;;-1:-1:-1;7366:3:1;7351:19;;;7338:33;;6684:693;-1:-1:-1;;6684:693:1:o;7382:260::-;7450:6;7458;7511:2;7499:9;7490:7;7486:23;7482:32;7479:52;;;7527:1;7524;7517:12;7479:52;7550:29;7569:9;7550:29;:::i;:::-;7540:39;;7598:38;7632:2;7621:9;7617:18;7598:38;:::i;:::-;7588:48;;7382:260;;;;;:::o;7647:254::-;7715:6;7723;7776:2;7764:9;7755:7;7751:23;7747:32;7744:52;;;7792:1;7789;7782:12;7744:52;7828:9;7815:23;7805:33;;7857:38;7891:2;7880:9;7876:18;7857:38;:::i;7906:277::-;7973:6;8026:2;8014:9;8005:7;8001:23;7997:32;7994:52;;;8042:1;8039;8032:12;7994:52;8074:9;8068:16;8127:5;8120:13;8113:21;8106:5;8103:32;8093:60;;8149:1;8146;8139:12;9179:632;9449:1;9445;9440:3;9436:11;9432:19;9424:6;9420:32;9409:9;9402:51;9489:6;9484:2;9473:9;9469:18;9462:34;9532:6;9527:2;9516:9;9512:18;9505:34;9575:3;9570:2;9559:9;9555:18;9548:31;9616:6;9610:3;9599:9;9595:19;9588:35;9674:6;9666;9660:3;9649:9;9645:19;9632:49;9731:1;9701:22;;;9725:3;9697:32;;;9690:43;;;;9794:2;9773:15;;;-1:-1:-1;;9769:29:1;9754:45;9750:55;;9179:632;-1:-1:-1;;;;9179:632:1:o;9816:184::-;9886:6;9939:2;9927:9;9918:7;9914:23;9910:32;9907:52;;;9955:1;9952;9945:12;9907:52;-1:-1:-1;9978:16:1;;9816:184;-1:-1:-1;9816:184:1:o;10005:127::-;10066:10;10061:3;10057:20;10054:1;10047:31;10097:4;10094:1;10087:15;10121:4;10118:1;10111:15;10137:125;10177:4;10205:1;10202;10199:8;10196:34;;;10210:18;;:::i;:::-;-1:-1:-1;10247:9:1;;10137:125::o;10598:217::-;10638:1;10664;10654:132;;10708:10;10703:3;10699:20;10696:1;10689:31;10743:4;10740:1;10733:15;10771:4;10768:1;10761:15;10654:132;-1:-1:-1;10800:9:1;;10598:217::o;11545:380::-;11624:1;11620:12;;;;11667;;;11688:61;;11742:4;11734:6;11730:17;11720:27;;11688:61;11795:2;11787:6;11784:14;11764:18;11761:38;11758:161;;;11841:10;11836:3;11832:20;11829:1;11822:31;11876:4;11873:1;11866:15;11904:4;11901:1;11894:15;11930:127;11991:10;11986:3;11982:20;11979:1;11972:31;12022:4;12019:1;12012:15;12046:4;12043:1;12036:15;12062:168;12102:7;12168:1;12164;12160:6;12156:14;12153:1;12150:21;12145:1;12138:9;12131:17;12127:45;12124:71;;;12175:18;;:::i;:::-;-1:-1:-1;12215:9:1;;12062:168::o;12235:128::-;12275:3;12306:1;12302:6;12299:1;12296:13;12293:39;;;12312:18;;:::i;:::-;-1:-1:-1;12348:9:1;;12235:128::o;12368:127::-;12429:10;12424:3;12420:20;12417:1;12410:31;12460:4;12457:1;12450:15;12484:4;12481:1;12474:15;13162:135;13201:3;-1:-1:-1;;13222:17:1;;13219:43;;;13242:18;;:::i;:::-;-1:-1:-1;13289:1:1;13278:13;;13162:135::o;14125:1104::-;14255:3;14284:1;14317:6;14311:13;14347:3;14369:1;14397:9;14393:2;14389:18;14379:28;;14457:2;14446:9;14442:18;14479;14469:61;;14523:4;14515:6;14511:17;14501:27;;14469:61;14549:2;14597;14589:6;14586:14;14566:18;14563:38;14560:165;;;-1:-1:-1;;;14624:33:1;;14680:4;14677:1;14670:15;14710:4;14631:3;14698:17;14560:165;14741:18;14768:104;;;;14886:1;14881:323;;;;14734:470;;14768:104;-1:-1:-1;;14801:24:1;;14789:37;;14846:16;;;;-1:-1:-1;14768:104:1;;14881:323;14072:1;14065:14;;;14109:4;14096:18;;14979:1;14993:165;15007:6;15004:1;15001:13;14993:165;;;15085:14;;15072:11;;;15065:35;15128:16;;;;15022:10;;14993:165;;;14997:3;;15187:6;15182:3;15178:16;15171:23;;14734:470;-1:-1:-1;15220:3:1;;14125:1104;-1:-1:-1;;;;;;;;14125:1104:1:o;17757:274::-;17886:3;17924:6;17918:13;17940:53;17986:6;17981:3;17974:4;17966:6;17962:17;17940:53;:::i;:::-;18009:16;;;;;17757:274;-1:-1:-1;;17757:274:1:o
Swarm Source
ipfs://ff8d5cca7112533e8b3f4bd124fe1df06f370b59c00b61b393e9bdc701da3683
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.