More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,549,096 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap | 56229021 | 13 mins ago | IN | 0.00913927 AVAX | 0.00145368 | ||||
Swap | 56228292 | 36 mins ago | IN | 0.0008667 AVAX | 0.00096944 | ||||
Swap | 56227613 | 57 mins ago | IN | 0.00385845 AVAX | 0.00144036 | ||||
Swap | 56226800 | 1 hr ago | IN | 0.00913924 AVAX | 0.00432089 | ||||
Swap | 56223748 | 3 hrs ago | IN | 0.00914023 AVAX | 0.00096418 | ||||
Swap | 56222842 | 3 hrs ago | IN | 0.00914023 AVAX | 0.00096418 | ||||
Swap | 56220237 | 4 hrs ago | IN | 0.21663586 AVAX | 0.0013974 | ||||
Swap | 56217928 | 6 hrs ago | IN | 0.01029996 AVAX | 0.00101456 | ||||
Swap | 56217639 | 6 hrs ago | IN | 0.0008667 AVAX | 0.00096944 | ||||
Swap | 56215834 | 7 hrs ago | IN | 0.00914004 AVAX | 0.00132093 | ||||
Swap | 56215714 | 7 hrs ago | IN | 0.0008667 AVAX | 0.00096938 | ||||
Swap | 56215491 | 7 hrs ago | IN | 0.00913927 AVAX | 0.00096418 | ||||
Swap | 56215027 | 7 hrs ago | IN | 0.00913927 AVAX | 0.00096418 | ||||
Swap | 56215011 | 7 hrs ago | IN | 0.01001106 AVAX | 0.00097055 | ||||
Swap | 56206498 | 11 hrs ago | IN | 0.00926909 AVAX | 0.00042806 | ||||
Instant Redeem L... | 56205513 | 12 hrs ago | IN | 0 AVAX | 0.00029043 | ||||
Instant Redeem L... | 56202882 | 13 hrs ago | IN | 0 AVAX | 0.00029037 | ||||
Instant Redeem L... | 56200549 | 14 hrs ago | IN | 0 AVAX | 0.00029037 | ||||
Instant Redeem L... | 56198160 | 16 hrs ago | IN | 0 AVAX | 0.00026447 | ||||
Instant Redeem L... | 56198119 | 16 hrs ago | IN | 0 AVAX | 0.00029037 | ||||
Instant Redeem L... | 56198082 | 16 hrs ago | IN | 0 AVAX | 0.00028779 | ||||
Swap | 56194611 | 17 hrs ago | IN | 0.00914194 AVAX | 0.00160816 | ||||
Instant Redeem L... | 56194216 | 17 hrs ago | IN | 0 AVAX | 0.00012775 | ||||
Instant Redeem L... | 56194208 | 17 hrs ago | IN | 0 AVAX | 0.0001078 | ||||
Instant Redeem L... | 56194168 | 17 hrs ago | IN | 0 AVAX | 0.00011855 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
56229021 | 13 mins ago | 0.00913927 AVAX | ||||
56228292 | 36 mins ago | 0.0008667 AVAX | ||||
56228199 | 39 mins ago | 0.02593033 AVAX | ||||
56228199 | 39 mins ago | 0.02593033 AVAX | ||||
56228045 | 44 mins ago | 0.0039664 AVAX | ||||
56228045 | 44 mins ago | 0.0039664 AVAX | ||||
56227613 | 57 mins ago | 0.00385845 AVAX | ||||
56226800 | 1 hr ago | 0.00913924 AVAX | ||||
56223748 | 3 hrs ago | 0.00914023 AVAX | ||||
56222842 | 3 hrs ago | 0.00914023 AVAX | ||||
56222776 | 3 hrs ago | 0.00970743 AVAX | ||||
56222776 | 3 hrs ago | 0.00970743 AVAX | ||||
56222220 | 3 hrs ago | 0.00970743 AVAX | ||||
56222220 | 3 hrs ago | 0.00970743 AVAX | ||||
56220237 | 4 hrs ago | 0.21663586 AVAX | ||||
56218099 | 6 hrs ago | 0.02592127 AVAX | ||||
56218099 | 6 hrs ago | 0.02592127 AVAX | ||||
56218024 | 6 hrs ago | 0.01111327 AVAX | ||||
56218024 | 6 hrs ago | 0.01111327 AVAX | ||||
56217987 | 6 hrs ago | 0.00436878 AVAX | ||||
56217987 | 6 hrs ago | 0.00436878 AVAX | ||||
56217928 | 6 hrs ago | 0.01029996 AVAX | ||||
56217639 | 6 hrs ago | 0.0008667 AVAX | ||||
56216584 | 6 hrs ago | 0.00489112 AVAX | ||||
56216584 | 6 hrs ago | 0.00489112 AVAX |
Loading...
Loading
Contract Name:
Router
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./Factory.sol"; import "./Pool.sol"; import "./Bridge.sol"; // interfaces import "./IERC20.sol"; import "./IStargateRouter.sol"; import "./IStargateReceiver.sol"; // libraries import "./SafeMath.sol"; contract Router is IStargateRouter, Ownable, ReentrancyGuard { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS uint8 internal constant TYPE_REDEEM_LOCAL_RESPONSE = 1; uint8 internal constant TYPE_REDEEM_LOCAL_CALLBACK_RETRY = 2; uint8 internal constant TYPE_SWAP_REMOTE_RETRY = 3; //--------------------------------------------------------------------------- // STRUCTS struct CachedSwap { address token; uint256 amountLD; address to; bytes payload; } //--------------------------------------------------------------------------- // VARIABLES Factory public factory; // used for creating pools address public protocolFeeOwner; // can call methods to pull Stargate fees collected in pools address public mintFeeOwner; // can call methods to pull mint fees collected in pools Bridge public bridge; mapping(uint16 => mapping(bytes => mapping(uint256 => bytes))) public revertLookup; //[chainId][srcAddress][nonce] mapping(uint16 => mapping(bytes => mapping(uint256 => CachedSwap))) public cachedSwapLookup; //[chainId][srcAddress][nonce] //--------------------------------------------------------------------------- // EVENTS event Revert(uint8 bridgeFunctionType, uint16 chainId, bytes srcAddress, uint256 nonce); event CachedSwapSaved(uint16 chainId, bytes srcAddress, uint256 nonce, address token, uint256 amountLD, address to, bytes payload, bytes reason); event RevertRedeemLocal(uint16 srcChainId, uint256 _srcPoolId, uint256 _dstPoolId, bytes to, uint256 redeemAmountSD, uint256 mintAmountSD, uint256 indexed nonce, bytes indexed srcAddress); event RedeemLocalCallback(uint16 srcChainId, bytes indexed srcAddress, uint256 indexed nonce, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyBridge() { require(msg.sender == address(bridge), "Bridge: caller must be Bridge."); _; } constructor() {} function setBridgeAndFactory(Bridge _bridge, Factory _factory) external onlyOwner { require(address(bridge) == address(0x0) && address(factory) == address(0x0), "Stargate: bridge and factory already initialized"); // 1 time only require(address(_bridge) != address(0x0), "Stargate: bridge cant be 0x0"); require(address(_factory) != address(0x0), "Stargate: factory cant be 0x0"); bridge = _bridge; factory = _factory; } //--------------------------------------------------------------------------- // VIEWS function _getPool(uint256 _poolId) internal view returns (Pool pool) { pool = factory.getPool(_poolId); require(address(pool) != address(0x0), "Stargate: Pool does not exist"); } //--------------------------------------------------------------------------- // INTERNAL function _safeTransferFrom( address token, address from, address to, uint256 value ) private { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Stargate: TRANSFER_FROM_FAILED"); } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function addLiquidity( uint256 _poolId, uint256 _amountLD, address _to ) external override nonReentrant { Pool pool = _getPool(_poolId); uint256 convertRate = pool.convertRate(); _amountLD = _amountLD.div(convertRate).mul(convertRate); _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD); pool.mint(_to, _amountLD); } function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable override nonReentrant { require(_amountLD > 0, "Stargate: cannot swap 0"); require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool.SwapObj memory s; Pool.CreditObj memory c; { Pool pool = _getPool(_srcPoolId); { uint256 convertRate = pool.convertRate(); _amountLD = _amountLD.div(convertRate).mul(convertRate); } s = pool.swap(_dstChainId, _dstPoolId, msg.sender, _amountLD, _minAmountLD, true); _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD); c = pool.sendCredits(_dstChainId, _dstPoolId); } bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, _payload); } function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); require(_amountLP > 0, "Stargate: not enough lp to redeemRemote"); Pool.SwapObj memory s; Pool.CreditObj memory c; { Pool pool = _getPool(_srcPoolId); uint256 amountLD = pool.amountLPtoLD(_amountLP); // perform a swap with no liquidity s = pool.swap(_dstChainId, _dstPoolId, msg.sender, amountLD, _minAmountLD, false); pool.redeemRemote(_dstChainId, _dstPoolId, msg.sender, _amountLP); c = pool.sendCredits(_dstChainId, _dstPoolId); } // equal to a swap, with no payload ("0x") no dstGasForCall 0 bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, ""); } function instantRedeemLocal( uint16 _srcPoolId, uint256 _amountLP, address _to ) external override nonReentrant returns (uint256 amountSD) { require(_amountLP > 0, "Stargate: not enough lp to redeem"); Pool pool = _getPool(_srcPoolId); amountSD = pool.instantRedeemLocal(msg.sender, _amountLP, _to); } function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool pool = _getPool(_srcPoolId); require(_amountLP > 0, "Stargate: not enough lp to redeem"); uint256 amountSD = pool.redeemLocal(msg.sender, _amountLP, _dstChainId, _dstPoolId, _to); require(amountSD > 0, "Stargate: not enough lp to redeem with amountSD"); Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId); bridge.redeemLocal{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, amountSD, _to, _lzTxParams); } function sendCredits( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool pool = _getPool(_srcPoolId); Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId); bridge.sendCredits{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c); } function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, Router.lzTxObj memory _lzTxParams ) external view override returns (uint256, uint256) { return bridge.quoteLayerZeroFee(_dstChainId, _functionType, _toAddress, _transferAndCallPayload, _lzTxParams); } function revertRedeemLocal( uint16 _dstChainId, bytes calldata _srcAddress, uint256 _nonce, address payable _refundAddress, lzTxObj memory _lzTxParams ) external payable { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); bytes memory payload = revertLookup[_dstChainId][_srcAddress][_nonce]; require(payload.length > 0, "Stargate: no retry revert"); { uint8 functionType; assembly { functionType := mload(add(payload, 32)) } require(functionType == TYPE_REDEEM_LOCAL_RESPONSE, "Stargate: invalid function type"); } // empty it revertLookup[_dstChainId][_srcAddress][_nonce] = ""; uint256 srcPoolId; uint256 dstPoolId; assembly { srcPoolId := mload(add(payload, 64)) dstPoolId := mload(add(payload, 96)) } Pool.CreditObj memory c; { Pool pool = _getPool(dstPoolId); c = pool.sendCredits(_dstChainId, srcPoolId); } bridge.redeemLocalCallback{value: msg.value}(_dstChainId, _refundAddress, c, _lzTxParams, payload); } function retryRevert( uint16 _srcChainId, bytes calldata _srcAddress, uint256 _nonce ) external payable { bytes memory payload = revertLookup[_srcChainId][_srcAddress][_nonce]; require(payload.length > 0, "Stargate: no retry revert"); // empty it revertLookup[_srcChainId][_srcAddress][_nonce] = ""; uint8 functionType; assembly { functionType := mload(add(payload, 32)) } if (functionType == TYPE_REDEEM_LOCAL_CALLBACK_RETRY) { (, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD) = abi.decode( payload, (uint8, uint256, uint256, address, uint256, uint256) ); _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, to, amountSD, mintAmountSD); } // for retrying the swapRemote. if it fails again, retry else if (functionType == TYPE_SWAP_REMOTE_RETRY) { (, uint256 srcPoolId, uint256 dstPoolId, uint256 dstGasForCall, address to, Pool.SwapObj memory s, bytes memory p) = abi.decode( payload, (uint8, uint256, uint256, uint256, address, Pool.SwapObj, bytes) ); _swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, to, s, p); } else { revert("Stargate: invalid function type"); } } function clearCachedSwap( uint16 _srcChainId, bytes calldata _srcAddress, uint256 _nonce ) external { CachedSwap memory cs = cachedSwapLookup[_srcChainId][_srcAddress][_nonce]; require(cs.to != address(0x0), "Stargate: cache already cleared"); // clear the data cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(address(0x0), 0, address(0x0), ""); IStargateReceiver(cs.to).sgReceive(_srcChainId, _srcAddress, _nonce, cs.token, cs.amountLD, cs.payload); } function creditChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint256 _srcPoolId, Pool.CreditObj memory _c ) external onlyBridge { Pool pool = _getPool(_srcPoolId); pool.creditChainPath(_dstChainId, _dstPoolId, _c); } //--------------------------------------------------------------------------- // REMOTE CHAIN FUNCTIONS function redeemLocalCheckOnRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _amountSD, bytes calldata _to ) external onlyBridge { Pool pool = _getPool(_dstPoolId); try pool.redeemLocalCheckOnRemote(_srcChainId, _srcPoolId, _amountSD) returns (uint256 redeemAmountSD, uint256 mintAmountSD) { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_REDEEM_LOCAL_RESPONSE, _srcPoolId, _dstPoolId, redeemAmountSD, mintAmountSD, _to ); emit RevertRedeemLocal(_srcChainId, _srcPoolId, _dstPoolId, _to, redeemAmountSD, mintAmountSD, _nonce, _srcAddress); } catch { // if the func fail, return [swapAmount: 0, mintAMount: _amountSD] // swapAmount represents the amount of chainPath balance deducted on the remote side, which because the above tx failed, should be 0 // mintAmount is the full amount of tokens the user attempted to redeem on the src side, which gets converted back into the lp amount revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(TYPE_REDEEM_LOCAL_RESPONSE, _srcPoolId, _dstPoolId, 0, _amountSD, _to); emit Revert(TYPE_REDEEM_LOCAL_RESPONSE, _srcChainId, _srcAddress, _nonce); } } function redeemLocalCallback( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, address _to, uint256 _amountSD, uint256 _mintAmountSD ) external onlyBridge { _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD); } function _redeemLocalCallback( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, address _to, uint256 _amountSD, uint256 _mintAmountSD ) internal { Pool pool = _getPool(_dstPoolId); try pool.redeemLocalCallback(_srcChainId, _srcPoolId, _to, _amountSD, _mintAmountSD) {} catch { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_REDEEM_LOCAL_CALLBACK_RETRY, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD ); emit Revert(TYPE_REDEEM_LOCAL_CALLBACK_RETRY, _srcChainId, _srcAddress, _nonce); } emit RedeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD); } function swapRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _dstGasForCall, address _to, Pool.SwapObj memory _s, bytes memory _payload ) external onlyBridge { _swapRemote(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _dstGasForCall, _to, _s, _payload); } function _swapRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _dstGasForCall, address _to, Pool.SwapObj memory _s, bytes memory _payload ) internal { Pool pool = _getPool(_dstPoolId); // first try catch the swap remote try pool.swapRemote(_srcChainId, _srcPoolId, _to, _s) returns (uint256 amountLD) { if (_payload.length > 0) { // then try catch the external contract call try IStargateReceiver(_to).sgReceive{gas: _dstGasForCall}(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _payload) { // do nothing } catch (bytes memory reason) { cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(pool.token(), amountLD, _to, _payload); emit CachedSwapSaved(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _to, _payload, reason); } } } catch { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_SWAP_REMOTE_RETRY, _srcPoolId, _dstPoolId, _dstGasForCall, _to, _s, _payload ); emit Revert(TYPE_SWAP_REMOTE_RETRY, _srcChainId, _srcAddress, _nonce); } } //--------------------------------------------------------------------------- // DAO Calls function createPool( uint256 _poolId, address _token, uint8 _sharedDecimals, uint8 _localDecimals, string memory _name, string memory _symbol ) external onlyOwner returns (address) { require(_token != address(0x0), "Stargate: _token cannot be 0x0"); return factory.createPool(_poolId, _token, _sharedDecimals, _localDecimals, _name, _symbol); } function createChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId, uint256 _weight ) external onlyOwner { Pool pool = _getPool(_poolId); pool.createChainPath(_dstChainId, _dstPoolId, _weight); } function activateChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId ) external onlyOwner { Pool pool = _getPool(_poolId); pool.activateChainPath(_dstChainId, _dstPoolId); } function setWeightForChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId, uint16 _weight ) external onlyOwner { Pool pool = _getPool(_poolId); pool.setWeightForChainPath(_dstChainId, _dstPoolId, _weight); } function setProtocolFeeOwner(address _owner) external onlyOwner { require(_owner != address(0x0), "Stargate: _owner cannot be 0x0"); protocolFeeOwner = _owner; } function setMintFeeOwner(address _owner) external onlyOwner { require(_owner != address(0x0), "Stargate: _owner cannot be 0x0"); mintFeeOwner = _owner; } function setFees(uint256 _poolId, uint256 _mintFeeBP) external onlyOwner { Pool pool = _getPool(_poolId); pool.setFee(_mintFeeBP); } function setFeeLibrary(uint256 _poolId, address _feeLibraryAddr) external onlyOwner { Pool pool = _getPool(_poolId); pool.setFeeLibrary(_feeLibraryAddr); } function setSwapStop(uint256 _poolId, bool _swapStop) external onlyOwner { Pool pool = _getPool(_poolId); pool.setSwapStop(_swapStop); } function setDeltaParam( uint256 _poolId, bool _batched, uint256 _swapDeltaBP, uint256 _lpDeltaBP, bool _defaultSwapMode, bool _defaultLPMode ) external onlyOwner { Pool pool = _getPool(_poolId); pool.setDeltaParam(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode); } function callDelta(uint256 _poolId, bool _fullMode) external { Pool pool = _getPool(_poolId); pool.callDelta(_fullMode); } function withdrawMintFee(uint256 _poolId, address _to) external { require(mintFeeOwner == msg.sender, "Stargate: only mintFeeOwner"); Pool pool = _getPool(_poolId); pool.withdrawMintFeeBalance(_to); } function withdrawProtocolFee(uint256 _poolId, address _to) external { require(protocolFeeOwner == msg.sender, "Stargate: only protocolFeeOwner"); Pool pool = _getPool(_poolId); pool.withdrawProtocolFeeBalance(_to); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./Pool.sol"; import "./Router.sol"; // interfaces import "./ILayerZeroReceiver.sol"; import "./ILayerZeroEndpoint.sol"; import "./ILayerZeroUserApplicationConfig.sol"; // libraries import "./SafeMath.sol"; contract Bridge is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS uint8 internal constant TYPE_SWAP_REMOTE = 1; uint8 internal constant TYPE_ADD_LIQUIDITY = 2; uint8 internal constant TYPE_REDEEM_LOCAL_CALL_BACK = 3; uint8 internal constant TYPE_WITHDRAW_REMOTE = 4; //--------------------------------------------------------------------------- // VARIABLES ILayerZeroEndpoint public immutable layerZeroEndpoint; mapping(uint16 => bytes) public bridgeLookup; mapping(uint16 => mapping(uint8 => uint256)) public gasLookup; Router public immutable router; bool public useLayerZeroToken; //--------------------------------------------------------------------------- // EVENTS event SendMsg(uint8 msgType, uint64 nonce); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == address(router), "Stargate: caller must be Router."); _; } constructor(address _layerZeroEndpoint, address _router) { require(_layerZeroEndpoint != address(0x0), "Stargate: _layerZeroEndpoint cannot be 0x0"); require(_router != address(0x0), "Stargate: _router cannot be 0x0"); layerZeroEndpoint = ILayerZeroEndpoint(_layerZeroEndpoint); router = Router(_router); } //--------------------------------------------------------------------------- // EXTERNAL functions function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(layerZeroEndpoint), "Stargate: only LayerZero endpoint can call lzReceive"); require( _srcAddress.length == bridgeLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(bridgeLookup[_srcChainId]), "Stargate: bridge does not match" ); uint8 functionType; assembly { functionType := mload(add(_payload, 32)) } if (functionType == TYPE_SWAP_REMOTE) { ( , uint256 srcPoolId, uint256 dstPoolId, uint256 dstGasForCall, Pool.CreditObj memory c, Pool.SwapObj memory s, bytes memory to, bytes memory payload ) = abi.decode(_payload, (uint8, uint256, uint256, uint256, Pool.CreditObj, Pool.SwapObj, bytes, bytes)); address toAddress; assembly { toAddress := mload(add(to, 20)) } router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, toAddress, s, payload); } else if (functionType == TYPE_ADD_LIQUIDITY) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c) = abi.decode(_payload, (uint8, uint256, uint256, Pool.CreditObj)); router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); } else if (functionType == TYPE_REDEEM_LOCAL_CALL_BACK) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi .decode(_payload, (uint8, uint256, uint256, Pool.CreditObj, uint256, uint256, bytes)); address toAddress; assembly { toAddress := mload(add(to, 20)) } router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, toAddress, amountSD, mintAmountSD); } else if (functionType == TYPE_WITHDRAW_REMOTE) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, bytes memory to) = abi.decode( _payload, (uint8, uint256, uint256, Pool.CreditObj, uint256, bytes) ); router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.redeemLocalCheckOnRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, amountSD, to); } } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function swap( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c, Pool.SwapObj memory _s, IStargateRouter.lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_SWAP_REMOTE, _srcPoolId, _dstPoolId, _lzTxParams.dstGasForCall, _c, _s, _to, _payload); _call(_chainId, TYPE_SWAP_REMOTE, _refundAddress, _lzTxParams, payload); } function redeemLocalCallback( uint16 _chainId, address payable _refundAddress, Pool.CreditObj memory _c, IStargateRouter.lzTxObj memory _lzTxParams, bytes memory _payload ) external payable onlyRouter { bytes memory payload; { (, uint256 srcPoolId, uint256 dstPoolId, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi.decode( _payload, (uint8, uint256, uint256, uint256, uint256, bytes) ); // swap dst and src because we are headed back payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, dstPoolId, srcPoolId, _c, amountSD, mintAmountSD, to); } _call(_chainId, TYPE_REDEEM_LOCAL_CALL_BACK, _refundAddress, _lzTxParams, payload); } function redeemLocal( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c, uint256 _amountSD, bytes calldata _to, IStargateRouter.lzTxObj memory _lzTxParams ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_WITHDRAW_REMOTE, _srcPoolId, _dstPoolId, _c, _amountSD, _to); _call(_chainId, TYPE_WITHDRAW_REMOTE, _refundAddress, _lzTxParams, payload); } function sendCredits( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_ADD_LIQUIDITY, _srcPoolId, _dstPoolId, _c); IStargateRouter.lzTxObj memory lzTxObj = IStargateRouter.lzTxObj(0, 0, "0x"); _call(_chainId, TYPE_ADD_LIQUIDITY, _refundAddress, lzTxObj, payload); } function quoteLayerZeroFee( uint16 _chainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, IStargateRouter.lzTxObj memory _lzTxParams ) external view returns (uint256, uint256) { bytes memory payload = ""; Pool.CreditObj memory c = Pool.CreditObj(1, 1); if (_functionType == TYPE_SWAP_REMOTE) { Pool.SwapObj memory s = Pool.SwapObj(1, 1, 1, 1, 1, 1); payload = abi.encode(TYPE_SWAP_REMOTE, 0, 0, 0, c, s, _toAddress, _transferAndCallPayload); } else if (_functionType == TYPE_ADD_LIQUIDITY) { payload = abi.encode(TYPE_ADD_LIQUIDITY, 0, 0, c); } else if (_functionType == TYPE_REDEEM_LOCAL_CALL_BACK) { payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, 0, 0, c, 0, 0, _toAddress); } else if (_functionType == TYPE_WITHDRAW_REMOTE) { payload = abi.encode(TYPE_WITHDRAW_REMOTE, 0, 0, c, 0, _toAddress); } else { revert("Stargate: unsupported function type"); } bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _functionType, _lzTxParams); return layerZeroEndpoint.estimateFees(_chainId, address(this), payload, useLayerZeroToken, lzTxParamBuilt); } //--------------------------------------------------------------------------- // dao functions function setBridge(uint16 _chainId, bytes calldata _bridgeAddress) external onlyOwner { require(bridgeLookup[_chainId].length == 0, "Stargate: Bridge already set!"); bridgeLookup[_chainId] = _bridgeAddress; } function setGasAmount( uint16 _chainId, uint8 _functionType, uint256 _gasAmount ) external onlyOwner { require(_functionType >= 1 && _functionType <= 4, "Stargate: invalid _functionType"); gasLookup[_chainId][_functionType] = _gasAmount; } function approveTokenSpender( address token, address spender, uint256 amount ) external onlyOwner { IERC20(token).approve(spender, amount); } function setUseLayerZeroToken(bool enable) external onlyOwner { useLayerZeroToken = enable; } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } //--------------------------------------------------------------------------- // generic config for user Application function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external override onlyOwner { layerZeroEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setSendVersion(version); } function setReceiveVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setReceiveVersion(version); } //--------------------------------------------------------------------------- // INTERNAL functions function txParamBuilderType1(uint256 _gasAmount) internal pure returns (bytes memory) { uint16 txType = 1; return abi.encodePacked(txType, _gasAmount); } function txParamBuilderType2( uint256 _gasAmount, uint256 _dstNativeAmount, bytes memory _dstNativeAddr ) internal pure returns (bytes memory) { uint16 txType = 2; return abi.encodePacked(txType, _gasAmount, _dstNativeAmount, _dstNativeAddr); } function _txParamBuilder( uint16 _chainId, uint8 _type, IStargateRouter.lzTxObj memory _lzTxParams ) internal view returns (bytes memory) { bytes memory lzTxParam; address dstNativeAddr; { bytes memory dstNativeAddrBytes = _lzTxParams.dstNativeAddr; assembly { dstNativeAddr := mload(add(dstNativeAddrBytes, 20)) } } uint256 totalGas = gasLookup[_chainId][_type].add(_lzTxParams.dstGasForCall); if (_lzTxParams.dstNativeAmount > 0 && dstNativeAddr != address(0x0)) { lzTxParam = txParamBuilderType2(totalGas, _lzTxParams.dstNativeAmount, _lzTxParams.dstNativeAddr); } else { lzTxParam = txParamBuilderType1(totalGas); } return lzTxParam; } function _call( uint16 _chainId, uint8 _type, address payable _refundAddress, IStargateRouter.lzTxObj memory _lzTxParams, bytes memory _payload ) internal { bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _type, _lzTxParams); uint64 nextNonce = layerZeroEndpoint.getOutboundNonce(_chainId, address(this)) + 1; layerZeroEndpoint.send{value: msg.value}(_chainId, bridgeLookup[_chainId], _payload, _refundAddress, address(this), lzTxParamBuilt); emit SendMsg(_type, nextNonce); } function renounceOwnership() public override onlyOwner {} }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; import "./SafeMath.sol"; import "./Ownable.sol"; import "./Pool.sol"; contract Factory is Ownable { using SafeMath for uint256; //--------------------------------------------------------------------------- // VARIABLES mapping(uint256 => Pool) public getPool; // poolId -> PoolInfo address[] public allPools; address public immutable router; address public defaultFeeLibrary; // address for retrieving fee params for swaps //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == router, "Stargate: caller must be Router."); _; } constructor(address _router) { require(_router != address(0x0), "Stargate: _router cant be 0x0"); // 1 time only router = _router; } function setDefaultFeeLibrary(address _defaultFeeLibrary) external onlyOwner { require(_defaultFeeLibrary != address(0x0), "Stargate: fee library cant be 0x0"); defaultFeeLibrary = _defaultFeeLibrary; } function allPoolsLength() external view returns (uint256) { return allPools.length; } function createPool( uint256 _poolId, address _token, uint8 _sharedDecimals, uint8 _localDecimals, string memory _name, string memory _symbol ) public onlyRouter returns (address poolAddress) { require(address(getPool[_poolId]) == address(0x0), "Stargate: Pool already created"); Pool pool = new Pool(_poolId, router, _token, _sharedDecimals, _localDecimals, defaultFeeLibrary, _name, _symbol); getPool[_poolId] = pool; poolAddress = address(pool); allPools.push(poolAddress); } function renounceOwnership() public override onlyOwner {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. ie: pay for a specified destination gasAmount, or receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.7.6; pragma abicoder v2; import "./Pool.sol"; interface IStargateFeeLibrary { function getFees( uint256 _srcPoolId, uint256 _dstPoolId, uint16 _dstChainId, address _from, uint256 _amountSD ) external returns (Pool.SwapObj memory s); function getVersion() external view returns (string memory); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; interface IStargateReceiver { function sgReceive( uint16 _chainId, bytes memory _srcAddress, uint256 _nonce, address _token, uint256 amountLD, bytes memory payload ) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; interface IStargateRouter { struct lzTxObj { uint256 dstGasForCall; uint256 dstNativeAmount; bytes dstNativeAddr; } function addLiquidity( uint256 _poolId, uint256 _amountLD, address _to ) external; function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable; function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function instantRedeemLocal( uint16 _srcPoolId, uint256 _amountLP, address _to ) external returns (uint256); function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function sendCredits( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress ) external payable; function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, lzTxObj memory _lzTxParams ) external view returns (uint256, uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; // libraries import "./SafeMath.sol"; contract LPTokenERC20 { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS string public name; string public symbol; bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // set in constructor bytes32 public DOMAIN_SEPARATOR; //--------------------------------------------------------------------------- // VARIABLES uint256 public decimals; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public nonces; //--------------------------------------------------------------------------- // EVENTS event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), chainId, address(this) ) ); } function _mint(address to, uint256 value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint256 value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve( address owner, address spender, uint256 value ) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer( address from, address to, uint256 value ) private { balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint256 value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint256 value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom( address from, address to, uint256 value ) external returns (bool) { if (allowance[from][msg.sender] != uint256(-1)) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "Bridge: EXPIRED"); 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, "Bridge: INVALID_SIGNATURE"); _approve(owner, spender, value); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./LPTokenERC20.sol"; import "./IStargateFeeLibrary.sol"; // libraries import "./SafeMath.sol"; /// Pool contracts on other chains and managed by the Stargate protocol. contract Pool is LPTokenERC20, ReentrancyGuard { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); uint256 public constant BP_DENOMINATOR = 10000; //--------------------------------------------------------------------------- // STRUCTS struct ChainPath { bool ready; // indicate if the counter chainPath has been created. uint16 dstChainId; uint256 dstPoolId; uint256 weight; uint256 balance; uint256 lkb; uint256 credits; uint256 idealBalance; } struct SwapObj { uint256 amount; uint256 eqFee; uint256 eqReward; uint256 lpFee; uint256 protocolFee; uint256 lkbRemove; } struct CreditObj { uint256 credits; uint256 idealBalance; } //--------------------------------------------------------------------------- // VARIABLES // chainPath ChainPath[] public chainPaths; // list of connected chains with shared pools mapping(uint16 => mapping(uint256 => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => poolId =>index // metadata uint256 public immutable poolId; // shared id between chains to represent same pool uint256 public sharedDecimals; // the shared decimals (lowest common decimals between chains) uint256 public localDecimals; // the decimals for the token uint256 public immutable convertRate; // the decimals for the token address public immutable token; // the token for the pool address public immutable router; // the token for the pool bool public stopSwap; // flag to stop swapping in extreme cases // Fee and Liquidity uint256 public totalLiquidity; // the total amount of tokens added on this side of the chain (fees + deposits - withdrawals) uint256 public totalWeight; // total weight for pool percentages uint256 public mintFeeBP; // fee basis points for the mint/deposit uint256 public protocolFeeBalance; // fee balance created from dao fee uint256 public mintFeeBalance; // fee balance created from mint fee uint256 public eqFeePool; // pool rewards in Shared Decimal format. indicate the total budget for reverse swap incentive address public feeLibrary; // address for retrieving fee params for swaps // Delta related uint256 public deltaCredit; // credits accumulated from txn bool public batched; // flag to indicate if we want batch processing. bool public defaultSwapMode; // flag for the default mode for swap bool public defaultLPMode; // flag for the default mode for lp uint256 public swapDeltaBP; // basis points of poolCredits to activate Delta in swap uint256 public lpDeltaBP; // basis points of poolCredits to activate Delta in liquidity events //--------------------------------------------------------------------------- // EVENTS event Mint(address to, uint256 amountLP, uint256 amountSD, uint256 mintFeeAmountSD); event Burn(address from, uint256 amountLP, uint256 amountSD); event RedeemLocalCallback(address _to, uint256 _amountSD, uint256 _amountToMintSD); event Swap( uint16 chainId, uint256 dstPoolId, address from, uint256 amountSD, uint256 eqReward, uint256 eqFee, uint256 protocolFee, uint256 lpFee ); event SendCredits(uint16 dstChainId, uint256 dstPoolId, uint256 credits, uint256 idealBalance); event RedeemRemote(uint16 chainId, uint256 dstPoolId, address from, uint256 amountLP, uint256 amountSD); event RedeemLocal(address from, uint256 amountLP, uint256 amountSD, uint16 chainId, uint256 dstPoolId, bytes to); event InstantRedeemLocal(address from, uint256 amountLP, uint256 amountSD, address to); event CreditChainPath(uint16 chainId, uint256 srcPoolId, uint256 amountSD, uint256 idealBalance); event SwapRemote(address to, uint256 amountSD, uint256 protocolFee, uint256 dstFee); event WithdrawRemote(uint16 srcChainId, uint256 srcPoolId, uint256 swapAmount, uint256 mintAmount); event ChainPathUpdate(uint16 dstChainId, uint256 dstPoolId, uint256 weight); event FeesUpdated(uint256 mintFeeBP); event FeeLibraryUpdated(address feeLibraryAddr); event StopSwapUpdated(bool swapStop); event WithdrawProtocolFeeBalance(address to, uint256 amountSD); event WithdrawMintFeeBalance(address to, uint256 amountSD); event DeltaParamUpdated(bool batched, uint256 swapDeltaBP, uint256 lpDeltaBP, bool defaultSwapMode, bool defaultLPMode); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == router, "Stargate: only the router can call this method"); _; } constructor( uint256 _poolId, address _router, address _token, uint256 _sharedDecimals, uint256 _localDecimals, address _feeLibrary, string memory _name, string memory _symbol ) LPTokenERC20(_name, _symbol) { require(_token != address(0x0), "Stargate: _token cannot be 0x0"); require(_router != address(0x0), "Stargate: _router cannot be 0x0"); poolId = _poolId; router = _router; token = _token; sharedDecimals = _sharedDecimals; decimals = uint8(_sharedDecimals); localDecimals = _localDecimals; convertRate = 10**(uint256(localDecimals).sub(sharedDecimals)); totalWeight = 0; feeLibrary = _feeLibrary; //delta algo related batched = false; defaultSwapMode = true; defaultLPMode = true; } function getChainPathsLength() public view returns (uint256) { return chainPaths.length; } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function mint(address _to, uint256 _amountLD) external nonReentrant onlyRouter returns (uint256) { return _mintLocal(_to, _amountLD, true, true); } // Local Remote // ------- --------- // swap -> swapRemote function swap( uint16 _dstChainId, uint256 _dstPoolId, address _from, uint256 _amountLD, uint256 _minAmountLD, bool newLiquidity ) external nonReentrant onlyRouter returns (SwapObj memory) { require(!stopSwap, "Stargate: swap func stopped"); ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == true, "Stargate: counter chainPath is not ready"); uint256 amountSD = amountLDtoSD(_amountLD); uint256 minAmountSD = amountLDtoSD(_minAmountLD); // request fee params from library SwapObj memory s = IStargateFeeLibrary(feeLibrary).getFees(poolId, _dstPoolId, _dstChainId, _from, amountSD); // equilibrium fee and reward. note eqFee/eqReward are separated from swap liquidity eqFeePool = eqFeePool.sub(s.eqReward); // update the new amount the user gets minus the fees s.amount = amountSD.sub(s.eqFee).sub(s.protocolFee).sub(s.lpFee); // users will also get the eqReward require(s.amount.add(s.eqReward) >= minAmountSD, "Stargate: slippage too high"); // behaviours // - protocolFee: booked, stayed and withdrawn at remote. // - eqFee: booked, stayed and withdrawn at remote. // - lpFee: booked and stayed at remote, can be withdrawn anywhere s.lkbRemove = amountSD.sub(s.lpFee).add(s.eqReward); // check for transfer solvency. require(cp.balance >= s.lkbRemove, "Stargate: dst balance too low"); cp.balance = cp.balance.sub(s.lkbRemove); if (newLiquidity) { deltaCredit = deltaCredit.add(amountSD).add(s.eqReward); } else if (s.eqReward > 0) { deltaCredit = deltaCredit.add(s.eqReward); } // distribute credits on condition. if (!batched || deltaCredit >= totalLiquidity.mul(swapDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultSwapMode); } emit Swap(_dstChainId, _dstPoolId, _from, s.amount, s.eqReward, s.eqFee, s.protocolFee, s.lpFee); return s; } // Local Remote // ------- --------- // sendCredits -> creditChainPath function sendCredits(uint16 _dstChainId, uint256 _dstPoolId) external nonReentrant onlyRouter returns (CreditObj memory c) { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == true, "Stargate: counter chainPath is not ready"); cp.lkb = cp.lkb.add(cp.credits); c.idealBalance = totalLiquidity.mul(cp.weight).div(totalWeight); c.credits = cp.credits; cp.credits = 0; emit SendCredits(_dstChainId, _dstPoolId, c.credits, c.idealBalance); } // Local Remote // ------- --------- // redeemRemote -> swapRemote function redeemRemote( uint16 _dstChainId, uint256 _dstPoolId, address _from, uint256 _amountLP ) external nonReentrant onlyRouter { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); uint256 amountSD = _burnLocal(_from, _amountLP); //run Delta if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultLPMode); } uint256 amountLD = amountSDtoLD(amountSD); emit RedeemRemote(_dstChainId, _dstPoolId, _from, _amountLP, amountLD); } function instantRedeemLocal( address _from, uint256 _amountLP, address _to ) external nonReentrant onlyRouter returns (uint256 amountSD) { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); uint256 _deltaCredit = deltaCredit; // sload optimization. uint256 _capAmountLP = _amountSDtoLP(_deltaCredit); if (_amountLP > _capAmountLP) _amountLP = _capAmountLP; amountSD = _burnLocal(_from, _amountLP); deltaCredit = _deltaCredit.sub(amountSD); uint256 amountLD = amountSDtoLD(amountSD); _safeTransfer(token, _to, amountLD); emit InstantRedeemLocal(_from, _amountLP, amountSD, _to); } // Local Remote // ------- --------- // redeemLocal -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocal( address _from, uint256 _amountLP, uint16 _dstChainId, uint256 _dstPoolId, bytes calldata _to ) external nonReentrant onlyRouter returns (uint256 amountSD) { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); // safeguard. require(chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]].ready == true, "Stargate: counter chainPath is not ready"); amountSD = _burnLocal(_from, _amountLP); // run Delta if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(false); } emit RedeemLocal(_from, _amountLP, amountSD, _dstChainId, _dstPoolId, _to); } //--------------------------------------------------------------------------- // REMOTE CHAIN FUNCTIONS // Local Remote // ------- --------- // sendCredits -> creditChainPath function creditChainPath( uint16 _dstChainId, uint256 _dstPoolId, CreditObj memory _c ) external nonReentrant onlyRouter { ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; cp.balance = cp.balance.add(_c.credits); if (cp.idealBalance != _c.idealBalance) { cp.idealBalance = _c.idealBalance; } emit CreditChainPath(_dstChainId, _dstPoolId, _c.credits, _c.idealBalance); } // Local Remote // ------- --------- // swap -> swapRemote function swapRemote( uint16 _srcChainId, uint256 _srcPoolId, address _to, SwapObj memory _s ) external nonReentrant onlyRouter returns (uint256 amountLD) { // booking lpFee totalLiquidity = totalLiquidity.add(_s.lpFee); // booking eqFee eqFeePool = eqFeePool.add(_s.eqFee); // booking stargateFee protocolFeeBalance = protocolFeeBalance.add(_s.protocolFee); // update LKB uint256 chainPathIndex = chainPathIndexLookup[_srcChainId][_srcPoolId]; chainPaths[chainPathIndex].lkb = chainPaths[chainPathIndex].lkb.sub(_s.lkbRemove); // user receives the amount + the srcReward amountLD = amountSDtoLD(_s.amount.add(_s.eqReward)); _safeTransfer(token, _to, amountLD); emit SwapRemote(_to, _s.amount.add(_s.eqReward), _s.protocolFee, _s.eqFee); } // Local Remote // ------- --------- // redeemLocal -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocalCallback( uint16 _srcChainId, uint256 _srcPoolId, address _to, uint256 _amountSD, uint256 _amountToMintSD ) external nonReentrant onlyRouter { if (_amountToMintSD > 0) { _mintLocal(_to, amountSDtoLD(_amountToMintSD), false, false); } ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId); cp.lkb = cp.lkb.sub(_amountSD); uint256 amountLD = amountSDtoLD(_amountSD); _safeTransfer(token, _to, amountLD); emit RedeemLocalCallback(_to, _amountSD, _amountToMintSD); } // Local Remote // ------- --------- // redeemLocal(amount) -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocalCheckOnRemote( uint16 _srcChainId, uint256 _srcPoolId, uint256 _amountSD ) external nonReentrant onlyRouter returns (uint256 swapAmount, uint256 mintAmount) { ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId); if (_amountSD > cp.balance) { mintAmount = _amountSD - cp.balance; swapAmount = cp.balance; cp.balance = 0; } else { cp.balance = cp.balance.sub(_amountSD); swapAmount = _amountSD; mintAmount = 0; } emit WithdrawRemote(_srcChainId, _srcPoolId, swapAmount, mintAmount); } //--------------------------------------------------------------------------- // DAO Calls function createChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint256 _weight ) external onlyRouter { for (uint256 i = 0; i < chainPaths.length; ++i) { ChainPath memory cp = chainPaths[i]; bool exists = cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId; require(!exists, "Stargate: cant createChainPath of existing dstChainId and _dstPoolId"); } totalWeight = totalWeight.add(_weight); chainPathIndexLookup[_dstChainId][_dstPoolId] = chainPaths.length; chainPaths.push(ChainPath(false, _dstChainId, _dstPoolId, _weight, 0, 0, 0, 0)); emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight); } function setWeightForChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint16 _weight ) external onlyRouter { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); totalWeight = totalWeight.sub(cp.weight).add(_weight); cp.weight = _weight; emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight); } function setFee(uint256 _mintFeeBP) external onlyRouter { require(_mintFeeBP <= BP_DENOMINATOR, "Bridge: cum fees > 100%"); mintFeeBP = _mintFeeBP; emit FeesUpdated(mintFeeBP); } function setFeeLibrary(address _feeLibraryAddr) external onlyRouter { require(_feeLibraryAddr != address(0x0), "Stargate: fee library cant be 0x0"); feeLibrary = _feeLibraryAddr; emit FeeLibraryUpdated(_feeLibraryAddr); } function setSwapStop(bool _swapStop) external onlyRouter { stopSwap = _swapStop; emit StopSwapUpdated(_swapStop); } function setDeltaParam( bool _batched, uint256 _swapDeltaBP, uint256 _lpDeltaBP, bool _defaultSwapMode, bool _defaultLPMode ) external onlyRouter { require(_swapDeltaBP <= BP_DENOMINATOR && _lpDeltaBP <= BP_DENOMINATOR, "Stargate: wrong Delta param"); batched = _batched; swapDeltaBP = _swapDeltaBP; lpDeltaBP = _lpDeltaBP; defaultSwapMode = _defaultSwapMode; defaultLPMode = _defaultLPMode; emit DeltaParamUpdated(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode); } function callDelta(bool _fullMode) external onlyRouter { _delta(_fullMode); } function activateChainPath(uint16 _dstChainId, uint256 _dstPoolId) external onlyRouter { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == false, "Stargate: chainPath is already active"); // this func will only be called once cp.ready = true; } function withdrawProtocolFeeBalance(address _to) external onlyRouter { if (protocolFeeBalance > 0) { uint256 amountOfLD = amountSDtoLD(protocolFeeBalance); protocolFeeBalance = 0; _safeTransfer(token, _to, amountOfLD); emit WithdrawProtocolFeeBalance(_to, amountOfLD); } } function withdrawMintFeeBalance(address _to) external onlyRouter { if (mintFeeBalance > 0) { uint256 amountOfLD = amountSDtoLD(mintFeeBalance); mintFeeBalance = 0; _safeTransfer(token, _to, amountOfLD); emit WithdrawMintFeeBalance(_to, amountOfLD); } } //--------------------------------------------------------------------------- // INTERNAL // Conversion Helpers //--------------------------------------------------------------------------- function amountLPtoLD(uint256 _amountLP) external view returns (uint256) { return amountSDtoLD(_amountLPtoSD(_amountLP)); } function _amountLPtoSD(uint256 _amountLP) internal view returns (uint256) { require(totalSupply > 0, "Stargate: cant convert LPtoSD when totalSupply == 0"); return _amountLP.mul(totalLiquidity).div(totalSupply); } function _amountSDtoLP(uint256 _amountSD) internal view returns (uint256) { require(totalLiquidity > 0, "Stargate: cant convert SDtoLP when totalLiq == 0"); return _amountSD.mul(totalSupply).div(totalLiquidity); } function amountSDtoLD(uint256 _amount) internal view returns (uint256) { return _amount.mul(convertRate); } function amountLDtoSD(uint256 _amount) internal view returns (uint256) { return _amount.div(convertRate); } function getAndCheckCP(uint16 _dstChainId, uint256 _dstPoolId) internal view returns (ChainPath storage) { require(chainPaths.length > 0, "Stargate: no chainpaths exist"); ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist"); return cp; } function getChainPath(uint16 _dstChainId, uint256 _dstPoolId) external view returns (ChainPath memory) { ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist"); return cp; } function _burnLocal(address _from, uint256 _amountLP) internal returns (uint256) { require(totalSupply > 0, "Stargate: cant burn when totalSupply == 0"); uint256 amountOfLPTokens = balanceOf[_from]; require(amountOfLPTokens >= _amountLP, "Stargate: not enough LP tokens to burn"); uint256 amountSD = _amountLP.mul(totalLiquidity).div(totalSupply); //subtract totalLiquidity accordingly totalLiquidity = totalLiquidity.sub(amountSD); _burn(_from, _amountLP); emit Burn(_from, _amountLP, amountSD); return amountSD; } function _delta(bool fullMode) internal { if (deltaCredit > 0 && totalWeight > 0) { uint256 cpLength = chainPaths.length; uint256[] memory deficit = new uint256[](cpLength); uint256 totalDeficit = 0; // algorithm steps 6-9: calculate the total and the amounts required to get to balance state for (uint256 i = 0; i < cpLength; ++i) { ChainPath storage cp = chainPaths[i]; // (liquidity * (weight/totalWeight)) - (lkb+credits) uint256 balLiq = totalLiquidity.mul(cp.weight).div(totalWeight); uint256 currLiq = cp.lkb.add(cp.credits); if (balLiq > currLiq) { // save gas since we know balLiq > currLiq and we know deficit[i] > 0 deficit[i] = balLiq - currLiq; totalDeficit = totalDeficit.add(deficit[i]); } } // indicates how much delta credit is distributed uint256 spent; // handle credits with 2 tranches. the [ < totalDeficit] [excessCredit] // run full Delta, allocate all credits if (totalDeficit == 0) { // only fullMode delta will allocate excess credits if (fullMode && deltaCredit > 0) { // credit ChainPath by weights for (uint256 i = 0; i < cpLength; ++i) { ChainPath storage cp = chainPaths[i]; // credits = credits + toBalanceChange + remaining allocation based on weight uint256 amtToCredit = deltaCredit.mul(cp.weight).div(totalWeight); spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } // else do nth } else if (totalDeficit <= deltaCredit) { if (fullMode) { // algorithm step 13: calculate amount to disperse to bring to balance state or as close as possible uint256 excessCredit = deltaCredit - totalDeficit; // algorithm steps 14-16: calculate credits for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; // credits = credits + deficit + remaining allocation based on weight uint256 amtToCredit = deficit[i].add(excessCredit.mul(cp.weight).div(totalWeight)); spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } } else { // totalDeficit <= deltaCredit but not running fullMode // credit chainPaths as is if any deficit, not using all deltaCredit for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; uint256 amtToCredit = deficit[i]; spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } } } else { // totalDeficit > deltaCredit, fullMode or not, normalize the deficit by deltaCredit for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; uint256 proportionalDeficit = deficit[i].mul(deltaCredit).div(totalDeficit); spent = spent.add(proportionalDeficit); cp.credits = cp.credits.add(proportionalDeficit); } } } // deduct the amount of credit sent deltaCredit = deltaCredit.sub(spent); } } function _mintLocal( address _to, uint256 _amountLD, bool _feesEnabled, bool _creditDelta ) internal returns (uint256 amountSD) { require(totalWeight > 0, "Stargate: No ChainPaths exist"); amountSD = amountLDtoSD(_amountLD); uint256 mintFeeSD = 0; if (_feesEnabled) { mintFeeSD = amountSD.mul(mintFeeBP).div(BP_DENOMINATOR); amountSD = amountSD.sub(mintFeeSD); mintFeeBalance = mintFeeBalance.add(mintFeeSD); } if (_creditDelta) { deltaCredit = deltaCredit.add(amountSD); } uint256 amountLPTokens = amountSD; if (totalSupply != 0) { amountLPTokens = amountSD.mul(totalSupply).div(totalLiquidity); } totalLiquidity = totalLiquidity.add(amountSD); _mint(_to, amountLPTokens); emit Mint(_to, amountLPTokens, amountSD, mintFeeSD); // add to credits and call delta. short circuit to save gas if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultLPMode); } } function _safeTransfer( address _token, address _to, uint256 _value ) private { (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(SELECTOR, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Stargate: TRANSFER_FAILED"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountLD","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"CachedSwapSaved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":true,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"srcPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstPoolId","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmountSD","type":"uint256"}],"name":"RedeemLocalCallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"bridgeFunctionType","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"Revert","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"to","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"redeemAmountSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmountSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":true,"internalType":"bytes","name":"srcAddress","type":"bytes"}],"name":"RevertRedeemLocal","type":"event"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"}],"name":"activateChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract Bridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"cachedSwapLookup","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountLD","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"payload","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"bool","name":"_fullMode","type":"bool"}],"name":"callDelta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"clearCachedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint256","name":"_weight","type":"uint256"}],"name":"createChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint8","name":"_sharedDecimals","type":"uint8"},{"internalType":"uint8","name":"_localDecimals","type":"uint8"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"}],"name":"creditChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcPoolId","type":"uint16"},{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"instantRedeemLocal","outputs":[{"internalType":"uint256","name":"amountSD","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolFeeOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint8","name":"_functionType","type":"uint8"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"bytes","name":"_transferAndCallPayload","type":"bytes"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"quoteLayerZeroFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"bytes","name":"_to","type":"bytes"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"redeemLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amountSD","type":"uint256"},{"internalType":"uint256","name":"_mintAmountSD","type":"uint256"}],"name":"redeemLocalCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint256","name":"_amountSD","type":"uint256"},{"internalType":"bytes","name":"_to","type":"bytes"}],"name":"redeemLocalCheckOnRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"uint256","name":"_amountLP","type":"uint256"},{"internalType":"uint256","name":"_minAmountLD","type":"uint256"},{"internalType":"bytes","name":"_to","type":"bytes"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"redeemRemote","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"}],"name":"retryRevert","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"revertLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"revertRedeemLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"}],"name":"sendCredits","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract Bridge","name":"_bridge","type":"address"},{"internalType":"contract Factory","name":"_factory","type":"address"}],"name":"setBridgeAndFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"bool","name":"_batched","type":"bool"},{"internalType":"uint256","name":"_swapDeltaBP","type":"uint256"},{"internalType":"uint256","name":"_lpDeltaBP","type":"uint256"},{"internalType":"bool","name":"_defaultSwapMode","type":"bool"},{"internalType":"bool","name":"_defaultLPMode","type":"bool"}],"name":"setDeltaParam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_feeLibraryAddr","type":"address"}],"name":"setFeeLibrary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint256","name":"_mintFeeBP","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setMintFeeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setProtocolFeeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"bool","name":"_swapStop","type":"bool"}],"name":"setSwapStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint16","name":"_weight","type":"uint16"}],"name":"setWeightForChainPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"uint256","name":"_amountLD","type":"uint256"},{"internalType":"uint256","name":"_minAmountLD","type":"uint256"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"},{"internalType":"bytes","name":"_to","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstGasForCall","type":"uint256"},{"internalType":"address","name":"_to","type":"address"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"eqFee","type":"uint256"},{"internalType":"uint256","name":"eqReward","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"lkbRemove","type":"uint256"}],"internalType":"struct Pool.SwapObj","name":"_s","type":"tuple"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"swapRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawMintFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_poolId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060006200001e62000072565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001805562000076565b3390565b6151af80620000866000396000f3fe60806040526004361061021a5760003560e01c806387b21efc11610123578063c45a0155116100ab578063cefbdde21161006f578063cefbdde2146105dd578063da133a06146105fd578063e78cea921461062a578063f2fde38b1461063f578063fba6e2801461065f5761021a565b8063c45a01551461053b578063c4de93a514610550578063c6a276241461057d578063c7d968e31461059d578063c8adf12d146105bd5761021a565b80639ba3aa74116100f25780639ba3aa74146104cb5780639fbf10fc146104de578063a18fa804146104f1578063a96fbed414610511578063af640d82146105265761021a565b806387b21efc146104635780638da5cb5b146104835780638f2e1d181461049857806398e391a1146104ab5761021a565b806343a30630116101a6578063715018a611610175578063715018a6146103ce5780637af935a1146103e35780637b84d287146104105780637f7212981461043057806384d0dba3146104505761021a565b806343a30630146103685780635500585c1461038857806360a3b95c146103a85780636a7982da146103bb5761021a565b806323fd4647116101ed57806323fd4647146102b85780632f925555146102e857806334aba41014610308578063403a9f7a14610328578063424c9119146103485761021a565b80630403bce51461021f5780630a512369146102415780630b78f9c01461027857806316fb60f514610298575b600080fd5b34801561022b57600080fd5b5061023f61023a366004613af8565b61067f565b005b34801561024d57600080fd5b5061026161025c366004613ebb565b6108eb565b60405161026f929190614f12565b60405180910390f35b34801561028457600080fd5b5061023f610293366004614179565b61098b565b3480156102a457600080fd5b5061023f6102b336600461413f565b610a5e565b3480156102c457600080fd5b506102d86102d33660046138f5565b610b2c565b60405161026f94939291906144c9565b3480156102f457600080fd5b5061023f6103033660046139d7565b610c0b565b34801561031457600080fd5b5061023f61032336600461371d565b610c46565b34801561033457600080fd5b5061023f61034336600461380b565b610cf0565b34801561035457600080fd5b5061023f610363366004613771565b610f23565b34801561037457600080fd5b5061023f610383366004614060565b61103d565b34801561039457600080fd5b5061023f6103a3366004613f85565b61111c565b61023f6103b636600461380b565b611180565b61023f6103c9366004613862565b6113fd565b3480156103da57600080fd5b5061023f6116ae565b3480156103ef57600080fd5b506104036103fe366004613fa9565b61175a565b60405161026f9190614411565b34801561041c57600080fd5b5061023f61042b3660046140fa565b61187d565b34801561043c57600080fd5b5061023f61044b366004613949565b61191d565b61023f61045e366004613cc0565b611961565b34801561046f57600080fd5b5061023f61047e3660046141bd565b611c96565b34801561048f57600080fd5b50610403611e81565b61023f6104a6366004613c1b565b611e90565b3480156104b757600080fd5b5061023f6104c636600461403c565b6120b1565b61023f6104d9366004613bd4565b61214d565b61023f6104ec366004613d5f565b6122c5565b3480156104fd57600080fd5b5061023f61050c366004613e3f565b61261a565b34801561051d57600080fd5b50610403612682565b34801561053257600080fd5b50610403612691565b34801561054757600080fd5b506104036126a0565b34801561055c57600080fd5b5061057061056b366004613b95565b6126af565b60405161026f9190614ebc565b34801561058957600080fd5b5061023f610598366004613f85565b6127ba565b3480156105a957600080fd5b5061023f6105b83660046140c6565b612856565b3480156105c957600080fd5b5061023f6105d8366004613f85565b612922565b3480156105e957600080fd5b5061023f6105f836600461371d565b612986565b34801561060957600080fd5b5061061d6106183660046138f5565b612a30565b60405161026f9190614530565b34801561063657600080fd5b50610403612aed565b34801561064b57600080fd5b5061023f61065a36600461371d565b612afc565b34801561066b57600080fd5b5061023f61067a36600461403c565b612bfe565b6005546001600160a01b031633146106b25760405162461bcd60e51b81526004016106a990614611565b60405180910390fd5b60006106bd85612c38565b604051637544f15560e11b81529091506001600160a01b0382169063ea89e2aa906106f0908c908a908990600401614c12565b6040805180830381600087803b15801561070957600080fd5b505af1925050508015610739575060408051601f3d908101601f191682019092526107369181019061419a565b60015b6108025760018686600087878760405160200161075c9796959493929190614f8d565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161078c908b906143f5565b9081526020016040518091039020600089815260200190815260200160002090805190602001906107be929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60018a8a8a6040516107f59493929190614f20565b60405180910390a16108e0565b60018888848489896040516020016108209796959493929190615014565b60408051601f1981840301815282825261ffff8e1660009081526006602052919091209091610850908d906143f5565b908152602001604051809103902060008b81526020019081526020016000209080519060200190610882929190613495565b508960405161089191906143f5565b6040518091039020897f6ace246fa15cf1d5decabf654b1e8581a4422e0fcf4c1ed4bf83f41687caec198d8b8b8a8a89896040516108d59796959493929190614e2e565b60405180910390a350505b505050505050505050565b600554604051630a51236960e01b815260009182916001600160a01b0390911690630a5123699061092c908c908c908c908c908c908c908c90600401614e6e565b604080518083038186803b15801561094357600080fd5b505afa158015610957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097b919061419a565b9150915097509795505050505050565b610993612ce6565b6001600160a01b03166109a4611e81565b6001600160a01b0316146109ed576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006109f883612c38565b6040516369fe0e2d60e01b81529091506001600160a01b038216906369fe0e2d90610a27908590600401614ebc565b600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050505050565b610a66612ce6565b6001600160a01b0316610a77611e81565b6001600160a01b031614610ac0576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6000610acb85612c38565b6040516320d6bc7560e01b81529091506001600160a01b038216906320d6bc7590610afe90879087908790600401614c12565b600060405180830381600087803b158015610b1857600080fd5b505af11580156108e0573d6000803e3d6000fd5b600760209081526000938452604080852084518086018401805192815290840195840195909520945292815290835291819020805460018083015460028085015460038601805488516101009682161596909602600019011692909204601f81018990048902850189019097528684526001600160a01b03948516979296941694939091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905084565b6005546001600160a01b03163314610c355760405162461bcd60e51b81526004016106a990614611565b6108e0898989898989898989612cea565b610c4e612ce6565b6001600160a01b0316610c5f611e81565b6001600160a01b031614610ca8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116610cce5760405162461bcd60e51b81526004016106a990614822565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff84166000908152600760205260408082209051610d1390869086906143e5565b9081526040805160209281900383018120600086815290845282902060808201835280546001600160a01b039081168352600180830154868501526002808401549092168486015260038301805486516101009382161593909302600019011692909204601f810187900487028201870190955284815292949193606086019392830182828015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b5050509190925250505060408101519091506001600160a01b0316610e1c5760405162461bcd60e51b81526004016106a990614859565b604080516080810182526000808252602080830182905282840182905283518082018552828152606084015261ffff89168252600790528290209151909190610e6890879087906143e5565b90815260408051602092819003830190206000868152908352819020835181546001600160a01b03199081166001600160a01b0392831617835585850151600184015592850151600283018054909416911617909155606083015180519192610ed992600385019290910190613495565b505050604080820151825160208401516060850151935163ab8236f360e01b81526001600160a01b039093169363ab8236f393610afe938b938b938b938b939291906004016149c6565b610f2b612ce6565b6001600160a01b0316610f3c611e81565b6001600160a01b031614610f85576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6005546001600160a01b0316158015610fa757506002546001600160a01b0316155b610fc35760405162461bcd60e51b81526004016106a990614543565b6001600160a01b038216610fe95760405162461bcd60e51b81526004016106a99061475b565b6001600160a01b03811661100f5760405162461bcd60e51b81526004016106a9906146ed565b600580546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b611045612ce6565b6001600160a01b0316611056611e81565b6001600160a01b03161461109f576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006110aa87612c38565b60405163e065608b60e01b81529091506001600160a01b0382169063e065608b906110e19089908990899089908990600401614507565b600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b5050505050505050505050565b6004546001600160a01b031633146111465760405162461bcd60e51b81526004016106a990614648565b600061115183612c38565b60405163011dbbf960e61b81529091506001600160a01b0382169063476efe4090610a27908590600401614411565b61ffff841660009081526006602052604080822090516111a390869086906143e5565b90815260408051602092819003830181206000868152908452829020805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561123d5780601f106112125761010080835404028352916020019161123d565b820191906000526020600020905b81548152906001019060200180831161122057829003601f168201915b5050505050905060008151116112655760405162461bcd60e51b81526004016106a99061467f565b6040805160208082018352600080835261ffff891681526006909152829020915190919061129690879087906143e5565b9081526020016040518091039020600084815260200190815260200160002090805190602001906112c8929190613495565b50602081015160ff811660021415611353576000806000806000868060200190518101906112f691906141ea565b95509550955095509550506113498b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508a9150899050888888613152565b50505050506113f5565b60ff8116600314156113dd576000806000806000808780602001905181019061137c9190614249565b965096509650965096509650506113d28c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508b91508a905089898989612cea565b5050505050506113f5565b60405162461bcd60e51b81526004016106a9906148c7565b505050505050565b6001600160a01b0382166114235760405162461bcd60e51b81526004016106a990614935565b61ffff8616600090815260066020526040808220905161144690889088906143e5565b90815260408051602092819003830181206000888152908452829020805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b5050505050905060008151116115085760405162461bcd60e51b81526004016106a99061467f565b602081015160ff81166001146115305760405162461bcd60e51b81526004016106a9906148c7565b506040805160208082018352600080835261ffff8b1681526006909152829020915190919061156290899089906143e5565b908152602001604051809103902060008681526020019081526020016000209080519060200190611594929190613495565b50604081015160608201516115a7613521565b60006115b283612c38565b604051630474ec6160e11b81529091506001600160a01b038216906308e9d8c2906115e3908e908890600401614af4565b6040805180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906137a9565b6005546040516396aae4af60e01b81529193506001600160a01b031691506396aae4af903490611670908e908b9087908c908c9060040161497b565b6000604051808303818588803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050505050505050505050505050565b6116b6612ce6565b6001600160a01b03166116c7611e81565b6001600160a01b031614611710576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000611764612ce6565b6001600160a01b0316611775611e81565b6001600160a01b0316146117be576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b0386166117e45760405162461bcd60e51b81526004016106a990614593565b600254604051637af935a160e01b81526001600160a01b0390911690637af935a19061181e908a908a908a908a908a908a90600401614ec5565b602060405180830381600087803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613739565b90505b9695505050505050565b611885612ce6565b6001600160a01b0316611896611e81565b6001600160a01b0316146118df576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006118ea85612c38565b60405163a985565f60e01b81529091506001600160a01b0382169063a985565f90610afe90879087908790600401614bf4565b6005546001600160a01b031633146119475760405162461bcd60e51b81526004016106a990614611565b6119578888888888888888613152565b5050505050505050565b600260015414156119a7576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b0386166119d25760405162461bcd60e51b81526004016106a990614935565b600085116119f25760405162461bcd60e51b81526004016106a9906145ca565b6119fa61353b565b611a02613521565b6000611a0d8b612c38565b90506000816001600160a01b031663f6cd35ee8a6040518263ffffffff1660e01b8152600401611a3d9190614ebc565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190613f6d565b9050816001600160a01b0316631b7319b68e8d33858d60006040518763ffffffff1660e01b8152600401611ac696959493929190614b32565b60c060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1891906137f0565b9350816001600160a01b0316637298a5dc8e8d338d6040518563ffffffff1660e01b8152600401611b4c9493929190614b08565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050816001600160a01b03166308e9d8c28e8d6040518363ffffffff1660e01b8152600401611bac929190614af4565b6040805180830381600087803b158015611bc557600080fd5b505af1158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd91906137a9565b92505050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348d8d8d8d87898b8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614cf7565b6000604051808303818588803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b5050600180555050505050505050505050505050565b60026001541415611cdc576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556000611cec84612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190613f6d565b9050611d7781611d7186826132e4565b9061334d565b9350611df5826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190613739565b3384876133ad565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611e2390869088906004016144b0565b602060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613f6d565b50506001805550505050565b6000546001600160a01b031690565b60026001541415611ed6576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b038516611f015760405162461bcd60e51b81526004016106a990614935565b6000611f0c88612c38565b905060008511611f2e5760405162461bcd60e51b81526004016106a990614792565b604051632c3eac2f60e21b81526000906001600160a01b0383169063b0fab0bc90611f679033908a908f908e908c908c90600401614448565b602060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613f6d565b905060008111611fdb5760405162461bcd60e51b81526004016106a9906147d3565b604051630474ec6160e11b81526000906001600160a01b038416906308e9d8c29061200c908e908d90600401614af4565b6040805180830381600087803b15801561202557600080fd5b505af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906137a9565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316633cef94b9348d8d8d8d87898e8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614d83565b6120b9612ce6565b6001600160a01b03166120ca611e81565b6001600160a01b031614612113576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600061211e83612c38565b60405163ac2cc36b60e01b81529091506001600160a01b0382169063ac2cc36b90610a279085906004016144fc565b60026001541415612193576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b0381166121be5760405162461bcd60e51b81526004016106a990614935565b60006121c984612c38565b90506000816001600160a01b03166308e9d8c287866040518363ffffffff1660e01b81526004016121fb929190614af4565b6040805180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224c91906137a9565b600554604051632fa7502b60e21b81529192506001600160a01b03169063be9d40ac903490612287908a908a908a908a908990600401614c2e565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505060018055505050505050505050565b6002600154141561230b576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001558661232d5760405162461bcd60e51b81526004016106a990614890565b6001600160a01b0388166123535760405162461bcd60e51b81526004016106a990614935565b61235b61353b565b612363613521565b600061236e8d612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e39190613f6d565b90506123f381611d718d826132e4565b9a5050806001600160a01b0316631b7319b68f8e338e8e60016040518763ffffffff1660e01b815260040161242d96959493929190614b32565b60c060405180830381600087803b15801561244757600080fd5b505af115801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f91906137f0565b92506124fd816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613739565b33838d6133ad565b806001600160a01b03166308e9d8c28f8e6040518363ffffffff1660e01b815260040161252b929190614af4565b6040805180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c91906137a9565b915050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348f8f8f8f87898f8f8f8f8f6040518d63ffffffff1660e01b81526004016125d59b9a99989796959493929190614c63565b6000604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50506001805550505050505050505050505050505050565b6005546001600160a01b031633146126445760405162461bcd60e51b81526004016106a990614611565b600061264f83612c38565b60405163b6addec760e01b81529091506001600160a01b0382169063b6addec790610afe90889088908790600401614bd5565b6003546001600160a01b031681565b6004546001600160a01b031681565b6002546001600160a01b031681565b6000600260015414156126f7576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b6002600155826127195760405162461bcd60e51b81526004016106a990614792565b60006127288561ffff16612c38565b6040516304c35b0d60e11b81529091506001600160a01b03821690630986b61a9061275b90339088908890600401614425565b602060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613f6d565b6001805595945050505050565b6127c2612ce6565b6001600160a01b03166127d3611e81565b6001600160a01b03161461281c576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600061282783612c38565b6040516312d72b2f60e21b81529091506001600160a01b03821690634b5cacbc90610a27908590600401614411565b61285e612ce6565b6001600160a01b031661286f611e81565b6001600160a01b0316146128b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006128c384612c38565b6040516345ec368560e11b81529091506001600160a01b03821690638bd86d0a906128f49086908690600401614af4565b600060405180830381600087803b15801561290e57600080fd5b505af1158015611957573d6000803e3d6000fd5b6003546001600160a01b0316331461294c5760405162461bcd60e51b81526004016106a990614724565b600061295783612c38565b604051632f8c40a560e21b81529091506001600160a01b0382169063be31029490610a27908590600401614411565b61298e612ce6565b6001600160a01b031661299f611e81565b6001600160a01b0316146129e8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116612a0e5760405162461bcd60e51b81526004016106a990614822565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452928152908352918190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015612ae55780601f10612aba57610100808354040283529160200191612ae5565b820191906000526020600020905b815481529060010190602001808311612ac857829003601f168201915b505050505081565b6005546001600160a01b031681565b612b04612ce6565b6001600160a01b0316612b15611e81565b6001600160a01b031614612b5e576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116612ba35760405162461bcd60e51b81526004018080602001828103825260268152602001806151136026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612c0983612c38565b604051637fb6526560e01b81529091506001600160a01b03821690637fb6526590610a279085906004016144fc565b60025460405163068bcd8d60e01b81526000916001600160a01b03169063068bcd8d90612c69908590600401614ebc565b60206040518083038186803b158015612c8157600080fd5b505afa158015612c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb99190613739565b90506001600160a01b038116612ce15760405162461bcd60e51b81526004016106a9906148fe565b919050565b3390565b6000612cf586612c38565b60405163902b8ab760e01b81529091506001600160a01b0382169063902b8ab790612d2a908d908b9089908990600401614b6b565b602060405180830381600087803b158015612d4457600080fd5b505af1925050508015612d74575060408051601f3d908101601f19168201909252612d7191810190613f6d565b60015b612e3c576003878787878787604051602001612d969796959493929190614fc5565b60408051601f1981840301815282825261ffff8d1660009081526006602052919091209091612dc6908c906143f5565b908152602001604051809103902060008a81526020019081526020016000209080519060200190612df8929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60038b8b8b604051612e2f9493929190614f20565b60405180910390a1613146565b82511561110f57846001600160a01b031663ab8236f3878d8d8d876001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613739565b878a6040518863ffffffff1660e01b8152600401612eea96959493929190614a9b565b600060405180830381600088803b158015612f0457600080fd5b5087f193505050508015612f16575060015b61110f573d808015612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b506040518060800160405280846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f8e57600080fd5b505afa158015612fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc69190613739565b6001600160a01b03168152602001838152602001876001600160a01b0316815260200185815250600760008e61ffff1661ffff1681526020019081526020016000208c60405161301691906143f5565b908152604080516020928190038301902060008e8152908352819020835181546001600160a01b03199081166001600160a01b039283161783558585015160018401559285015160028301805490941691161790915560608301518051919261308792600385019290910190613495565b509050507f8186389e97ff190cd5e17304ed8188a4a98a6c8add46e6df94462ac7f7e8dd348c8c8c866001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190613739565b868b8a88604051613138989796959493929190614a21565b60405180910390a15061110f565b50505050505050505050565b600061315d85612c38565b604051632cc36bab60e21b81529091506001600160a01b0382169063b30daeac90613194908c908a90899089908990600401614ba3565b600060405180830381600087803b1580156131ae57600080fd5b505af19250505080156131bf575060015b61328157600286868686866040516020016131df96959493929190614f57565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161320f908b906143f5565b908152602001604051809103902060008981526020019081526020016000209080519060200190613241929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60028a8a8a6040516132789493929190614f20565b60405180910390a15b868860405161329091906143f5565b60405180910390207fc7379a02e530fbd0a46ea1ce6fd91987e96535798231a796bdc0e1a688a508738b89898989896040516132d196959493929190614df7565b60405180910390a3505050505050505050565b600080821161333a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161334357fe5b0490505b92915050565b60008261335c57506000613347565b8282028284828161336957fe5b04146133a65760405162461bcd60e51b81526004018080602001828103825260218152602001806151396021913960400191505060405180910390fd5b9392505050565b600080856001600160a01b03166323b872dd8686866040516024016133d49392919061448c565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161340d91906143f5565b6000604051808303816000865af19150503d806000811461344a576040519150601f19603f3d011682016040523d82523d6000602084013e61344f565b606091505b50915091508180156134795750805115806134795750808060200190518101906134799190613755565b6113f55760405162461bcd60e51b81526004016106a9906146b6565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134cb5760008555613511565b82601f106134e457805160ff1916838001178555613511565b82800160010185558215613511579182015b828111156135115782518255916020019190600101906134f6565b5061351d929150613571565b5090565b604051806040016040528060008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b8082111561351d5760008155600101613572565b8035612ce1816150bd565b60008083601f8401126135a2578182fd5b5081356001600160401b038111156135b8578182fd5b6020830191508360208285010111156135d057600080fd5b9250929050565b600082601f8301126135e7578081fd5b81356135fa6135f58261506c565b615049565b81815284602083860101111561360e578283fd5b816020850160208301379081016020019190915292915050565b600060c08284031215613639578081fd5b60405160c081018181106001600160401b038211171561365557fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000606082840312156136ab578081fd5b604051606081016001600160401b0382821081831117156136c857fe5b81604052829350843583526020850135602084015260408501359150808211156136f157600080fd5b506136fe858286016135d7565b6040830152505092915050565b803561ffff81168114612ce157600080fd5b60006020828403121561372e578081fd5b81356133a6816150bd565b60006020828403121561374a578081fd5b81516133a6816150bd565b600060208284031215613766578081fd5b81516133a6816150d5565b60008060408385031215613783578081fd5b823561378e816150bd565b9150602083013561379e816150bd565b809150509250929050565b6000604082840312156137ba578081fd5b604051604081018181106001600160401b03821117156137d657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215613801578081fd5b6133a68383613628565b60008060008060608587031215613820578182fd5b6138298561370b565b935060208501356001600160401b03811115613843578283fd5b61384f87828801613591565b9598909750949560400135949350505050565b60008060008060008060a0878903121561387a578384fd5b6138838761370b565b955060208701356001600160401b038082111561389e578586fd5b6138aa8a838b01613591565b909750955060408901359450606089013591506138c6826150bd565b909250608088013590808211156138db578283fd5b506138e889828a0161369a565b9150509295509295509295565b600080600060608486031215613909578081fd5b6139128461370b565b925060208401356001600160401b0381111561392c578182fd5b613938868287016135d7565b925050604084013590509250925092565b600080600080600080600080610100898b031215613965578586fd5b61396e8961370b565b975060208901356001600160401b03811115613988578687fd5b6139948b828c016135d7565b97505060408901359550606089013594506080890135935060a08901356139ba816150bd565b979a969950949793969295929450505060c08201359160e0013590565b6000806000806000806000806000898b036101c08112156139f6578384fd5b6139ff8b61370b565b995060208b01356001600160401b0380821115613a1a578586fd5b613a268e838f016135d7565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d01359150613a54826150bd565b81955060c060df1984011215613a68578384fd5b604051925060c0830191508282108183111715613a8157fe5b8160405260e08d013583526101008d013560208401526101208d013560408401526101408d013560608401526101608d013560808401526101808d013560a08401528294506101a08d0135925080831115613ada578384fd5b5050613ae88c828d016135d7565b9150509295985092959850929598565b60008060008060008060008060e0898b031215613b13578182fd5b613b1c8961370b565b975060208901356001600160401b0380821115613b37578384fd5b613b438c838d016135d7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135915080821115613b74578384fd5b50613b818b828c01613591565b999c989b5096995094979396929594505050565b600080600060608486031215613ba9578081fd5b613bb28461370b565b9250602084013591506040840135613bc9816150bd565b809150509250925092565b60008060008060808587031215613be9578182fd5b613bf28561370b565b935060208501359250604085013591506060850135613c10816150bd565b939692955090935050565b60008060008060008060008060e0898b031215613c36578182fd5b613c3f8961370b565b975060208901359650604089013595506060890135613c5d816150bd565b94506080890135935060a08901356001600160401b0380821115613c7f578384fd5b613c8b8c838d01613591565b909550935060c08b0135915080821115613ca3578283fd5b50613cb08b828c0161369a565b9150509295985092959890939650565b60008060008060008060008060006101008a8c031215613cde578283fd5b613ce78a61370b565b985060208a0135975060408a0135965060608a0135613d05816150bd565b955060808a0135945060a08a0135935060c08a01356001600160401b0380821115613d2e578485fd5b613d3a8d838e01613591565b909550935060e08c0135915080821115613d52578283fd5b50613ae88c828d0161369a565b60008060008060008060008060008060006101208c8e031215613d80578485fd5b613d898c61370b565b9a5060208c0135995060408c01359850613da560608d01613586565b975060808c0135965060a08c013595506001600160401b038060c08e01351115613dcd578586fd5b613ddd8e60c08f01358f0161369a565b95508060e08e01351115613def578283fd5b613dff8e60e08f01358f01613591565b90955093506101008d0135811015613e15578283fd5b50613e278d6101008e01358e01613591565b81935080925050509295989b509295989b9093969950565b60008060008084860360a0811215613e55578283fd5b613e5e8661370b565b9450602086013593506040808701359350605f1982011215613e7e578182fd5b50604051604081018181106001600160401b0382111715613e9b57fe5b604052606086013581526080909501356020860152509194909350909190565b600080600080600080600060a0888a031215613ed5578081fd5b613ede8861370b565b96506020880135613eee816150e3565b955060408801356001600160401b0380821115613f09578283fd5b613f158b838c01613591565b909750955060608a0135915080821115613f2d578283fd5b613f398b838c01613591565b909550935060808a0135915080821115613f51578283fd5b50613f5e8a828b0161369a565b91505092959891949750929550565b600060208284031215613f7e578081fd5b5051919050565b60008060408385031215613f97578182fd5b82359150602083013561379e816150bd565b60008060008060008060c08789031215613fc1578384fd5b863595506020870135613fd3816150bd565b94506040870135613fe3816150e3565b93506060870135613ff3816150e3565b925060808701356001600160401b038082111561400e578384fd5b61401a8a838b016135d7565b935060a089013591508082111561402f578283fd5b506138e889828a016135d7565b6000806040838503121561404e578182fd5b82359150602083013561379e816150d5565b60008060008060008060c08789031215614078578384fd5b86359550602087013561408a816150d5565b9450604087013593506060870135925060808701356140a8816150d5565b915060a08701356140b8816150d5565b809150509295509295509295565b6000806000606084860312156140da578081fd5b833592506140ea6020850161370b565b9150604084013590509250925092565b6000806000806080858703121561410f578182fd5b8435935061411f6020860161370b565b9250604085013591506141346060860161370b565b905092959194509250565b60008060008060808587031215614154578182fd5b843593506141646020860161370b565b93969395505050506040820135916060013590565b6000806040838503121561418b578182fd5b50508035926020909101359150565b600080604083850312156141ac578182fd5b505080516020909101519092909150565b6000806000606084860312156141d1578081fd5b83359250602084013591506040840135613bc9816150bd565b60008060008060008060c08789031215614202578384fd5b865161420d816150e3565b809650506020870151945060408701519350606087015161422d816150bd565b809350506080870151915060a087015190509295509295509295565b6000806000806000806000610180888a031215614264578081fd5b875161426f816150e3565b809750506020880151955060408801519450606088015193506080880151614296816150bd565b92506142a58960a08a01613628565b91506101608801516001600160401b038111156142c0578182fd5b8801601f81018a136142d0578182fd5b80516142de6135f58261506c565b8181528b60208385010111156142f2578384fd5b61430382602083016020860161508d565b80935050505092959891949750929550565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261435781602086016020860161508d565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600081518352602082015160208401526040820151606060408501526143dd606085018261433f565b949350505050565b6000828483379101908152919050565b6000825161440781846020870161508d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b600060018060a01b038816825286602083015261ffff8616604083015284606083015260a0608083015261448060a083018486614315565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825260208201859052831660408201526080606082018190526000906118739083018461433f565b901515815260200190565b941515855260208501939093526040840191909152151560608301521515608082015260a00190565b6000602082526133a6602083018461433f565b60208082526030908201527f53746172676174653a2062726964676520616e6420666163746f727920616c7260408201526f1958591e481a5b9a5d1a585b1a5e995960821b606082015260800190565b6020808252601e908201527f53746172676174653a205f746f6b656e2063616e6e6f74206265203078300000604082015260600190565b60208082526027908201527f53746172676174653a206e6f7420656e6f756768206c7020746f2072656465656040820152666d52656d6f746560c81b606082015260800190565b6020808252601e908201527f4272696467653a2063616c6c6572206d757374206265204272696467652e0000604082015260600190565b6020808252601b908201527f53746172676174653a206f6e6c79206d696e744665654f776e65720000000000604082015260600190565b60208082526019908201527f53746172676174653a206e6f2072657472792072657665727400000000000000604082015260600190565b6020808252601e908201527f53746172676174653a205452414e534645525f46524f4d5f4641494c45440000604082015260600190565b6020808252601d908201527f53746172676174653a20666163746f72792063616e7420626520307830000000604082015260600190565b6020808252601f908201527f53746172676174653a206f6e6c792070726f746f636f6c4665654f776e657200604082015260600190565b6020808252601c908201527f53746172676174653a206272696467652063616e742062652030783000000000604082015260600190565b60208082526021908201527f53746172676174653a206e6f7420656e6f756768206c7020746f2072656465656040820152606d60f81b606082015260800190565b6020808252602f908201527f53746172676174653a206e6f7420656e6f756768206c7020746f20726564656560408201526e1b481dda5d1a08185b5bdd5b9d14d1608a1b606082015260800190565b6020808252601e908201527f53746172676174653a205f6f776e65722063616e6e6f74206265203078300000604082015260600190565b6020808252601f908201527f53746172676174653a20636163686520616c726561647920636c656172656400604082015260600190565b60208082526017908201527f53746172676174653a2063616e6e6f7420737761702030000000000000000000604082015260600190565b6020808252601f908201527f53746172676174653a20696e76616c69642066756e6374696f6e207479706500604082015260600190565b6020808252601d908201527f53746172676174653a20506f6f6c20646f6573206e6f74206578697374000000604082015260600190565b60208082526026908201527f53746172676174653a205f726566756e64416464726573732063616e6e6f742060408201526506265203078360d41b606082015260800190565b61ffff861681526001600160a01b038516602082015260006149a0604083018661436b565b60c060808301526149b460c08301856143b4565b82810360a0840152614480818561433f565b600061ffff8916825260c060208301526149e460c08301888a614315565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614a13818561433f565b9a9950505050505050505050565b600061010061ffff8b168352806020840152614a3f8184018b61433f565b604084018a90526001600160a01b03898116606086015260808501899052871660a085015283810360c08501529050614a78818661433f565b905082810360e0840152614a8c818561433f565b9b9a5050505050505050505050565b600061ffff8816825260c06020830152614ab860c083018861433f565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614ae7818561433f565b9998505050505050505050565b61ffff929092168252602082015260400190565b61ffff94909416845260208401929092526001600160a01b03166040830152606082015260800190565b61ffff96909616865260208601949094526001600160a01b0392909216604085015260608401526080830152151560a082015260c00190565b61ffff85168152602081018490526001600160a01b03831660408201526101208101614b9a606083018461437a565b95945050505050565b61ffff95909516855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b61ffff8416815260208101839052608081016143dd604083018461436b565b61ffff93841681526020810192909252909116604082015260600190565b61ffff9390931683526020830191909152604082015260600190565b61ffff8616815260208101859052604081018490526001600160a01b038316606082015260c08101611873608083018461436b565b61ffff8c168152602081018b9052604081018a90526001600160a01b038916606082015260006101e0614c99608084018b61436b565b614ca660c084018a61437a565b80610180840152614cb9818401896143b4565b90508281036101a0840152614ccf818789614315565b90508281036101c0840152614ce5818587614315565b9e9d5050505050505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b038716606082015260006101e0614d2d608084018961436b565b614d3a60c084018861437a565b80610180840152614d4d818401876143b4565b90508281036101a0840152614d63818587614315565b8381036101c0909401939093525081526020019998505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b03871660608201526000610120614db9608084018961436b565b8660c08401528060e0840152614dd28184018688614315565b9050828103610100840152614de781856143b4565b9c9b505050505050505050505050565b61ffff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600061ffff8916825287602083015286604083015260c06060830152614e5860c083018688614315565b60808301949094525060a0015295945050505050565b600061ffff8916825260ff8816602083015260a06040830152614e9560a083018789614315565b8281036060840152614ea8818688614315565b90508281036080840152614a1381856143b4565b90815260200190565b8681526001600160a01b038616602082015260ff85811660408301528416606082015260c060808201819052600090614f009083018561433f565b82810360a0840152614ae7818561433f565b918252602082015260400190565b600060ff8616825261ffff8516602083015260806040830152614f46608083018561433f565b905082606083015295945050505050565b60ff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600060ff8916825287602083015286604083015260ff8616606083015284608083015260c060a0830152614ae760c083018486614315565b60ff881681526020810187905260408101869052606081018590526001600160a01b0384166080820152600061018061500160a084018661437a565b80610160840152614a138184018561433f565b600060ff8916825287602083015286604083015285606083015284608083015260c060a0830152614ae760c083018486614315565b6040518181016001600160401b038111828210171561506457fe5b604052919050565b60006001600160401b0382111561507f57fe5b50601f01601f191660200190565b60005b838110156150a8578181015183820152602001615090565b838111156150b7576000848401525b50505050565b6001600160a01b03811681146150d257600080fd5b50565b80151581146150d257600080fd5b60ff811681146150d257600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220181f743e310103183abe262a9c1c475826edb38bc83616c2ec93acd59de1b2dd64736f6c63430007060033
Deployed Bytecode
0x60806040526004361061021a5760003560e01c806387b21efc11610123578063c45a0155116100ab578063cefbdde21161006f578063cefbdde2146105dd578063da133a06146105fd578063e78cea921461062a578063f2fde38b1461063f578063fba6e2801461065f5761021a565b8063c45a01551461053b578063c4de93a514610550578063c6a276241461057d578063c7d968e31461059d578063c8adf12d146105bd5761021a565b80639ba3aa74116100f25780639ba3aa74146104cb5780639fbf10fc146104de578063a18fa804146104f1578063a96fbed414610511578063af640d82146105265761021a565b806387b21efc146104635780638da5cb5b146104835780638f2e1d181461049857806398e391a1146104ab5761021a565b806343a30630116101a6578063715018a611610175578063715018a6146103ce5780637af935a1146103e35780637b84d287146104105780637f7212981461043057806384d0dba3146104505761021a565b806343a30630146103685780635500585c1461038857806360a3b95c146103a85780636a7982da146103bb5761021a565b806323fd4647116101ed57806323fd4647146102b85780632f925555146102e857806334aba41014610308578063403a9f7a14610328578063424c9119146103485761021a565b80630403bce51461021f5780630a512369146102415780630b78f9c01461027857806316fb60f514610298575b600080fd5b34801561022b57600080fd5b5061023f61023a366004613af8565b61067f565b005b34801561024d57600080fd5b5061026161025c366004613ebb565b6108eb565b60405161026f929190614f12565b60405180910390f35b34801561028457600080fd5b5061023f610293366004614179565b61098b565b3480156102a457600080fd5b5061023f6102b336600461413f565b610a5e565b3480156102c457600080fd5b506102d86102d33660046138f5565b610b2c565b60405161026f94939291906144c9565b3480156102f457600080fd5b5061023f6103033660046139d7565b610c0b565b34801561031457600080fd5b5061023f61032336600461371d565b610c46565b34801561033457600080fd5b5061023f61034336600461380b565b610cf0565b34801561035457600080fd5b5061023f610363366004613771565b610f23565b34801561037457600080fd5b5061023f610383366004614060565b61103d565b34801561039457600080fd5b5061023f6103a3366004613f85565b61111c565b61023f6103b636600461380b565b611180565b61023f6103c9366004613862565b6113fd565b3480156103da57600080fd5b5061023f6116ae565b3480156103ef57600080fd5b506104036103fe366004613fa9565b61175a565b60405161026f9190614411565b34801561041c57600080fd5b5061023f61042b3660046140fa565b61187d565b34801561043c57600080fd5b5061023f61044b366004613949565b61191d565b61023f61045e366004613cc0565b611961565b34801561046f57600080fd5b5061023f61047e3660046141bd565b611c96565b34801561048f57600080fd5b50610403611e81565b61023f6104a6366004613c1b565b611e90565b3480156104b757600080fd5b5061023f6104c636600461403c565b6120b1565b61023f6104d9366004613bd4565b61214d565b61023f6104ec366004613d5f565b6122c5565b3480156104fd57600080fd5b5061023f61050c366004613e3f565b61261a565b34801561051d57600080fd5b50610403612682565b34801561053257600080fd5b50610403612691565b34801561054757600080fd5b506104036126a0565b34801561055c57600080fd5b5061057061056b366004613b95565b6126af565b60405161026f9190614ebc565b34801561058957600080fd5b5061023f610598366004613f85565b6127ba565b3480156105a957600080fd5b5061023f6105b83660046140c6565b612856565b3480156105c957600080fd5b5061023f6105d8366004613f85565b612922565b3480156105e957600080fd5b5061023f6105f836600461371d565b612986565b34801561060957600080fd5b5061061d6106183660046138f5565b612a30565b60405161026f9190614530565b34801561063657600080fd5b50610403612aed565b34801561064b57600080fd5b5061023f61065a36600461371d565b612afc565b34801561066b57600080fd5b5061023f61067a36600461403c565b612bfe565b6005546001600160a01b031633146106b25760405162461bcd60e51b81526004016106a990614611565b60405180910390fd5b60006106bd85612c38565b604051637544f15560e11b81529091506001600160a01b0382169063ea89e2aa906106f0908c908a908990600401614c12565b6040805180830381600087803b15801561070957600080fd5b505af1925050508015610739575060408051601f3d908101601f191682019092526107369181019061419a565b60015b6108025760018686600087878760405160200161075c9796959493929190614f8d565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161078c908b906143f5565b9081526020016040518091039020600089815260200190815260200160002090805190602001906107be929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60018a8a8a6040516107f59493929190614f20565b60405180910390a16108e0565b60018888848489896040516020016108209796959493929190615014565b60408051601f1981840301815282825261ffff8e1660009081526006602052919091209091610850908d906143f5565b908152602001604051809103902060008b81526020019081526020016000209080519060200190610882929190613495565b508960405161089191906143f5565b6040518091039020897f6ace246fa15cf1d5decabf654b1e8581a4422e0fcf4c1ed4bf83f41687caec198d8b8b8a8a89896040516108d59796959493929190614e2e565b60405180910390a350505b505050505050505050565b600554604051630a51236960e01b815260009182916001600160a01b0390911690630a5123699061092c908c908c908c908c908c908c908c90600401614e6e565b604080518083038186803b15801561094357600080fd5b505afa158015610957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097b919061419a565b9150915097509795505050505050565b610993612ce6565b6001600160a01b03166109a4611e81565b6001600160a01b0316146109ed576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006109f883612c38565b6040516369fe0e2d60e01b81529091506001600160a01b038216906369fe0e2d90610a27908590600401614ebc565b600060405180830381600087803b158015610a4157600080fd5b505af1158015610a55573d6000803e3d6000fd5b50505050505050565b610a66612ce6565b6001600160a01b0316610a77611e81565b6001600160a01b031614610ac0576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6000610acb85612c38565b6040516320d6bc7560e01b81529091506001600160a01b038216906320d6bc7590610afe90879087908790600401614c12565b600060405180830381600087803b158015610b1857600080fd5b505af11580156108e0573d6000803e3d6000fd5b600760209081526000938452604080852084518086018401805192815290840195840195909520945292815290835291819020805460018083015460028085015460038601805488516101009682161596909602600019011692909204601f81018990048902850189019097528684526001600160a01b03948516979296941694939091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b5050505050905084565b6005546001600160a01b03163314610c355760405162461bcd60e51b81526004016106a990614611565b6108e0898989898989898989612cea565b610c4e612ce6565b6001600160a01b0316610c5f611e81565b6001600160a01b031614610ca8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116610cce5760405162461bcd60e51b81526004016106a990614822565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b61ffff84166000908152600760205260408082209051610d1390869086906143e5565b9081526040805160209281900383018120600086815290845282902060808201835280546001600160a01b039081168352600180830154868501526002808401549092168486015260038301805486516101009382161593909302600019011692909204601f810187900487028201870190955284815292949193606086019392830182828015610de55780601f10610dba57610100808354040283529160200191610de5565b820191906000526020600020905b815481529060010190602001808311610dc857829003601f168201915b5050509190925250505060408101519091506001600160a01b0316610e1c5760405162461bcd60e51b81526004016106a990614859565b604080516080810182526000808252602080830182905282840182905283518082018552828152606084015261ffff89168252600790528290209151909190610e6890879087906143e5565b90815260408051602092819003830190206000868152908352819020835181546001600160a01b03199081166001600160a01b0392831617835585850151600184015592850151600283018054909416911617909155606083015180519192610ed992600385019290910190613495565b505050604080820151825160208401516060850151935163ab8236f360e01b81526001600160a01b039093169363ab8236f393610afe938b938b938b938b939291906004016149c6565b610f2b612ce6565b6001600160a01b0316610f3c611e81565b6001600160a01b031614610f85576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6005546001600160a01b0316158015610fa757506002546001600160a01b0316155b610fc35760405162461bcd60e51b81526004016106a990614543565b6001600160a01b038216610fe95760405162461bcd60e51b81526004016106a99061475b565b6001600160a01b03811661100f5760405162461bcd60e51b81526004016106a9906146ed565b600580546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b611045612ce6565b6001600160a01b0316611056611e81565b6001600160a01b03161461109f576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006110aa87612c38565b60405163e065608b60e01b81529091506001600160a01b0382169063e065608b906110e19089908990899089908990600401614507565b600060405180830381600087803b1580156110fb57600080fd5b505af115801561110f573d6000803e3d6000fd5b5050505050505050505050565b6004546001600160a01b031633146111465760405162461bcd60e51b81526004016106a990614648565b600061115183612c38565b60405163011dbbf960e61b81529091506001600160a01b0382169063476efe4090610a27908590600401614411565b61ffff841660009081526006602052604080822090516111a390869086906143e5565b90815260408051602092819003830181206000868152908452829020805460026001821615610100026000190190911604601f8101859004850283018501909352828252909290919083018282801561123d5780601f106112125761010080835404028352916020019161123d565b820191906000526020600020905b81548152906001019060200180831161122057829003601f168201915b5050505050905060008151116112655760405162461bcd60e51b81526004016106a99061467f565b6040805160208082018352600080835261ffff891681526006909152829020915190919061129690879087906143e5565b9081526020016040518091039020600084815260200190815260200160002090805190602001906112c8929190613495565b50602081015160ff811660021415611353576000806000806000868060200190518101906112f691906141ea565b95509550955095509550506113498b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508a9150899050888888613152565b50505050506113f5565b60ff8116600314156113dd576000806000806000808780602001905181019061137c9190614249565b965096509650965096509650506113d28c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508b91508a905089898989612cea565b5050505050506113f5565b60405162461bcd60e51b81526004016106a9906148c7565b505050505050565b6001600160a01b0382166114235760405162461bcd60e51b81526004016106a990614935565b61ffff8616600090815260066020526040808220905161144690889088906143e5565b90815260408051602092819003830181206000888152908452829020805460026001821615610100026000190190911604601f810185900485028301850190935282825290929091908301828280156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b5050505050905060008151116115085760405162461bcd60e51b81526004016106a99061467f565b602081015160ff81166001146115305760405162461bcd60e51b81526004016106a9906148c7565b506040805160208082018352600080835261ffff8b1681526006909152829020915190919061156290899089906143e5565b908152602001604051809103902060008681526020019081526020016000209080519060200190611594929190613495565b50604081015160608201516115a7613521565b60006115b283612c38565b604051630474ec6160e11b81529091506001600160a01b038216906308e9d8c2906115e3908e908890600401614af4565b6040805180830381600087803b1580156115fc57600080fd5b505af1158015611610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163491906137a9565b6005546040516396aae4af60e01b81529193506001600160a01b031691506396aae4af903490611670908e908b9087908c908c9060040161497b565b6000604051808303818588803b15801561168957600080fd5b505af115801561169d573d6000803e3d6000fd5b505050505050505050505050505050565b6116b6612ce6565b6001600160a01b03166116c7611e81565b6001600160a01b031614611710576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000611764612ce6565b6001600160a01b0316611775611e81565b6001600160a01b0316146117be576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b0386166117e45760405162461bcd60e51b81526004016106a990614593565b600254604051637af935a160e01b81526001600160a01b0390911690637af935a19061181e908a908a908a908a908a908a90600401614ec5565b602060405180830381600087803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118709190613739565b90505b9695505050505050565b611885612ce6565b6001600160a01b0316611896611e81565b6001600160a01b0316146118df576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006118ea85612c38565b60405163a985565f60e01b81529091506001600160a01b0382169063a985565f90610afe90879087908790600401614bf4565b6005546001600160a01b031633146119475760405162461bcd60e51b81526004016106a990614611565b6119578888888888888888613152565b5050505050505050565b600260015414156119a7576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b0386166119d25760405162461bcd60e51b81526004016106a990614935565b600085116119f25760405162461bcd60e51b81526004016106a9906145ca565b6119fa61353b565b611a02613521565b6000611a0d8b612c38565b90506000816001600160a01b031663f6cd35ee8a6040518263ffffffff1660e01b8152600401611a3d9190614ebc565b60206040518083038186803b158015611a5557600080fd5b505afa158015611a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8d9190613f6d565b9050816001600160a01b0316631b7319b68e8d33858d60006040518763ffffffff1660e01b8152600401611ac696959493929190614b32565b60c060405180830381600087803b158015611ae057600080fd5b505af1158015611af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1891906137f0565b9350816001600160a01b0316637298a5dc8e8d338d6040518563ffffffff1660e01b8152600401611b4c9493929190614b08565b600060405180830381600087803b158015611b6657600080fd5b505af1158015611b7a573d6000803e3d6000fd5b50505050816001600160a01b03166308e9d8c28e8d6040518363ffffffff1660e01b8152600401611bac929190614af4565b6040805180830381600087803b158015611bc557600080fd5b505af1158015611bd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfd91906137a9565b92505050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348d8d8d8d87898b8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614cf7565b6000604051808303818588803b158015611c6c57600080fd5b505af1158015611c80573d6000803e3d6000fd5b5050600180555050505050505050505050505050565b60026001541415611cdc576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556000611cec84612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b158015611d2957600080fd5b505afa158015611d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d619190613f6d565b9050611d7781611d7186826132e4565b9061334d565b9350611df5826001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db557600080fd5b505afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded9190613739565b3384876133ad565b6040516340c10f1960e01b81526001600160a01b038316906340c10f1990611e2390869088906004016144b0565b602060405180830381600087803b158015611e3d57600080fd5b505af1158015611e51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e759190613f6d565b50506001805550505050565b6000546001600160a01b031690565b60026001541415611ed6576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b038516611f015760405162461bcd60e51b81526004016106a990614935565b6000611f0c88612c38565b905060008511611f2e5760405162461bcd60e51b81526004016106a990614792565b604051632c3eac2f60e21b81526000906001600160a01b0383169063b0fab0bc90611f679033908a908f908e908c908c90600401614448565b602060405180830381600087803b158015611f8157600080fd5b505af1158015611f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb99190613f6d565b905060008111611fdb5760405162461bcd60e51b81526004016106a9906147d3565b604051630474ec6160e11b81526000906001600160a01b038416906308e9d8c29061200c908e908d90600401614af4565b6040805180830381600087803b15801561202557600080fd5b505af1158015612039573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205d91906137a9565b9050600560009054906101000a90046001600160a01b03166001600160a01b0316633cef94b9348d8d8d8d87898e8e8e6040518b63ffffffff1660e01b8152600401611c5399989796959493929190614d83565b6120b9612ce6565b6001600160a01b03166120ca611e81565b6001600160a01b031614612113576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600061211e83612c38565b60405163ac2cc36b60e01b81529091506001600160a01b0382169063ac2cc36b90610a279085906004016144fc565b60026001541415612193576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001556001600160a01b0381166121be5760405162461bcd60e51b81526004016106a990614935565b60006121c984612c38565b90506000816001600160a01b03166308e9d8c287866040518363ffffffff1660e01b81526004016121fb929190614af4565b6040805180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061224c91906137a9565b600554604051632fa7502b60e21b81529192506001600160a01b03169063be9d40ac903490612287908a908a908a908a908990600401614c2e565b6000604051808303818588803b1580156122a057600080fd5b505af11580156122b4573d6000803e3d6000fd5b505060018055505050505050505050565b6002600154141561230b576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b60026001558661232d5760405162461bcd60e51b81526004016106a990614890565b6001600160a01b0388166123535760405162461bcd60e51b81526004016106a990614935565b61235b61353b565b612363613521565b600061236e8d612c38565b90506000816001600160a01b031663feb56b156040518163ffffffff1660e01b815260040160206040518083038186803b1580156123ab57600080fd5b505afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e39190613f6d565b90506123f381611d718d826132e4565b9a5050806001600160a01b0316631b7319b68f8e338e8e60016040518763ffffffff1660e01b815260040161242d96959493929190614b32565b60c060405180830381600087803b15801561244757600080fd5b505af115801561245b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247f91906137f0565b92506124fd816001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124bd57600080fd5b505afa1580156124d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f59190613739565b33838d6133ad565b806001600160a01b03166308e9d8c28f8e6040518363ffffffff1660e01b815260040161252b929190614af4565b6040805180830381600087803b15801561254457600080fd5b505af1158015612558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257c91906137a9565b915050600560009054906101000a90046001600160a01b03166001600160a01b03166351156e73348f8f8f8f87898f8f8f8f8f6040518d63ffffffff1660e01b81526004016125d59b9a99989796959493929190614c63565b6000604051808303818588803b1580156125ee57600080fd5b505af1158015612602573d6000803e3d6000fd5b50506001805550505050505050505050505050505050565b6005546001600160a01b031633146126445760405162461bcd60e51b81526004016106a990614611565b600061264f83612c38565b60405163b6addec760e01b81529091506001600160a01b0382169063b6addec790610afe90889088908790600401614bd5565b6003546001600160a01b031681565b6004546001600160a01b031681565b6002546001600160a01b031681565b6000600260015414156126f7576040805162461bcd60e51b815260206004820152601f60248201526000805160206150f3833981519152604482015290519081900360640190fd5b6002600155826127195760405162461bcd60e51b81526004016106a990614792565b60006127288561ffff16612c38565b6040516304c35b0d60e11b81529091506001600160a01b03821690630986b61a9061275b90339088908890600401614425565b602060405180830381600087803b15801561277557600080fd5b505af1158015612789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ad9190613f6d565b6001805595945050505050565b6127c2612ce6565b6001600160a01b03166127d3611e81565b6001600160a01b03161461281c576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b600061282783612c38565b6040516312d72b2f60e21b81529091506001600160a01b03821690634b5cacbc90610a27908590600401614411565b61285e612ce6565b6001600160a01b031661286f611e81565b6001600160a01b0316146128b8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b60006128c384612c38565b6040516345ec368560e11b81529091506001600160a01b03821690638bd86d0a906128f49086908690600401614af4565b600060405180830381600087803b15801561290e57600080fd5b505af1158015611957573d6000803e3d6000fd5b6003546001600160a01b0316331461294c5760405162461bcd60e51b81526004016106a990614724565b600061295783612c38565b604051632f8c40a560e21b81529091506001600160a01b0382169063be31029490610a27908590600401614411565b61298e612ce6565b6001600160a01b031661299f611e81565b6001600160a01b0316146129e8576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116612a0e5760405162461bcd60e51b81526004016106a990614822565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6006602090815260009384526040808520845180860184018051928152908401958401959095209452928152908352918190208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015612ae55780601f10612aba57610100808354040283529160200191612ae5565b820191906000526020600020905b815481529060010190602001808311612ac857829003601f168201915b505050505081565b6005546001600160a01b031681565b612b04612ce6565b6001600160a01b0316612b15611e81565b6001600160a01b031614612b5e576040805162461bcd60e51b8152602060048201819052602482015260008051602061515a833981519152604482015290519081900360640190fd5b6001600160a01b038116612ba35760405162461bcd60e51b81526004018080602001828103825260268152602001806151136026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612c0983612c38565b604051637fb6526560e01b81529091506001600160a01b03821690637fb6526590610a279085906004016144fc565b60025460405163068bcd8d60e01b81526000916001600160a01b03169063068bcd8d90612c69908590600401614ebc565b60206040518083038186803b158015612c8157600080fd5b505afa158015612c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb99190613739565b90506001600160a01b038116612ce15760405162461bcd60e51b81526004016106a9906148fe565b919050565b3390565b6000612cf586612c38565b60405163902b8ab760e01b81529091506001600160a01b0382169063902b8ab790612d2a908d908b9089908990600401614b6b565b602060405180830381600087803b158015612d4457600080fd5b505af1925050508015612d74575060408051601f3d908101601f19168201909252612d7191810190613f6d565b60015b612e3c576003878787878787604051602001612d969796959493929190614fc5565b60408051601f1981840301815282825261ffff8d1660009081526006602052919091209091612dc6908c906143f5565b908152602001604051809103902060008a81526020019081526020016000209080519060200190612df8929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60038b8b8b604051612e2f9493929190614f20565b60405180910390a1613146565b82511561110f57846001600160a01b031663ab8236f3878d8d8d876001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e8f57600080fd5b505afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613739565b878a6040518863ffffffff1660e01b8152600401612eea96959493929190614a9b565b600060405180830381600088803b158015612f0457600080fd5b5087f193505050508015612f16575060015b61110f573d808015612f44576040519150601f19603f3d011682016040523d82523d6000602084013e612f49565b606091505b506040518060800160405280846001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015612f8e57600080fd5b505afa158015612fa2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc69190613739565b6001600160a01b03168152602001838152602001876001600160a01b0316815260200185815250600760008e61ffff1661ffff1681526020019081526020016000208c60405161301691906143f5565b908152604080516020928190038301902060008e8152908352819020835181546001600160a01b03199081166001600160a01b039283161783558585015160018401559285015160028301805490941691161790915560608301518051919261308792600385019290910190613495565b509050507f8186389e97ff190cd5e17304ed8188a4a98a6c8add46e6df94462ac7f7e8dd348c8c8c866001600160a01b031663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190613739565b868b8a88604051613138989796959493929190614a21565b60405180910390a15061110f565b50505050505050505050565b600061315d85612c38565b604051632cc36bab60e21b81529091506001600160a01b0382169063b30daeac90613194908c908a90899089908990600401614ba3565b600060405180830381600087803b1580156131ae57600080fd5b505af19250505080156131bf575060015b61328157600286868686866040516020016131df96959493929190614f57565b60408051601f1981840301815282825261ffff8c166000908152600660205291909120909161320f908b906143f5565b908152602001604051809103902060008981526020019081526020016000209080519060200190613241929190613495565b507fa5d2ba6de30cc2f2e91c5a29ba66b148c27826954217e2f67cb8983541da21cf60028a8a8a6040516132789493929190614f20565b60405180910390a15b868860405161329091906143f5565b60405180910390207fc7379a02e530fbd0a46ea1ce6fd91987e96535798231a796bdc0e1a688a508738b89898989896040516132d196959493929190614df7565b60405180910390a3505050505050505050565b600080821161333a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161334357fe5b0490505b92915050565b60008261335c57506000613347565b8282028284828161336957fe5b04146133a65760405162461bcd60e51b81526004018080602001828103825260218152602001806151396021913960400191505060405180910390fd5b9392505050565b600080856001600160a01b03166323b872dd8686866040516024016133d49392919061448c565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161340d91906143f5565b6000604051808303816000865af19150503d806000811461344a576040519150601f19603f3d011682016040523d82523d6000602084013e61344f565b606091505b50915091508180156134795750805115806134795750808060200190518101906134799190613755565b6113f55760405162461bcd60e51b81526004016106a9906146b6565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826134cb5760008555613511565b82601f106134e457805160ff1916838001178555613511565b82800160010185558215613511579182015b828111156135115782518255916020019190600101906134f6565b5061351d929150613571565b5090565b604051806040016040528060008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b8082111561351d5760008155600101613572565b8035612ce1816150bd565b60008083601f8401126135a2578182fd5b5081356001600160401b038111156135b8578182fd5b6020830191508360208285010111156135d057600080fd5b9250929050565b600082601f8301126135e7578081fd5b81356135fa6135f58261506c565b615049565b81815284602083860101111561360e578283fd5b816020850160208301379081016020019190915292915050565b600060c08284031215613639578081fd5b60405160c081018181106001600160401b038211171561365557fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000606082840312156136ab578081fd5b604051606081016001600160401b0382821081831117156136c857fe5b81604052829350843583526020850135602084015260408501359150808211156136f157600080fd5b506136fe858286016135d7565b6040830152505092915050565b803561ffff81168114612ce157600080fd5b60006020828403121561372e578081fd5b81356133a6816150bd565b60006020828403121561374a578081fd5b81516133a6816150bd565b600060208284031215613766578081fd5b81516133a6816150d5565b60008060408385031215613783578081fd5b823561378e816150bd565b9150602083013561379e816150bd565b809150509250929050565b6000604082840312156137ba578081fd5b604051604081018181106001600160401b03821117156137d657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215613801578081fd5b6133a68383613628565b60008060008060608587031215613820578182fd5b6138298561370b565b935060208501356001600160401b03811115613843578283fd5b61384f87828801613591565b9598909750949560400135949350505050565b60008060008060008060a0878903121561387a578384fd5b6138838761370b565b955060208701356001600160401b038082111561389e578586fd5b6138aa8a838b01613591565b909750955060408901359450606089013591506138c6826150bd565b909250608088013590808211156138db578283fd5b506138e889828a0161369a565b9150509295509295509295565b600080600060608486031215613909578081fd5b6139128461370b565b925060208401356001600160401b0381111561392c578182fd5b613938868287016135d7565b925050604084013590509250925092565b600080600080600080600080610100898b031215613965578586fd5b61396e8961370b565b975060208901356001600160401b03811115613988578687fd5b6139948b828c016135d7565b97505060408901359550606089013594506080890135935060a08901356139ba816150bd565b979a969950949793969295929450505060c08201359160e0013590565b6000806000806000806000806000898b036101c08112156139f6578384fd5b6139ff8b61370b565b995060208b01356001600160401b0380821115613a1a578586fd5b613a268e838f016135d7565b9a5060408d0135995060608d0135985060808d0135975060a08d0135965060c08d01359150613a54826150bd565b81955060c060df1984011215613a68578384fd5b604051925060c0830191508282108183111715613a8157fe5b8160405260e08d013583526101008d013560208401526101208d013560408401526101408d013560608401526101608d013560808401526101808d013560a08401528294506101a08d0135925080831115613ada578384fd5b5050613ae88c828d016135d7565b9150509295985092959850929598565b60008060008060008060008060e0898b031215613b13578182fd5b613b1c8961370b565b975060208901356001600160401b0380821115613b37578384fd5b613b438c838d016135d7565b985060408b0135975060608b0135965060808b0135955060a08b0135945060c08b0135915080821115613b74578384fd5b50613b818b828c01613591565b999c989b5096995094979396929594505050565b600080600060608486031215613ba9578081fd5b613bb28461370b565b9250602084013591506040840135613bc9816150bd565b809150509250925092565b60008060008060808587031215613be9578182fd5b613bf28561370b565b935060208501359250604085013591506060850135613c10816150bd565b939692955090935050565b60008060008060008060008060e0898b031215613c36578182fd5b613c3f8961370b565b975060208901359650604089013595506060890135613c5d816150bd565b94506080890135935060a08901356001600160401b0380821115613c7f578384fd5b613c8b8c838d01613591565b909550935060c08b0135915080821115613ca3578283fd5b50613cb08b828c0161369a565b9150509295985092959890939650565b60008060008060008060008060006101008a8c031215613cde578283fd5b613ce78a61370b565b985060208a0135975060408a0135965060608a0135613d05816150bd565b955060808a0135945060a08a0135935060c08a01356001600160401b0380821115613d2e578485fd5b613d3a8d838e01613591565b909550935060e08c0135915080821115613d52578283fd5b50613ae88c828d0161369a565b60008060008060008060008060008060006101208c8e031215613d80578485fd5b613d898c61370b565b9a5060208c0135995060408c01359850613da560608d01613586565b975060808c0135965060a08c013595506001600160401b038060c08e01351115613dcd578586fd5b613ddd8e60c08f01358f0161369a565b95508060e08e01351115613def578283fd5b613dff8e60e08f01358f01613591565b90955093506101008d0135811015613e15578283fd5b50613e278d6101008e01358e01613591565b81935080925050509295989b509295989b9093969950565b60008060008084860360a0811215613e55578283fd5b613e5e8661370b565b9450602086013593506040808701359350605f1982011215613e7e578182fd5b50604051604081018181106001600160401b0382111715613e9b57fe5b604052606086013581526080909501356020860152509194909350909190565b600080600080600080600060a0888a031215613ed5578081fd5b613ede8861370b565b96506020880135613eee816150e3565b955060408801356001600160401b0380821115613f09578283fd5b613f158b838c01613591565b909750955060608a0135915080821115613f2d578283fd5b613f398b838c01613591565b909550935060808a0135915080821115613f51578283fd5b50613f5e8a828b0161369a565b91505092959891949750929550565b600060208284031215613f7e578081fd5b5051919050565b60008060408385031215613f97578182fd5b82359150602083013561379e816150bd565b60008060008060008060c08789031215613fc1578384fd5b863595506020870135613fd3816150bd565b94506040870135613fe3816150e3565b93506060870135613ff3816150e3565b925060808701356001600160401b038082111561400e578384fd5b61401a8a838b016135d7565b935060a089013591508082111561402f578283fd5b506138e889828a016135d7565b6000806040838503121561404e578182fd5b82359150602083013561379e816150d5565b60008060008060008060c08789031215614078578384fd5b86359550602087013561408a816150d5565b9450604087013593506060870135925060808701356140a8816150d5565b915060a08701356140b8816150d5565b809150509295509295509295565b6000806000606084860312156140da578081fd5b833592506140ea6020850161370b565b9150604084013590509250925092565b6000806000806080858703121561410f578182fd5b8435935061411f6020860161370b565b9250604085013591506141346060860161370b565b905092959194509250565b60008060008060808587031215614154578182fd5b843593506141646020860161370b565b93969395505050506040820135916060013590565b6000806040838503121561418b578182fd5b50508035926020909101359150565b600080604083850312156141ac578182fd5b505080516020909101519092909150565b6000806000606084860312156141d1578081fd5b83359250602084013591506040840135613bc9816150bd565b60008060008060008060c08789031215614202578384fd5b865161420d816150e3565b809650506020870151945060408701519350606087015161422d816150bd565b809350506080870151915060a087015190509295509295509295565b6000806000806000806000610180888a031215614264578081fd5b875161426f816150e3565b809750506020880151955060408801519450606088015193506080880151614296816150bd565b92506142a58960a08a01613628565b91506101608801516001600160401b038111156142c0578182fd5b8801601f81018a136142d0578182fd5b80516142de6135f58261506c565b8181528b60208385010111156142f2578384fd5b61430382602083016020860161508d565b80935050505092959891949750929550565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b6000815180845261435781602086016020860161508d565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600081518352602082015160208401526040820151606060408501526143dd606085018261433f565b949350505050565b6000828483379101908152919050565b6000825161440781846020870161508d565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b600060018060a01b038816825286602083015261ffff8616604083015284606083015260a0608083015261448060a083018486614315565b98975050505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03858116825260208201859052831660408201526080606082018190526000906118739083018461433f565b901515815260200190565b941515855260208501939093526040840191909152151560608301521515608082015260a00190565b6000602082526133a6602083018461433f565b60208082526030908201527f53746172676174653a2062726964676520616e6420666163746f727920616c7260408201526f1958591e481a5b9a5d1a585b1a5e995960821b606082015260800190565b6020808252601e908201527f53746172676174653a205f746f6b656e2063616e6e6f74206265203078300000604082015260600190565b60208082526027908201527f53746172676174653a206e6f7420656e6f756768206c7020746f2072656465656040820152666d52656d6f746560c81b606082015260800190565b6020808252601e908201527f4272696467653a2063616c6c6572206d757374206265204272696467652e0000604082015260600190565b6020808252601b908201527f53746172676174653a206f6e6c79206d696e744665654f776e65720000000000604082015260600190565b60208082526019908201527f53746172676174653a206e6f2072657472792072657665727400000000000000604082015260600190565b6020808252601e908201527f53746172676174653a205452414e534645525f46524f4d5f4641494c45440000604082015260600190565b6020808252601d908201527f53746172676174653a20666163746f72792063616e7420626520307830000000604082015260600190565b6020808252601f908201527f53746172676174653a206f6e6c792070726f746f636f6c4665654f776e657200604082015260600190565b6020808252601c908201527f53746172676174653a206272696467652063616e742062652030783000000000604082015260600190565b60208082526021908201527f53746172676174653a206e6f7420656e6f756768206c7020746f2072656465656040820152606d60f81b606082015260800190565b6020808252602f908201527f53746172676174653a206e6f7420656e6f756768206c7020746f20726564656560408201526e1b481dda5d1a08185b5bdd5b9d14d1608a1b606082015260800190565b6020808252601e908201527f53746172676174653a205f6f776e65722063616e6e6f74206265203078300000604082015260600190565b6020808252601f908201527f53746172676174653a20636163686520616c726561647920636c656172656400604082015260600190565b60208082526017908201527f53746172676174653a2063616e6e6f7420737761702030000000000000000000604082015260600190565b6020808252601f908201527f53746172676174653a20696e76616c69642066756e6374696f6e207479706500604082015260600190565b6020808252601d908201527f53746172676174653a20506f6f6c20646f6573206e6f74206578697374000000604082015260600190565b60208082526026908201527f53746172676174653a205f726566756e64416464726573732063616e6e6f742060408201526506265203078360d41b606082015260800190565b61ffff861681526001600160a01b038516602082015260006149a0604083018661436b565b60c060808301526149b460c08301856143b4565b82810360a0840152614480818561433f565b600061ffff8916825260c060208301526149e460c08301888a614315565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614a13818561433f565b9a9950505050505050505050565b600061010061ffff8b168352806020840152614a3f8184018b61433f565b604084018a90526001600160a01b03898116606086015260808501899052871660a085015283810360c08501529050614a78818661433f565b905082810360e0840152614a8c818561433f565b9b9a5050505050505050505050565b600061ffff8816825260c06020830152614ab860c083018861433f565b604083018790526001600160a01b03861660608401526080830185905282810360a0840152614ae7818561433f565b9998505050505050505050565b61ffff929092168252602082015260400190565b61ffff94909416845260208401929092526001600160a01b03166040830152606082015260800190565b61ffff96909616865260208601949094526001600160a01b0392909216604085015260608401526080830152151560a082015260c00190565b61ffff85168152602081018490526001600160a01b03831660408201526101208101614b9a606083018461437a565b95945050505050565b61ffff95909516855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b61ffff8416815260208101839052608081016143dd604083018461436b565b61ffff93841681526020810192909252909116604082015260600190565b61ffff9390931683526020830191909152604082015260600190565b61ffff8616815260208101859052604081018490526001600160a01b038316606082015260c08101611873608083018461436b565b61ffff8c168152602081018b9052604081018a90526001600160a01b038916606082015260006101e0614c99608084018b61436b565b614ca660c084018a61437a565b80610180840152614cb9818401896143b4565b90508281036101a0840152614ccf818789614315565b90508281036101c0840152614ce5818587614315565b9e9d5050505050505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b038716606082015260006101e0614d2d608084018961436b565b614d3a60c084018861437a565b80610180840152614d4d818401876143b4565b90508281036101a0840152614d63818587614315565b8381036101c0909401939093525081526020019998505050505050505050565b61ffff8a16815260208101899052604081018890526001600160a01b03871660608201526000610120614db9608084018961436b565b8660c08401528060e0840152614dd28184018688614315565b9050828103610100840152614de781856143b4565b9c9b505050505050505050505050565b61ffff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600061ffff8916825287602083015286604083015260c06060830152614e5860c083018688614315565b60808301949094525060a0015295945050505050565b600061ffff8916825260ff8816602083015260a06040830152614e9560a083018789614315565b8281036060840152614ea8818688614315565b90508281036080840152614a1381856143b4565b90815260200190565b8681526001600160a01b038616602082015260ff85811660408301528416606082015260c060808201819052600090614f009083018561433f565b82810360a0840152614ae7818561433f565b918252602082015260400190565b600060ff8616825261ffff8516602083015260806040830152614f46608083018561433f565b905082606083015295945050505050565b60ff969096168652602086019490945260408501929092526001600160a01b03166060840152608083015260a082015260c00190565b600060ff8916825287602083015286604083015260ff8616606083015284608083015260c060a0830152614ae760c083018486614315565b60ff881681526020810187905260408101869052606081018590526001600160a01b0384166080820152600061018061500160a084018661437a565b80610160840152614a138184018561433f565b600060ff8916825287602083015286604083015285606083015284608083015260c060a0830152614ae760c083018486614315565b6040518181016001600160401b038111828210171561506457fe5b604052919050565b60006001600160401b0382111561507f57fe5b50601f01601f191660200190565b60005b838110156150a8578181015183820152602001615090565b838111156150b7576000848401525b50505050565b6001600160a01b03811681146150d257600080fd5b50565b80151581146150d257600080fd5b60ff811681146150d257600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220181f743e310103183abe262a9c1c475826edb38bc83616c2ec93acd59de1b2dd64736f6c63430007060033
Deployed Bytecode Sourcemap
361:20037:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12503:1469;;;;;;;;;;-1:-1:-1;12503:1469:14;;;;;:::i;:::-;;:::i;:::-;;8449:392;;;;;;;;;;-1:-1:-1;8449:392:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;18905:152;;;;;;;;;;-1:-1:-1;18905:152:14;;;;;:::i;:::-;;:::i;17742:266::-;;;;;;;;;;-1:-1:-1;17742:266:14;;;;;:::i;:::-;;:::i;1450:91::-;;;;;;;;;;-1:-1:-1;1450:91:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;15309:425::-;;;;;;;;;;-1:-1:-1;15309:425:14;;;;;:::i;:::-;;:::i;18539:181::-;;;;;;;;;;-1:-1:-1;18539:181:14;;;;;:::i;:::-;;:::i;11562:540::-;;;;;;;;;;-1:-1:-1;11562:540:14;;;;;:::i;:::-;;:::i;2550:465::-;;;;;;;;;;-1:-1:-1;2550:465:14;;;;;:::i;:::-;;:::i;19406:358::-;;;;;;;;;;-1:-1:-1;19406:358:14;;;;;:::i;:::-;;:::i;19918:228::-;;;;;;;;;;-1:-1:-1;19918:228:14;;;;;:::i;:::-;;:::i;10085:1471::-;;;;;;:::i;:::-;;:::i;8847:1232::-;;;;;;:::i;:::-;;:::i;1693:145:11:-;;;;;;;;;;;;;:::i;17320:416:14:-;;;;;;;;;;-1:-1:-1;17320:416:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18256:277::-;;;;;;;;;;-1:-1:-1;18256:277:14;;;;;:::i;:::-;;:::i;13978:402::-;;;;;;;;;;-1:-1:-1;13978:402:14;;;;;:::i;:::-;;:::i;5534:1147::-;;;;;;:::i;:::-;;:::i;3968:407::-;;;;;;;;;;-1:-1:-1;3968:407:14;;;;;:::i;:::-;;:::i;1061:85:11:-;;;;;;;;;;;;;:::i;7050:878:14:-;;;;;;:::i;:::-;;:::i;19244:156::-;;;;;;;;;;-1:-1:-1;19244:156:14;;;;;:::i;:::-;;:::i;7934:509::-;;;;;;:::i;:::-;;:::i;4381:1147::-;;;;;;:::i;:::-;;:::i;12108:277::-;;;;;;;;;;-1:-1:-1;12108:277:14;;;;;:::i;:::-;;:::i;1117:31::-;;;;;;;;;;;;;:::i;1215:27::-;;;;;;;;;;;;;:::i;1062:22::-;;;;;;;;;;;;;:::i;6687:357::-;;;;;;;;;;-1:-1:-1;6687:357:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19063:175::-;;;;;;;;;;-1:-1:-1;19063:175:14;;;;;:::i;:::-;;:::i;18014:236::-;;;;;;;;;;-1:-1:-1;18014:236:14;;;;;:::i;:::-;;:::i;20152:244::-;;;;;;;;;;-1:-1:-1;20152:244:14;;;;;:::i;:::-;;:::i;18726:173::-;;;;;;;;;;-1:-1:-1;18726:173:14;;;;;:::i;:::-;;:::i;1331:82::-;;;;;;;;;;-1:-1:-1;1331:82:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1305:20::-;;;;;;;;;;;;;:::i;1987:240:11:-;;;;;;;;;;-1:-1:-1;1987:240:11;;;;;:::i;:::-;;:::i;19770:142:14:-;;;;;;;;;;-1:-1:-1;19770:142:14;;;;;:::i;:::-;;:::i;12503:1469::-;2462:6;;-1:-1:-1;;;;;2462:6:14;2440:10;:29;2432:72;;;;-1:-1:-1;;;2432:72:14;;;;;;;:::i;:::-;;;;;;;;;12770:9:::1;12782:20;12791:10;12782:8;:20::i;:::-;12816:65;::::0;-1:-1:-1;;;12816:65:14;;12770:32;;-1:-1:-1;;;;;;12816:29:14;::::1;::::0;::::1;::::0;:65:::1;::::0;12846:11;;12859:10;;12871:9;;12816:65:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;12816:65:14::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;12816:65:14::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;12812:1154;;613:1;13826:10;13838;13850:1;13853:9;13864:3;;13787:81;;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;13787:81:14;;::::1;::::0;;;;;;13738:25:::1;::::0;::::1;;::::0;;;:12:::1;13787:81;13738:25:::0;;;;;13787:81;;13738:38:::1;::::0;13764:11;;13738:38:::1;:::i;:::-;;;;;;;;;;;;;:46;13777:6;13738:46;;;;;;;;;;;:130;;;;;;;;;;;;:::i;:::-;;13887:68;613:1;13922:11;13935;13948:6;13887:68;;;;;;;;;:::i;:::-;;;;;;;;12812:1154;;;613:1;13072:10;13100;13128:14;13160:12;13190:3;;13000:207;;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;13000:207:14;;::::1;::::0;;;;;;12951:25:::1;::::0;::::1;;::::0;;;:12:::1;13000:207;12951:25:::0;;;;;13000:207;;12951:38:::1;::::0;12977:11;;12951:38:::1;:::i;:::-;;;;;;;;;;;;;:46;12990:6;12951:46;;;;;;;;;;;:256;;;;;;;;;;;;:::i;:::-;;13324:11;13226:110;;;;;;:::i;:::-;;;;;;;;13316:6;13226:110;13244:11;13257:10;13269;13281:3;;13286:14;13302:12;13226:110;;;;;;;;;;;;:::i;:::-;;;;;;;;12882:465;;12812:1154;2514:1;12503:1469:::0;;;;;;;;:::o;8449:392::-;8732:6;;:102;;-1:-1:-1;;;8732:102:14;;8697:7;;;;-1:-1:-1;;;;;8732:6:14;;;;:24;;:102;;8757:11;;8770:13;;8785:10;;;;8797:23;;;;8822:11;;8732:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8725:109;;;;8449:392;;;;;;;;;;:::o;18905:152::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;18988:9:14::1;19000:17;19009:7;19000:8;:17::i;:::-;19027:23;::::0;-1:-1:-1;;;19027:23:14;;18988:29;;-1:-1:-1;;;;;;19027:11:14;::::1;::::0;::::1;::::0;:23:::1;::::0;19039:10;;19027:23:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1343:1:11;18905:152:14::0;;:::o;17742:266::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;17908:9:14::1;17920:17;17929:7;17920:8;:17::i;:::-;17947:54;::::0;-1:-1:-1;;;17947:54:14;;17908:29;;-1:-1:-1;;;;;;17947:20:14;::::1;::::0;::::1;::::0;:54:::1;::::0;17968:11;;17981:10;;17993:7;;17947:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;1450:91:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1450:91:14;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1450:91:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15309:425::-;2462:6;;-1:-1:-1;;;;;2462:6:14;2440:10;:29;2432:72;;;;-1:-1:-1;;;2432:72:14;;;;;;;:::i;:::-;15623:104:::1;15635:11;15648;15661:6;15669:10;15681;15693:14;15709:3;15714:2;15718:8;15623:11;:104::i;18539:181::-:0;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;18621:22:14;::::1;18613:65;;;;-1:-1:-1::0;;;18613:65:14::1;;;;;;;:::i;:::-;18688:16;:25:::0;;-1:-1:-1;;;;;;18688:25:14::1;-1:-1:-1::0;;;;;18688:25:14;;;::::1;::::0;;;::::1;::::0;;18539:181::o;11562:540::-;11723:29;;;11700:20;11723:29;;;:16;:29;;;;;;:42;;;;11753:11;;;;11723:42;:::i;:::-;;;;;;;;;;;;;;;;:50;;;;;;;;;;11700:73;;;;;;;-1:-1:-1;;;;;11700:73:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11700:73:14;;;;;;;;;;;;;;;;;;;;;;;;11723:42;;:50;;11700:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11700:73:14;;;;-1:-1:-1;;;11791:5:14;;;;11700:73;;-1:-1:-1;;;;;;11791:21:14;11783:65;;;;-1:-1:-1;;;11783:65:14;;;;;;;:::i;:::-;11937:45;;;;;;;;-1:-1:-1;11937:45:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11884:29;;;;;:16;:29;;;;;:42;;11937:45;;11884:29;:42;;11914:11;;;;11884:42;:::i;:::-;;;;;;;;;;;;;;;;:50;;;;;;;;;;:98;;;;-1:-1:-1;;;;;;11884:98:14;;;-1:-1:-1;;;;;11884:98:14;;;;;;;;;;-1:-1:-1;11884:98:14;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;:98;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;12010:5:14;;;;;12061:8;;12071:11;;;;12084:10;;;;11992:103;;-1:-1:-1;;;11992:103:14;;-1:-1:-1;;;;;11992:34:14;;;;;;:103;;12027:11;;12040;;;;12053:6;;12061:8;12071:11;12084:10;11992:103;;;:::i;2550:465::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;2658:6:14::1;::::0;-1:-1:-1;;;;;2658:6:14::1;2650:31:::0;:67;::::1;;;-1:-1:-1::0;2693:7:14::1;::::0;-1:-1:-1;;;;;2693:7:14::1;2685:32:::0;2650:67:::1;2642:128;;;;-1:-1:-1::0;;;2642:128:14::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2803:32:14;::::1;2795:73;;;;-1:-1:-1::0;;;2795:73:14::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2886:33:14;::::1;2878:75;;;;-1:-1:-1::0;;;2878:75:14::1;;;;;;;:::i;:::-;2964:6;:16:::0;;-1:-1:-1;;;;;2964:16:14;;::::1;-1:-1:-1::0;;;;;;2964:16:14;;::::1;;::::0;;;2990:7:::1;:18:::0;;;;;::::1;::::0;::::1;;::::0;;2550:465::o;19406:358::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;19630:9:14::1;19642:17;19651:7;19642:8;:17::i;:::-;19669:88;::::0;-1:-1:-1;;;19669:88:14;;19630:29;;-1:-1:-1;;;;;;19669:18:14;::::1;::::0;::::1;::::0;:88:::1;::::0;19688:8;;19698:12;;19712:10;;19724:16;;19742:14;;19669:88:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;1343:1:11;19406:358:14::0;;;;;;:::o;19918:228::-;20000:12;;-1:-1:-1;;;;;20000:12:14;20016:10;20000:26;19992:66;;;;-1:-1:-1;;;19992:66:14;;;;;;;:::i;:::-;20068:9;20080:17;20089:7;20080:8;:17::i;:::-;20107:32;;-1:-1:-1;;;20107:32:14;;20068:29;;-1:-1:-1;;;;;;20107:27:14;;;;;:32;;20135:3;;20107:32;;;:::i;10085:1471::-;10250:25;;;10227:20;10250:25;;;:12;:25;;;;;;:38;;;;10276:11;;;;10250:38;:::i;:::-;;;;;;;;;;;;;;;;:46;;;;;;;;;;10227:69;;;;;;;;;-1:-1:-1;;10227:69:14;;;;;;;;;;;;;;;;;;;;;;;10250:38;;:46;;10227:69;;;10250:46;10227:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10331:1;10314:7;:14;:18;10306:56;;;;-1:-1:-1;;;10306:56:14;;;;;;;:::i;:::-;10393:51;;;;;;;;;-1:-1:-1;10393:51:14;;;:25;;;;;:12;:25;;;;;;:38;;:51;;:25;:38;;10419:11;;;;10393:38;:::i;:::-;;;;;;;;;;;;;:46;10432:6;10393:46;;;;;;;;;;;:51;;;;;;;;;;;;:::i;:::-;-1:-1:-1;10541:2:14;10528:16;;10522:23;10569:48;;;679:1;10569:48;10565:985;;;10636:17;10655;10674:10;10686:16;10704:20;10756:7;10728:119;;;;;;;;;;;;:::i;:::-;10633:214;;;;;;;;;;;10861:104;10882:11;10895;;10861:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10908:6:14;;-1:-1:-1;10916:9:14;;-1:-1:-1;10927:9:14;;-1:-1:-1;10938:2:14;10942:8;10952:12;10861:20;:104::i;:::-;10565:985;;;;;;;;11059:38;;;735:1;11059:38;11055:495;;;11116:17;11135;11154:21;11177:10;11189:21;11212:14;11258:7;11230:131;;;;;;;;;;;;:::i;:::-;11113:248;;;;;;;;;;;;;11375:92;11387:11;11400;;11375:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11413:6:14;;-1:-1:-1;11421:9:14;;-1:-1:-1;11432:9:14;;-1:-1:-1;11443:13:14;11458:2;11462:1;11465;11375:11;:92::i;:::-;11055:495;;;;;;;;;11498:41;;-1:-1:-1;;;11498:41:14;;;;;;;:::i;11055:495::-;10085:1471;;;;;;:::o;8847:1232::-;-1:-1:-1;;;;;9079:30:14;;9071:81;;;;-1:-1:-1;;;9071:81:14;;;;;;;:::i;:::-;9185:25;;;9162:20;9185:25;;;:12;:25;;;;;;:38;;;;9211:11;;;;9185:38;:::i;:::-;;;;;;;;;;;;;;;;:46;;;;;;;;;;9162:69;;;;;;;;;-1:-1:-1;;9162:69:14;;;;;;;;;;;;;;;;;;;;;;;9185:38;;:46;;9162:69;;;9185:46;9162:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9266:1;9249:7;:14;:18;9241:56;;;;-1:-1:-1;;;9241:56:14;;;;;;;:::i;:::-;9415:2;9402:16;;9396:23;9454:42;;;613:1;9454:42;9446:86;;;;-1:-1:-1;;;9446:86:14;;;;;;;:::i;:::-;-1:-1:-1;9573:51:14;;;;;;;;;-1:-1:-1;9573:51:14;;;:25;;;;;:12;:25;;;;;;:38;;:51;;:25;:38;;9599:11;;;;9573:38;:::i;:::-;;;;;;;;;;;;;:46;9612:6;9573:46;;;;;;;;;;;:51;;;;;;;;;;;;:::i;:::-;-1:-1:-1;9744:2:14;9731:16;;9725:23;9793:2;9780:16;;9774:23;9817;;:::i;:::-;9864:9;9876:19;9885:9;9876:8;:19::i;:::-;9913:40;;-1:-1:-1;;;9913:40:14;;9864:31;;-1:-1:-1;;;;;;9913:16:14;;;;;:40;;9930:11;;9943:9;;9913:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9974:6;;:98;;-1:-1:-1;;;9974:98:14;;9909:44;;-1:-1:-1;;;;;;9974:6:14;;-1:-1:-1;9974:26:14;;10008:9;;9974:98;;10019:11;;10032:14;;9909:44;;10051:11;;10064:7;;9974:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8847:1232;;;;;;;;;;:::o;1693:145:11:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;1799:1:::1;1783:6:::0;;1762:40:::1;::::0;-1:-1:-1;;;;;1783:6:11;;::::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1829:1;1812:19:::0;;-1:-1:-1;;;;;;1812:19:11::1;::::0;;1693:145::o;17320:416:14:-;17544:7;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;17571:22:14;::::1;17563:65;;;;-1:-1:-1::0;;;17563:65:14::1;;;;;;;:::i;:::-;17645:7;::::0;:84:::1;::::0;-1:-1:-1;;;17645:84:14;;-1:-1:-1;;;;;17645:7:14;;::::1;::::0;:18:::1;::::0;:84:::1;::::0;17664:7;;17673:6;;17681:15;;17698:14;;17714:5;;17721:7;;17645:84:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17638:91;;1343:1:11;17320:416:14::0;;;;;;;;:::o;18256:277::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;18427:9:14::1;18439:17;18448:7;18439:8;:17::i;:::-;18466:60;::::0;-1:-1:-1;;;18466:60:14;;18427:29;;-1:-1:-1;;;;;;18466:26:14;::::1;::::0;::::1;::::0;:60:::1;::::0;18493:11;;18506:10;;18518:7;;18466:60:::1;;;:::i;13978:402::-:0;2462:6;;-1:-1:-1;;;;;2462:6:14;2440:10;:29;2432:72;;;;-1:-1:-1;;;2432:72:14;;;;;;;:::i;:::-;14264:109:::1;14285:11;14298;14311:6;14319:10;14331;14343:3;14348:9;14359:13;14264:20;:109::i;:::-;13978:402:::0;;;;;;;;:::o;5534:1147::-;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;-1:-1:-1;;;;;5864:30:14;::::1;5856:81;;;;-1:-1:-1::0;;;5856:81:14::1;;;;;;;:::i;:::-;5967:1;5955:9;:13;5947:65;;;;-1:-1:-1::0;;;5947:65:14::1;;;;;;;:::i;:::-;6022:21;;:::i;:::-;6053:23;;:::i;:::-;6100:9;6112:20;6121:10;6112:8;:20::i;:::-;6100:32;;6146:16;6165:4;-1:-1:-1::0;;;;;6165:17:14::1;;6183:9;6165:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6146:47;;6259:4;-1:-1:-1::0;;;;;6259:9:14::1;;6269:11;6282:10;6294;6306:8;6316:12;6330:5;6259:77;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6255:81;;6350:4;-1:-1:-1::0;;;;;6350:17:14::1;;6368:11;6381:10;6393;6405:9;6350:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6433:4;-1:-1:-1::0;;;;;6433:16:14::1;;6450:11;6463:10;6433:41;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6429:45;;2419:1:13;;6564:6:14;;;;;;;;;-1:-1:-1::0;;;;;6564:6:14::1;-1:-1:-1::0;;;;;6564:11:14::1;;6583:9;6594:11;6607:10;6619;6631:14;6647:1;6650;6653:11;6666:3;;6564:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1637:1:13;2563:22;;-1:-1:-1;;;;;;;;;;;;;;5534:1147:14:o;3968:407::-;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;4110:9:14::1;4122:17;4131:7:::0;4122:8:::1;:17::i;:::-;4110:29;;4149:19;4171:4;-1:-1:-1::0;;;;;4171:16:14::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4149:40:::0;-1:-1:-1;4211:43:14::1;4149:40:::0;4211:26:::1;:9:::0;4149:40;4211:13:::1;:26::i;:::-;:30:::0;::::1;:43::i;:::-;4199:55;;4264:69;4282:4;-1:-1:-1::0;;;;;4282:10:14::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4296:10;4316:4;4323:9;4264:17;:69::i;:::-;4343:25;::::0;-1:-1:-1;;;4343:25:14;;-1:-1:-1;;;;;4343:9:14;::::1;::::0;::::1;::::0;:25:::1;::::0;4353:3;;4358:9;;4343:25:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;1637:1:13;2563:22;;-1:-1:-1;;;;3968:407:14:o;1061:85:11:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:11;1061:85;:::o;7050:878:14:-;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;-1:-1:-1;;;;;7349:30:14;::::1;7341:81;;;;-1:-1:-1::0;;;7341:81:14::1;;;;;;;:::i;:::-;7432:9;7444:20;7453:10;7444:8;:20::i;:::-;7432:32;;7494:1;7482:9;:13;7474:59;;;;-1:-1:-1::0;;;7474:59:14::1;;;;;;;:::i;:::-;7562:69;::::0;-1:-1:-1;;;7562:69:14;;7543:16:::1;::::0;-1:-1:-1;;;;;7562:16:14;::::1;::::0;::::1;::::0;:69:::1;::::0;7579:10:::1;::::0;7591:9;;7602:11;;7615:10;;7627:3;;;;7562:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7543:88;;7660:1;7649:8;:12;7641:72;;;;-1:-1:-1::0;;;7641:72:14::1;;;;;;;:::i;:::-;7750:41;::::0;-1:-1:-1;;;7750:41:14;;7724:23:::1;::::0;-1:-1:-1;;;;;7750:16:14;::::1;::::0;::::1;::::0;:41:::1;::::0;7767:11;;7780:10;;7750:41:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7724:67;;7801:6;;;;;;;;;-1:-1:-1::0;;;;;7801:6:14::1;-1:-1:-1::0;;;;;7801:18:14::1;;7827:9;7838:11;7851:10;7863;7875:14;7891:1;7894:8;7904:3;;7909:11;7801:120;;;;;;;;;;;;;;;;;;;;;;;:::i;19244:156::-:0;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;19327:9:14::1;19339:17;19348:7;19339:8;:17::i;:::-;19366:27;::::0;-1:-1:-1;;;19366:27:14;;19327:29;;-1:-1:-1;;;;;;19366:16:14;::::1;::::0;::::1;::::0;:27:::1;::::0;19383:9;;19366:27:::1;;;:::i;7934:509::-:0;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;-1:-1:-1;;;;;8142:30:14;::::1;8134:81;;;;-1:-1:-1::0;;;8134:81:14::1;;;;;;;:::i;:::-;8225:9;8237:20;8246:10;8237:8;:20::i;:::-;8225:32;;8267:23;8293:4;-1:-1:-1::0;;;;;8293:16:14::1;;8310:11;8323:10;8293:41;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8344:6;::::0;:92:::1;::::0;-1:-1:-1;;;8344:92:14;;8267:67;;-1:-1:-1;;;;;;8344:6:14::1;::::0;:18:::1;::::0;8370:9:::1;::::0;8344:92:::1;::::0;8381:11;;8394:10;;8406;;8418:14;;8267:67;;8344:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1637:1:13;2563:22;;-1:-1:-1;;;;;;;;;7934:509:14:o;4381:1147::-;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;4736:13:14;4728:49:::1;;;;-1:-1:-1::0;;;4728:49:14::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;4795:30:14;::::1;4787:81;;;;-1:-1:-1::0;;;4787:81:14::1;;;;;;;:::i;:::-;4878:21;;:::i;:::-;4909:23;;:::i;:::-;4956:9;4968:20;4977:10;4968:8;:20::i;:::-;4956:32;;5020:19;5042:4;-1:-1:-1::0;;;;;5042:16:14::1;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5020:40:::0;-1:-1:-1;5090:43:14::1;5020:40:::0;5090:26:::1;:9:::0;5020:40;5090:13:::1;:26::i;:43::-;5078:55;;2419:1:13;5166:4:14;-1:-1:-1::0;;;;;5166:9:14::1;;5176:11;5189:10;5201;5213:9;5224:12;5238:4;5166:77;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5162:81;;5257:69;5275:4;-1:-1:-1::0;;;;;5275:10:14::1;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5289:10;5309:4;5316:9;5257:17;:69::i;:::-;5344:4;-1:-1:-1::0;;;;;5344:16:14::1;;5361:11;5374:10;5344:41;;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5340:45;;2419:1:13;5405:6:14;;;;;;;;;-1:-1:-1::0;;;;;5405:6:14::1;-1:-1:-1::0;;;;;5405:11:14::1;;5424:9;5435:11;5448:10;5460;5472:14;5488:1;5491;5494:11;5507:3;;5512:8;;5405:116;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;1637:1:13;2563:22;;-1:-1:-1;;;;;;;;;;;;;;;;4381:1147:14:o;12108:277::-;2462:6;;-1:-1:-1;;;;;2462:6:14;2440:10;:29;2432:72;;;;-1:-1:-1;;;2432:72:14;;;;;;;:::i;:::-;12287:9:::1;12299:20;12308:10;12299:8;:20::i;:::-;12329:49;::::0;-1:-1:-1;;;12329:49:14;;12287:32;;-1:-1:-1;;;;;;12329:20:14;::::1;::::0;::::1;::::0;:49:::1;::::0;12350:11;;12363:10;;12375:2;;12329:49:::1;;;:::i;1117:31::-:0;;;-1:-1:-1;;;;;1117:31:14;;:::o;1215:27::-;;;-1:-1:-1;;;;;1215:27:14;;:::o;1062:22::-;;;-1:-1:-1;;;;;1062:22:14;;:::o;6687:357::-;6836:16;1680:1:13;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:13;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2252:63:13;;;;;;;;;;;;;;;1680:1;2390:7;:18;6872:13:14;6864:59:::1;;;;-1:-1:-1::0;;;6864:59:14::1;;;;;;;:::i;:::-;6933:9;6945:20;6954:10;6945:20;;:8;:20::i;:::-;6986:51;::::0;-1:-1:-1;;;6986:51:14;;6933:32;;-1:-1:-1;;;;;;6986:23:14;::::1;::::0;::::1;::::0;:51:::1;::::0;7010:10:::1;::::0;7022:9;;7033:3;;6986:51:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1637:1:13::0;2563:22;;6975:62:14;6687:357;-1:-1:-1;;;;;6687:357:14:o;19063:175::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;19157:9:14::1;19169:17;19178:7;19169:8;:17::i;:::-;19196:35;::::0;-1:-1:-1;;;19196:35:14;;19157:29;;-1:-1:-1;;;;;;19196:18:14;::::1;::::0;::::1;::::0;:35:::1;::::0;19215:15;;19196:35:::1;;;:::i;18014:236::-:0;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;18157:9:14::1;18169:17;18178:7;18169:8;:17::i;:::-;18196:47;::::0;-1:-1:-1;;;18196:47:14;;18157:29;;-1:-1:-1;;;;;;18196:22:14;::::1;::::0;::::1;::::0;:47:::1;::::0;18219:11;;18232:10;;18196:47:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;20152:244:::0;20238:16;;-1:-1:-1;;;;;20238:16:14;20258:10;20238:30;20230:74;;;;-1:-1:-1;;;20230:74:14;;;;;;;:::i;:::-;20314:9;20326:17;20335:7;20326:8;:17::i;:::-;20353:36;;-1:-1:-1;;;20353:36:14;;20314:29;;-1:-1:-1;;;;;;20353:31:14;;;;;:36;;20385:3;;20353:36;;;:::i;18726:173::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;18804:22:14;::::1;18796:65;;;;-1:-1:-1::0;;;18796:65:14::1;;;;;;;:::i;:::-;18871:12;:21:::0;;-1:-1:-1;;;;;;18871:21:14::1;-1:-1:-1::0;;;;;18871:21:14;;;::::1;::::0;;;::::1;::::0;;18726:173::o;1331:82::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1331:82:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1305:20::-;;;-1:-1:-1;;;;;1305:20:14;;:::o;1987:240:11:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;2075:22:11;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:11::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:11;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:11::1;-1:-1:-1::0;;;;;2203:17:11;;;::::1;::::0;;;::::1;::::0;;1987:240::o;19770:142:14:-;19841:9;19853:17;19862:7;19853:8;:17::i;:::-;19880:25;;-1:-1:-1;;;19880:25:14;;19841:29;;-1:-1:-1;;;;;;19880:14:14;;;;;:25;;19895:9;;19880:25;;;:::i;3116:198::-;3202:7;;:24;;-1:-1:-1;;;3202:24:14;;3174:9;;-1:-1:-1;;;;;3202:7:14;;:15;;:24;;3218:7;;3202:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3195:31;-1:-1:-1;;;;;;3244:29:14;;3236:71;;;;-1:-1:-1;;;3236:71:14;;;;;;;:::i;:::-;3116:198;;;:::o;598:104:1:-;685:10;598:104;:::o;15740:1475:14:-;16044:9;16056:20;16065:10;16056:8;:20::i;:::-;16133:49;;-1:-1:-1;;;16133:49:14;;16044:32;;-1:-1:-1;;;;;;16133:15:14;;;;;:49;;16149:11;;16162:10;;16174:3;;16179:2;;16133:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16133:49:14;;;;;;;;-1:-1:-1;;16133:49:14;;;;;;;;;;;;:::i;:::-;;;16129:1080;;735:1;16964:10;16992;17020:14;17052:3;17073:2;17093:8;16896:219;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;16896:219:14;;;;;;;;;16847:25;;;;;;;:12;16896:219;16847:25;;;;;16896:219;;16847:38;;16873:11;;16847:38;:::i;:::-;;;;;;;;;;;;;:46;16886:6;16847:46;;;;;;;;;;;:268;;;;;;;;;;;;:::i;:::-;;17134:64;735:1;17165:11;17178;17191:6;17134:64;;;;;;;;;:::i;:::-;;;;;;;;16129:1080;;;16228:15;;:19;16224:592;;16350:3;-1:-1:-1;;;;;16332:32:14;;16370:14;16386:11;16399;16412:6;16420:4;-1:-1:-1;;;;;16420:10:14;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16434:8;16444;16332:121;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16328:474;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16611:49;;;;;;;;16622:4;-1:-1:-1;;;;;16622:10:14;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16611:49:14;;;;;16636:8;16611:49;;;;16646:3;-1:-1:-1;;;;;16611:49:14;;;;;16651:8;16611:49;;;16558:16;:29;16575:11;16558:29;;;;;;;;;;;;;;;16588:11;16558:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:50;;;;;;;;;;:102;;;;-1:-1:-1;;;;;;16558:102:14;;;-1:-1:-1;;;;;16558:102:14;;;;;;;;;;-1:-1:-1;16558:102:14;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;:102;;;;;;;;;;;:::i;:::-;;;;;16687:96;16703:11;16716;16729:6;16737:4;-1:-1:-1;;;;;16737:10:14;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16751:8;16761:3;16766:8;16776:6;16687:96;;;;;;;;;;;;;:::i;:::-;;;;;;;;16508:294;16328:474;;16129:1080;15740:1475;;;;;;;;;;:::o;14386:917::-;14662:9;14674:20;14683:10;14674:8;:20::i;:::-;14708:80;;-1:-1:-1;;;14708:80:14;;14662:32;;-1:-1:-1;;;;;;14708:24:14;;;;;:80;;14733:11;;14746:10;;14758:3;;14763:9;;14774:13;;14708:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14704:470;;679:1;14939:10;14967;14995:3;15016:9;15043:13;14861:209;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14861:209:14;;;;;;;;;14812:25;;;;;;;:12;14861:209;14812:25;;;;;14861:209;;14812:38;;14838:11;;14812:38;:::i;:::-;;;;;;;;;;;;;:46;14851:6;14812:46;;;;;;;;;;;:258;;;;;;;;;;;;:::i;:::-;;15089:74;679:1;15130:11;15143;15156:6;15089:74;;;;;;;;;:::i;:::-;;;;;;;;14704:470;15234:6;15221:11;15188:108;;;;;;:::i;:::-;;;;;;;;;15208:11;15242:10;15254;15266:3;15271:9;15282:13;15188:108;;;;;;;;;;;:::i;:::-;;;;;;;;14386:917;;;;;;;;;:::o;4209:150:15:-;4267:7;4298:1;4294;:5;4286:44;;;;;-1:-1:-1;;;4286:44:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:1;4347;:5;;;;;;4340:12;;4209:150;;;;;:::o;3530:215::-;3588:7;3611:6;3607:20;;-1:-1:-1;3626:1:15;3619:8;;3607:20;3649:5;;;3653:1;3649;:5;:1;3672:5;;;;;:10;3664:56;;;;-1:-1:-1;;;3664:56:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3737:1;3530:215;-1:-1:-1;;;3530:215:15:o;3418:433:14:-;3636:12;3650:17;3671:5;-1:-1:-1;;;;;3671:10:14;3705;3717:4;3723:2;3727:5;3682:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3682:51:14;;;;;;;;;;;3671:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3635:99;;;;3752:7;:57;;;;-1:-1:-1;3764:11:14;;:16;;:44;;;3795:4;3784:24;;;;;;;;;;;;:::i;:::-;3744:100;;;;-1:-1:-1;;;3744:100:14;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:138:16;84:20;;113:33;84:20;113:33;:::i;157:377::-;;;274:3;267:4;259:6;255:17;251:27;241:2;;299:8;289;282:26;241:2;-1:-1:-1;329:20:16;;-1:-1:-1;;;;;361:30:16;;358:2;;;411:8;401;394:26;358:2;455:4;447:6;443:17;431:29;;507:3;500:4;491:6;483;479:19;475:30;472:39;469:2;;;524:1;521;514:12;469:2;231:303;;;;;:::o;539:485::-;;636:3;629:4;621:6;617:17;613:27;603:2;;658:5;651;644:20;603:2;698:6;685:20;729:49;744:33;774:2;744:33;:::i;:::-;729:49;:::i;:::-;803:2;794:7;787:19;849:3;842:4;837:2;829:6;825:15;821:26;818:35;815:2;;;870:5;863;856:20;815:2;939;932:4;924:6;920:17;913:4;904:7;900:18;887:55;962:16;;;980:4;958:27;951:42;;;;966:7;593:431;-1:-1:-1;;593:431:16:o;1029:711::-;;1145:4;1133:9;1128:3;1124:19;1120:30;1117:2;;;1167:5;1160;1153:20;1117:2;1204;1198:9;1246:4;1238:6;1234:17;1317:6;1305:10;1302:22;-1:-1:-1;;;;;1269:10:16;1266:34;1263:62;1260:2;;;1328:9;1260:2;1359:10;1355:2;1348:22;;1388:6;1379:15;;1424:9;1418:16;1410:6;1403:32;1489:2;1478:9;1474:18;1468:25;1463:2;1455:6;1451:15;1444:50;1548:2;1537:9;1533:18;1527:25;1522:2;1514:6;1510:15;1503:50;1607:2;1596:9;1592:18;1586:25;1581:2;1573:6;1569:15;1562:50;1667:3;1656:9;1652:19;1646:26;1640:3;1632:6;1628:16;1621:52;1728:3;1717:9;1713:19;1707:26;1701:3;1693:6;1689:16;1682:52;;1107:633;;;;:::o;1745:674::-;;1850:4;1838:9;1833:3;1829:19;1825:30;1822:2;;;1872:5;1865;1858:20;1822:2;1909;1903:9;1951:4;1943:6;1939:17;-1:-1:-1;;;;;2043:6:16;2031:10;2028:22;2023:2;2011:10;2008:18;2005:46;2002:2;;;2054:9;2002:2;2085:10;2081:2;2074:22;2114:6;2105:15;;2157:9;2144:23;2136:6;2129:39;2229:2;2218:9;2214:18;2201:32;2196:2;2188:6;2184:15;2177:57;2285:2;2274:9;2270:18;2257:32;2243:46;;2312:2;2304:6;2301:14;2298:2;;;2328:1;2325;2318:12;2298:2;;2365:47;2408:3;2399:6;2388:9;2384:22;2365:47;:::i;:::-;2360:2;2352:6;2348:15;2341:72;;;1812:607;;;;:::o;2424:161::-;2493:20;;2553:6;2542:18;;2532:29;;2522:2;;2575:1;2572;2565:12;2590:259;;2702:2;2690:9;2681:7;2677:23;2673:32;2670:2;;;2723:6;2715;2708:22;2670:2;2767:9;2754:23;2786:33;2813:5;2786:33;:::i;2854:263::-;;2977:2;2965:9;2956:7;2952:23;2948:32;2945:2;;;2998:6;2990;2983:22;2945:2;3035:9;3029:16;3054:33;3081:5;3054:33;:::i;3122:257::-;;3242:2;3230:9;3221:7;3217:23;3213:32;3210:2;;;3263:6;3255;3248:22;3210:2;3300:9;3294:16;3319:30;3343:5;3319:30;:::i;3384:433::-;;;3544:2;3532:9;3523:7;3519:23;3515:32;3512:2;;;3565:6;3557;3550:22;3512:2;3609:9;3596:23;3628:33;3655:5;3628:33;:::i;:::-;3680:5;-1:-1:-1;3737:2:16;3722:18;;3709:32;3750:35;3709:32;3750:35;:::i;:::-;3804:7;3794:17;;;3502:315;;;;;:::o;4103:504::-;;4253:2;4241:9;4232:7;4228:23;4224:32;4221:2;;;4274:6;4266;4259:22;4221:2;4312;4306:9;4354:2;4346:6;4342:15;4423:6;4411:10;4408:22;-1:-1:-1;;;;;4375:10:16;4372:34;4369:62;4366:2;;;4434:9;4366:2;4461;4454:22;4500:16;;4485:32;;4571:2;4556:18;;;4550:25;4533:15;;;4526:50;;;;-1:-1:-1;4492:6:16;4211:396;-1:-1:-1;4211:396:16:o;4612:263::-;;4760:3;4748:9;4739:7;4735:23;4731:33;4728:2;;;4782:6;4774;4767:22;4728:2;4810:59;4861:7;4850:9;4810:59;:::i;4880:573::-;;;;;5044:2;5032:9;5023:7;5019:23;5015:32;5012:2;;;5065:6;5057;5050:22;5012:2;5093:30;5113:9;5093:30;:::i;:::-;5083:40;;5174:2;5163:9;5159:18;5146:32;-1:-1:-1;;;;;5193:6:16;5190:30;5187:2;;;5238:6;5230;5223:22;5187:2;5282:60;5334:7;5325:6;5314:9;5310:22;5282:60;:::i;:::-;5002:451;;5361:8;;-1:-1:-1;5256:86:16;;5443:2;5428:18;5415:32;;5002:451;-1:-1:-1;;;;5002:451:16:o;5458:977::-;;;;;;;5689:3;5677:9;5668:7;5664:23;5660:33;5657:2;;;5711:6;5703;5696:22;5657:2;5739:30;5759:9;5739:30;:::i;:::-;5729:40;;5820:2;5809:9;5805:18;5792:32;-1:-1:-1;;;;;5884:2:16;5876:6;5873:14;5870:2;;;5905:6;5897;5890:22;5870:2;5949:60;6001:7;5992:6;5981:9;5977:22;5949:60;:::i;:::-;6028:8;;-1:-1:-1;5923:86:16;-1:-1:-1;6110:2:16;6095:18;;6082:32;;-1:-1:-1;6164:2:16;6149:18;;6136:32;;-1:-1:-1;6177:33:16;6136:32;6177:33;:::i;:::-;6229:5;;-1:-1:-1;6287:3:16;6272:19;;6259:33;;6304:16;;;6301:2;;;6338:6;6330;6323:22;6301:2;;6366:63;6421:7;6410:8;6399:9;6395:24;6366:63;:::i;:::-;6356:73;;;5647:788;;;;;;;;:::o;6440:484::-;;;;6594:2;6582:9;6573:7;6569:23;6565:32;6562:2;;;6615:6;6607;6600:22;6562:2;6643:30;6663:9;6643:30;:::i;:::-;6633:40;;6724:2;6713:9;6709:18;6696:32;-1:-1:-1;;;;;6743:6:16;6740:30;6737:2;;;6788:6;6780;6773:22;6737:2;6816:51;6859:7;6850:6;6839:9;6835:22;6816:51;:::i;:::-;6806:61;;;6914:2;6903:9;6899:18;6886:32;6876:42;;6552:372;;;;;:::o;6929:898::-;;;;;;;;;7168:3;7156:9;7147:7;7143:23;7139:33;7136:2;;;7190:6;7182;7175:22;7136:2;7218:30;7238:9;7218:30;:::i;:::-;7208:40;;7299:2;7288:9;7284:18;7271:32;-1:-1:-1;;;;;7318:6:16;7315:30;7312:2;;;7363:6;7355;7348:22;7312:2;7391:51;7434:7;7425:6;7414:9;7410:22;7391:51;:::i;:::-;7381:61;;;7489:2;7478:9;7474:18;7461:32;7451:42;;7540:2;7529:9;7525:18;7512:32;7502:42;;7591:3;7580:9;7576:19;7563:33;7553:43;;7646:3;7635:9;7631:19;7618:33;7660;7687:5;7660:33;:::i;:::-;7126:701;;;;-1:-1:-1;7126:701:16;;;;;;7712:5;;-1:-1:-1;;;7764:3:16;7749:19;;7736:33;;7816:3;7801:19;7788:33;;7126:701::o;7832:1788::-;;;;;;;;;;8113:9;8104:7;8100:23;8143:3;8139:2;8135:12;8132:2;;;8165:6;8157;8150:22;8132:2;8193:30;8213:9;8193:30;:::i;:::-;8183:40;;8274:2;8263:9;8259:18;8246:32;-1:-1:-1;;;;;8338:2:16;8330:6;8327:14;8324:2;;;8359:6;8351;8344:22;8324:2;8387:51;8430:7;8421:6;8410:9;8406:22;8387:51;:::i;:::-;8377:61;;8485:2;8474:9;8470:18;8457:32;8447:42;;8536:2;8525:9;8521:18;8508:32;8498:42;;8587:3;8576:9;8572:19;8559:33;8549:43;;8639:3;8628:9;8624:19;8611:33;8601:43;;8694:3;8683:9;8679:19;8666:33;8653:46;;8708:33;8735:5;8708:33;:::i;:::-;8760:5;8750:15;;8800:3;8793;8789:8;8785:2;8781:17;8777:27;8774:2;;;8822:6;8814;8807:22;8774:2;8860;8854:9;8840:23;;8902:3;8894:6;8890:16;8872:34;;8956:6;8944:10;8941:22;8936:2;8924:10;8921:18;8918:46;8915:2;;;8967:9;8915:2;8998:10;8994:2;8987:22;9061:3;9050:9;9046:19;9033:33;9025:6;9018:49;9128:3;9117:9;9113:19;9100:33;9095:2;9087:6;9083:15;9076:58;9195:3;9184:9;9180:19;9167:33;9162:2;9154:6;9150:15;9143:58;9262:3;9251:9;9247:19;9234:33;9229:2;9221:6;9217:15;9210:58;9330:3;9319:9;9315:19;9302:33;9296:3;9288:6;9284:16;9277:59;9398:3;9387:9;9383:19;9370:33;9364:3;9356:6;9352:16;9345:59;9423:6;9413:16;;9482:3;9471:9;9467:19;9454:33;9438:49;;9512:2;9502:8;9499:16;9496:2;;;9533:6;9525;9518:22;9496:2;;;9561:53;9606:7;9595:8;9584:9;9580:24;9561:53;:::i;:::-;9551:63;;;8080:1540;;;;;;;;;;;:::o;9625:1012::-;;;;;;;;;9866:3;9854:9;9845:7;9841:23;9837:33;9834:2;;;9888:6;9880;9873:22;9834:2;9916:30;9936:9;9916:30;:::i;:::-;9906:40;;9997:2;9986:9;9982:18;9969:32;-1:-1:-1;;;;;10061:2:16;10053:6;10050:14;10047:2;;;10082:6;10074;10067:22;10047:2;10110:51;10153:7;10144:6;10133:9;10129:22;10110:51;:::i;:::-;10100:61;;10208:2;10197:9;10193:18;10180:32;10170:42;;10259:2;10248:9;10244:18;10231:32;10221:42;;10310:3;10299:9;10295:19;10282:33;10272:43;;10362:3;10351:9;10347:19;10334:33;10324:43;;10420:3;10409:9;10405:19;10392:33;10376:49;;10450:2;10440:8;10437:16;10434:2;;;10471:6;10463;10456:22;10434:2;;10515:62;10569:7;10558:8;10547:9;10543:24;10515:62;:::i;:::-;9824:813;;;;-1:-1:-1;9824:813:16;;-1:-1:-1;9824:813:16;;;;;;10596:8;-1:-1:-1;;;9824:813:16:o;10642:401::-;;;;10787:2;10775:9;10766:7;10762:23;10758:32;10755:2;;;10808:6;10800;10793:22;10755:2;10836:30;10856:9;10836:30;:::i;:::-;10826:40;;10913:2;10902:9;10898:18;10885:32;10875:42;;10967:2;10956:9;10952:18;10939:32;10980:33;11007:5;10980:33;:::i;:::-;11032:5;11022:15;;;10745:298;;;;;:::o;11048:478::-;;;;;11218:3;11206:9;11197:7;11193:23;11189:33;11186:2;;;11240:6;11232;11225:22;11186:2;11268:30;11288:9;11268:30;:::i;:::-;11258:40;;11345:2;11334:9;11330:18;11317:32;11307:42;;11396:2;11385:9;11381:18;11368:32;11358:42;;11450:2;11439:9;11435:18;11422:32;11463:33;11490:5;11463:33;:::i;:::-;11176:350;;;;-1:-1:-1;11176:350:16;;-1:-1:-1;;11176:350:16:o;11531:1115::-;;;;;;;;;11796:3;11784:9;11775:7;11771:23;11767:33;11764:2;;;11818:6;11810;11803:22;11764:2;11846:30;11866:9;11846:30;:::i;:::-;11836:40;;11923:2;11912:9;11908:18;11895:32;11885:42;;11974:2;11963:9;11959:18;11946:32;11936:42;;12028:2;12017:9;12013:18;12000:32;12041:33;12068:5;12041:33;:::i;:::-;12093:5;-1:-1:-1;12145:3:16;12130:19;;12117:33;;-1:-1:-1;12201:3:16;12186:19;;12173:33;-1:-1:-1;;;;;12255:14:16;;;12252:2;;;12287:6;12279;12272:22;12252:2;12331:60;12383:7;12374:6;12363:9;12359:22;12331:60;:::i;:::-;12410:8;;-1:-1:-1;12305:86:16;-1:-1:-1;12498:3:16;12483:19;;12470:33;;-1:-1:-1;12515:16:16;;;12512:2;;;12549:6;12541;12534:22;12512:2;;12577:63;12632:7;12621:8;12610:9;12606:24;12577:63;:::i;:::-;12567:73;;;11754:892;;;;;;;;;;;:::o;12651:1184::-;;;;;;;;;;12933:3;12921:9;12912:7;12908:23;12904:33;12901:2;;;12955:6;12947;12940:22;12901:2;12983:30;13003:9;12983:30;:::i;:::-;12973:40;;13060:2;13049:9;13045:18;13032:32;13022:42;;13111:2;13100:9;13096:18;13083:32;13073:42;;13165:2;13154:9;13150:18;13137:32;13178:33;13205:5;13178:33;:::i;:::-;13230:5;-1:-1:-1;13282:3:16;13267:19;;13254:33;;-1:-1:-1;13334:3:16;13319:19;;13306:33;;-1:-1:-1;13390:3:16;13375:19;;13362:33;-1:-1:-1;;;;;13444:14:16;;;13441:2;;;13476:6;13468;13461:22;13441:2;13520:60;13572:7;13563:6;13552:9;13548:22;13520:60;:::i;:::-;13599:8;;-1:-1:-1;13494:86:16;-1:-1:-1;13687:3:16;13672:19;;13659:33;;-1:-1:-1;13704:16:16;;;13701:2;;;13738:6;13730;13723:22;13701:2;;13766:63;13821:7;13810:8;13799:9;13795:24;13766:63;:::i;13840:1409::-;;;;;;;;;;;;14159:3;14147:9;14138:7;14134:23;14130:33;14127:2;;;14181:6;14173;14166:22;14127:2;14209:30;14229:9;14209:30;:::i;:::-;14199:40;;14286:2;14275:9;14271:18;14258:32;14248:42;;14337:2;14326:9;14322:18;14309:32;14299:42;;14360:40;14396:2;14385:9;14381:18;14360:40;:::i;:::-;14350:50;;14447:3;14436:9;14432:19;14419:33;14409:43;;14499:3;14488:9;14484:19;14471:33;14461:43;;-1:-1:-1;;;;;14591:2:16;14584:3;14573:9;14569:19;14556:33;14553:41;14550:2;;;14612:6;14604;14597:22;14550:2;14640:88;14720:7;14712:3;14701:9;14697:19;14684:33;14673:9;14669:49;14640:88;:::i;:::-;14630:98;;14778:2;14771:3;14760:9;14756:19;14743:33;14740:41;14737:2;;;14799:6;14791;14784:22;14737:2;14843:87;14922:7;14914:3;14903:9;14899:19;14886:33;14875:9;14871:49;14843:87;:::i;:::-;14949:8;;-1:-1:-1;14976:8:16;-1:-1:-1;15027:3:16;15012:19;;14999:33;14996:41;-1:-1:-1;14993:2:16;;;15055:6;15047;15040:22;14993:2;;15100:87;15179:7;15171:3;15160:9;15156:19;15143:33;15132:9;15128:49;15100:87;:::i;:::-;15206:8;15196:18;;15234:9;15223:20;;;;14117:1132;;;;;;;;;;;;;;:::o;15254:804::-;;;;;15434:9;15425:7;15421:23;15464:3;15460:2;15456:12;15453:2;;;15486:6;15478;15471:22;15453:2;15514:30;15534:9;15514:30;:::i;:::-;15504:40;-1:-1:-1;15591:2:16;15576:18;;15563:32;;-1:-1:-1;15642:2:16;15627:18;;;15614:32;;-1:-1:-1;;;15662:16:16;;15658:25;15655:2;;;15701:6;15693;15686:22;15655:2;;15739;15733:9;15781:2;15773:6;15769:15;15850:6;15838:10;15835:22;-1:-1:-1;;;;;15802:10:16;15799:34;15796:62;15793:2;;;15861:9;15793:2;15888;15881:22;15955:2;15940:18;;15927:32;15912:48;;16021:3;16006:19;;;15993:33;15988:2;15976:15;;15969:58;-1:-1:-1;15401:657:16;;;;-1:-1:-1;15401:657:16;;15919:6;15401:657::o;16063:1196::-;;;;;;;;16303:3;16291:9;16282:7;16278:23;16274:33;16271:2;;;16325:6;16317;16310:22;16271:2;16353:30;16373:9;16353:30;:::i;:::-;16343:40;;16433:2;16422:9;16418:18;16405:32;16446:31;16471:5;16446:31;:::i;:::-;16496:5;-1:-1:-1;16552:2:16;16537:18;;16524:32;-1:-1:-1;;;;;16605:14:16;;;16602:2;;;16637:6;16629;16622:22;16602:2;16681:60;16733:7;16724:6;16713:9;16709:22;16681:60;:::i;:::-;16760:8;;-1:-1:-1;16655:86:16;-1:-1:-1;16848:2:16;16833:18;;16820:32;;-1:-1:-1;16864:16:16;;;16861:2;;;16898:6;16890;16883:22;16861:2;16942:62;16996:7;16985:8;16974:9;16970:24;16942:62;:::i;:::-;17023:8;;-1:-1:-1;16916:88:16;-1:-1:-1;17111:3:16;17096:19;;17083:33;;-1:-1:-1;17128:16:16;;;17125:2;;;17162:6;17154;17147:22;17125:2;;17190:63;17245:7;17234:8;17223:9;17219:24;17190:63;:::i;:::-;17180:73;;;16261:998;;;;;;;;;;:::o;17264:194::-;;17387:2;17375:9;17366:7;17362:23;17358:32;17355:2;;;17408:6;17400;17393:22;17355:2;-1:-1:-1;17436:16:16;;17345:113;-1:-1:-1;17345:113:16:o;17463:327::-;;;17592:2;17580:9;17571:7;17567:23;17563:32;17560:2;;;17613:6;17605;17598:22;17560:2;17654:9;17641:23;17631:33;;17714:2;17703:9;17699:18;17686:32;17727:33;17754:5;17727:33;:::i;17795:1061::-;;;;;;;18008:3;17996:9;17987:7;17983:23;17979:33;17976:2;;;18030:6;18022;18015:22;17976:2;18071:9;18058:23;18048:33;;18131:2;18120:9;18116:18;18103:32;18144:33;18171:5;18144:33;:::i;:::-;18196:5;-1:-1:-1;18253:2:16;18238:18;;18225:32;18266:33;18225:32;18266:33;:::i;:::-;18318:7;-1:-1:-1;18377:2:16;18362:18;;18349:32;18390:33;18349:32;18390:33;:::i;:::-;18442:7;-1:-1:-1;18500:3:16;18485:19;;18472:33;-1:-1:-1;;;;;18554:14:16;;;18551:2;;;18586:6;18578;18571:22;18551:2;18614:51;18657:7;18648:6;18637:9;18633:22;18614:51;:::i;:::-;18604:61;;18718:3;18707:9;18703:19;18690:33;18674:49;;18748:2;18738:8;18735:16;18732:2;;;18769:6;18761;18754:22;18732:2;;18797:53;18842:7;18831:8;18820:9;18816:24;18797:53;:::i;18861:321::-;;;18987:2;18975:9;18966:7;18962:23;18958:32;18955:2;;;19008:6;19000;18993:22;18955:2;19049:9;19036:23;19026:33;;19109:2;19098:9;19094:18;19081:32;19122:30;19146:5;19122:30;:::i;19187:734::-;;;;;;;19375:3;19363:9;19354:7;19350:23;19346:33;19343:2;;;19397:6;19389;19382:22;19343:2;19438:9;19425:23;19415:33;;19498:2;19487:9;19483:18;19470:32;19511:30;19535:5;19511:30;:::i;:::-;19560:5;-1:-1:-1;19612:2:16;19597:18;;19584:32;;-1:-1:-1;19663:2:16;19648:18;;19635:32;;-1:-1:-1;19719:3:16;19704:19;;19691:33;19733:32;19691:33;19733:32;:::i;:::-;19784:7;-1:-1:-1;19843:3:16;19828:19;;19815:33;19857:32;19815:33;19857:32;:::i;:::-;19908:7;19898:17;;;19333:588;;;;;;;;:::o;19926:332::-;;;;20071:2;20059:9;20050:7;20046:23;20042:32;20039:2;;;20092:6;20084;20077:22;20039:2;20133:9;20120:23;20110:33;;20162:39;20197:2;20186:9;20182:18;20162:39;:::i;:::-;20152:49;;20248:2;20237:9;20233:18;20220:32;20210:42;;20029:229;;;;;:::o;20263:407::-;;;;;20424:3;20412:9;20403:7;20399:23;20395:33;20392:2;;;20446:6;20438;20431:22;20392:2;20487:9;20474:23;20464:33;;20516:39;20551:2;20540:9;20536:18;20516:39;:::i;:::-;20506:49;;20602:2;20591:9;20587:18;20574:32;20564:42;;20625:39;20660:2;20649:9;20645:18;20625:39;:::i;:::-;20615:49;;20382:288;;;;;;;:::o;20675:401::-;;;;;20837:3;20825:9;20816:7;20812:23;20808:33;20805:2;;;20859:6;20851;20844:22;20805:2;20900:9;20887:23;20877:33;;20929:39;20964:2;20953:9;20949:18;20929:39;:::i;:::-;20795:281;;20919:49;;-1:-1:-1;;;;21015:2:16;21000:18;;20987:32;;21066:2;21051:18;21038:32;;20795:281::o;21081:258::-;;;21210:2;21198:9;21189:7;21185:23;21181:32;21178:2;;;21231:6;21223;21216:22;21178:2;-1:-1:-1;;21259:23:16;;;21329:2;21314:18;;;21301:32;;-1:-1:-1;21168:171:16:o;21344:255::-;;;21484:2;21472:9;21463:7;21459:23;21455:32;21452:2;;;21505:6;21497;21490:22;21452:2;-1:-1:-1;;21533:16:16;;21589:2;21574:18;;;21568:25;21533:16;;21568:25;;-1:-1:-1;21442:157:16:o;21604:395::-;;;;21750:2;21738:9;21729:7;21725:23;21721:32;21718:2;;;21771:6;21763;21756:22;21718:2;21812:9;21799:23;21789:33;;21869:2;21858:9;21854:18;21841:32;21831:42;;21923:2;21912:9;21908:18;21895:32;21936:33;21963:5;21936:33;:::i;22004:650::-;;;;;;;22218:3;22206:9;22197:7;22193:23;22189:33;22186:2;;;22240:6;22232;22225:22;22186:2;22277:9;22271:16;22296:31;22321:5;22296:31;:::i;:::-;22346:5;22336:15;;;22391:2;22380:9;22376:18;22370:25;22360:35;;22435:2;22424:9;22420:18;22414:25;22404:35;;22484:2;22473:9;22469:18;22463:25;22497:35;22524:7;22497:35;:::i;:::-;22551:7;22541:17;;;22598:3;22587:9;22583:19;22577:26;22567:36;;22643:3;22632:9;22628:19;22622:26;22612:36;;22176:478;;;;;;;;:::o;22659:1261::-;;;;;;;;22924:3;22912:9;22903:7;22899:23;22895:33;22892:2;;;22946:6;22938;22931:22;22892:2;22983:9;22977:16;23002:31;23027:5;23002:31;:::i;:::-;23052:5;23042:15;;;23097:2;23086:9;23082:18;23076:25;23066:35;;23141:2;23130:9;23126:18;23120:25;23110:35;;23185:2;23174:9;23170:18;23164:25;23154:35;;23234:3;23223:9;23219:19;23213:26;23248:35;23275:7;23248:35;:::i;:::-;23302:7;-1:-1:-1;23328:69:16;23389:7;23383:3;23368:19;;23328:69;:::i;:::-;23318:79;;23441:3;23430:9;23426:19;23420:26;-1:-1:-1;;;;;23461:6:16;23458:30;23455:2;;;23506:6;23498;23491:22;23455:2;23534:22;;23587:4;23579:13;;23575:27;-1:-1:-1;23565:2:16;;23621:6;23613;23606:22;23565:2;23655;23649:9;23680:49;23695:33;23725:2;23695:33;:::i;23680:49::-;23752:2;23745:5;23738:17;23792:7;23787:2;23782;23778;23774:11;23770:20;23767:33;23764:2;;;23818:6;23810;23803:22;23764:2;23836:54;23887:2;23882;23875:5;23871:14;23866:2;23862;23858:11;23836:54;:::i;:::-;23909:5;23899:15;;;;;22882:1038;;;;;;;;;;:::o;23925:270::-;;24015:6;24010:3;24003:19;24067:6;24060:5;24053:4;24048:3;24044:14;24031:43;24119:3;24112:4;24103:6;24098:3;24094:16;24090:27;24083:40;24184:4;24177:2;24173:7;24168:2;24160:6;24156:15;24152:29;24147:3;24143:39;24139:50;24132:57;;23993:202;;;;;:::o;24200:259::-;;24281:5;24275:12;24308:6;24303:3;24296:19;24324:63;24380:6;24373:4;24368:3;24364:14;24357:4;24350:5;24346:16;24324:63;:::i;:::-;24441:2;24420:15;-1:-1:-1;;24416:29:16;24407:39;;;;24448:4;24403:50;;24251:208;-1:-1:-1;;24251:208:16:o;24464:153::-;24542:12;;24530:25;;24604:4;24593:16;;;24587:23;24571:14;;24564:47;24520:97::o;24622:375::-;24704:5;24698:12;24693:3;24686:25;24760:4;24753:5;24749:16;24743:23;24736:4;24731:3;24727:14;24720:47;24816:4;24809:5;24805:16;24799:23;24792:4;24787:3;24783:14;24776:47;24872:4;24865:5;24861:16;24855:23;24848:4;24843:3;24839:14;24832:47;24928:4;24921:5;24917:16;24911:23;24904:4;24899:3;24895:14;24888:47;24984:4;24977:5;24973:16;24967:23;24960:4;24955:3;24951:14;24944:47;24676:321;;:::o;25002:311::-;;25091:5;25085:12;25080:3;25073:25;25147:4;25140:5;25136:16;25130:23;25123:4;25118:3;25114:14;25107:47;25200:4;25193:5;25189:16;25183:23;25238:4;25231;25226:3;25222:14;25215:28;25259:48;25301:4;25296:3;25292:14;25278:12;25259:48;:::i;:::-;25252:55;25063:250;-1:-1:-1;;;;25063:250:16:o;25318:273::-;;25501:6;25493;25488:3;25475:33;25527:16;;25552:15;;;25527:16;25465:126;-1:-1:-1;25465:126:16:o;25596:274::-;;25763:6;25757:13;25779:53;25825:6;25820:3;25813:4;25805:6;25801:17;25779:53;:::i;:::-;25848:16;;;;;25733:137;-1:-1:-1;;25733:137:16:o;25875:203::-;-1:-1:-1;;;;;26039:32:16;;;;26021:51;;26009:2;25994:18;;25976:102::o;26083:383::-;-1:-1:-1;;;;;26349:15:16;;;26331:34;;26396:2;26381:18;;26374:34;;;;26444:15;;;26439:2;26424:18;;26417:43;26281:2;26266:18;;26248:218::o;26471:578::-;;26775:1;26771;26766:3;26762:11;26758:19;26750:6;26746:32;26735:9;26728:51;26815:6;26810:2;26799:9;26795:18;26788:34;26870:6;26862;26858:19;26853:2;26842:9;26838:18;26831:47;26914:6;26909:2;26898:9;26894:18;26887:34;26958:3;26952;26941:9;26937:19;26930:32;26979:64;27038:3;27027:9;27023:19;27015:6;27007;26979:64;:::i;:::-;26971:72;26718:331;-1:-1:-1;;;;;;;;26718:331:16:o;27054:375::-;-1:-1:-1;;;;;27312:15:16;;;27294:34;;27364:15;;;;27359:2;27344:18;;27337:43;27411:2;27396:18;;27389:34;;;;27244:2;27229:18;;27211:218::o;27434:274::-;-1:-1:-1;;;;;27626:32:16;;;;27608:51;;27690:2;27675:18;;27668:34;27596:2;27581:18;;27563:145::o;27713:490::-;-1:-1:-1;;;;;27982:15:16;;;27964:34;;28029:2;28014:18;;28007:34;;;28077:15;;28072:2;28057:18;;28050:43;28129:3;28124:2;28109:18;;28102:31;;;27713:490;;28150:47;;28177:19;;28169:6;28150:47;:::i;28208:187::-;28373:14;;28366:22;28348:41;;28336:2;28321:18;;28303:92::o;28400:493::-;28666:14;;28659:22;28641:41;;28713:2;28698:18;;28691:34;;;;28756:2;28741:18;;28734:34;;;;28811:14;28804:22;28799:2;28784:18;;28777:50;28871:14;28864:22;28858:3;28843:19;;28836:51;28628:3;28613:19;;28595:298::o;28898:219::-;;29045:2;29034:9;29027:21;29065:46;29107:2;29096:9;29092:18;29084:6;29065:46;:::i;29569:412::-;29771:2;29753:21;;;29810:2;29790:18;;;29783:30;29849:34;29844:2;29829:18;;29822:62;-1:-1:-1;;;29915:2:16;29900:18;;29893:46;29971:3;29956:19;;29743:238::o;29986:354::-;30188:2;30170:21;;;30227:2;30207:18;;;30200:30;30266:32;30261:2;30246:18;;30239:60;30331:2;30316:18;;30160:180::o;30345:403::-;30547:2;30529:21;;;30586:2;30566:18;;;30559:30;30625:34;30620:2;30605:18;;30598:62;-1:-1:-1;;;30691:2:16;30676:18;;30669:37;30738:3;30723:19;;30519:229::o;30753:354::-;30955:2;30937:21;;;30994:2;30974:18;;;30967:30;31033:32;31028:2;31013:18;;31006:60;31098:2;31083:18;;30927:180::o;31112:351::-;31314:2;31296:21;;;31353:2;31333:18;;;31326:30;31392:29;31387:2;31372:18;;31365:57;31454:2;31439:18;;31286:177::o;31468:349::-;31670:2;31652:21;;;31709:2;31689:18;;;31682:30;31748:27;31743:2;31728:18;;31721:55;31808:2;31793:18;;31642:175::o;31822:354::-;32024:2;32006:21;;;32063:2;32043:18;;;32036:30;32102:32;32097:2;32082:18;;32075:60;32167:2;32152:18;;31996:180::o;32181:353::-;32383:2;32365:21;;;32422:2;32402:18;;;32395:30;32461:31;32456:2;32441:18;;32434:59;32525:2;32510:18;;32355:179::o;32539:355::-;32741:2;32723:21;;;32780:2;32760:18;;;32753:30;32819:33;32814:2;32799:18;;32792:61;32885:2;32870:18;;32713:181::o;32899:352::-;33101:2;33083:21;;;33140:2;33120:18;;;33113:30;33179;33174:2;33159:18;;33152:58;33242:2;33227:18;;33073:178::o;33256:397::-;33458:2;33440:21;;;33497:2;33477:18;;;33470:30;33536:34;33531:2;33516:18;;33509:62;-1:-1:-1;;;33602:2:16;33587:18;;33580:31;33643:3;33628:19;;33430:223::o;33658:411::-;33860:2;33842:21;;;33899:2;33879:18;;;33872:30;33938:34;33933:2;33918:18;;33911:62;-1:-1:-1;;;34004:2:16;33989:18;;33982:45;34059:3;34044:19;;33832:237::o;34074:354::-;34276:2;34258:21;;;34315:2;34295:18;;;34288:30;34354:32;34349:2;34334:18;;34327:60;34419:2;34404:18;;34248:180::o;34433:355::-;34635:2;34617:21;;;34674:2;34654:18;;;34647:30;34713:33;34708:2;34693:18;;34686:61;34779:2;34764:18;;34607:181::o;34793:347::-;34995:2;34977:21;;;35034:2;35014:18;;;35007:30;35073:25;35068:2;35053:18;;35046:53;35131:2;35116:18;;34967:173::o;35145:355::-;35347:2;35329:21;;;35386:2;35366:18;;;35359:30;35425:33;35420:2;35405:18;;35398:61;35491:2;35476:18;;35319:181::o;35505:353::-;35707:2;35689:21;;;35746:2;35726:18;;;35719:30;35785:31;35780:2;35765:18;;35758:59;35849:2;35834:18;;35679:179::o;35863:402::-;36065:2;36047:21;;;36104:2;36084:18;;;36077:30;36143:34;36138:2;36123:18;;36116:62;-1:-1:-1;;;36209:2:16;36194:18;;36187:36;36255:3;36240:19;;36037:228::o;36270:771::-;36659:6;36647:19;;36629:38;;-1:-1:-1;;;;;36703:32:16;;36698:2;36683:18;;36676:60;36270:771;36745:58;36799:2;36784:18;;36776:6;36745:58;:::i;:::-;36840:3;36834;36823:9;36819:19;36812:32;36867:57;36919:3;36908:9;36904:19;36896:6;36867:57;:::i;:::-;36973:9;36965:6;36961:22;36955:3;36944:9;36940:19;36933:51;37001:34;37028:6;37020;37001:34;:::i;37046:733::-;;37371:6;37363;37359:19;37348:9;37341:38;37415:3;37410:2;37399:9;37395:18;37388:31;37442:64;37501:3;37490:9;37486:19;37478:6;37470;37442:64;:::i;:::-;37537:2;37522:18;;37515:34;;;-1:-1:-1;;;;;37585:32:16;;37580:2;37565:18;;37558:60;37649:3;37634:19;;37627:35;;;37699:22;;;37605:3;37678:19;;37671:51;37739:34;37703:6;37758;37739:34;:::i;:::-;37731:42;37331:448;-1:-1:-1;;;;;;;;;;37331:448:16:o;37784:991::-;;38153:3;38195:6;38187;38183:19;38172:9;38165:38;38239:2;38234;38223:9;38219:18;38212:30;38265:46;38307:2;38296:9;38292:18;38284:6;38265:46;:::i;:::-;38342:2;38327:18;;38320:34;;;-1:-1:-1;;;;;38428:15:16;;;38423:2;38408:18;;38401:43;38475:3;38460:19;;38453:35;;;38525:15;;38381:3;38504:19;;38497:44;38578:22;;;38572:3;38557:19;;38550:51;38251:60;-1:-1:-1;38624:34:16;38251:60;38643:6;38624:34;:::i;:::-;38610:48;;38707:9;38699:6;38695:22;38689:3;38678:9;38674:19;38667:51;38735:34;38762:6;38754;38735:34;:::i;:::-;38727:42;38133:642;-1:-1:-1;;;;;;;;;;;38133:642:16:o;38780:706::-;;39095:6;39087;39083:19;39072:9;39065:38;39139:3;39134:2;39123:9;39119:18;39112:31;39166:47;39208:3;39197:9;39193:19;39185:6;39166:47;:::i;:::-;39244:2;39229:18;;39222:34;;;-1:-1:-1;;;;;39292:32:16;;39287:2;39272:18;;39265:60;39356:3;39341:19;;39334:35;;;39406:22;;;39312:3;39385:19;;39378:51;39446:34;39410:6;39465;39446:34;:::i;:::-;39438:42;39055:431;-1:-1:-1;;;;;;;;;39055:431:16:o;39491:259::-;39693:6;39681:19;;;;39663:38;;39732:2;39717:18;;39710:34;39651:2;39636:18;;39618:132::o;39755:436::-;40022:6;40010:19;;;;39992:38;;40061:2;40046:18;;40039:34;;;;-1:-1:-1;;;;;40109:32:16;40104:2;40089:18;;40082:60;40173:2;40158:18;;40151:34;39979:3;39964:19;;39946:245::o;40196:590::-;40513:6;40501:19;;;;40483:38;;40552:2;40537:18;;40530:34;;;;-1:-1:-1;;;;;40600:32:16;;;;40595:2;40580:18;;40573:60;40664:2;40649:18;;40642:34;40707:3;40692:19;;40685:35;40764:14;40757:22;40620:3;40736:19;;40729:51;40470:3;40455:19;;40437:349::o;40791:500::-;41100:6;41088:19;;41070:38;;41139:2;41124:18;;41117:34;;;-1:-1:-1;;;;;41187:32:16;;41182:2;41167:18;;41160:60;41057:3;41042:19;;41229:56;41281:2;41266:18;;41258:6;41229:56;:::i;:::-;41024:267;;;;;;;:::o;41296:500::-;41583:6;41571:19;;;;41553:38;;41622:2;41607:18;;41600:34;;;;-1:-1:-1;;;;;41670:32:16;;;;41665:2;41650:18;;41643:60;41734:2;41719:18;;41712:34;41777:3;41762:19;;41755:35;41540:3;41525:19;;41507:289::o;41801:409::-;42086:6;42074:19;;42056:38;;42125:2;42110:18;;42103:34;;;42043:3;42028:19;;42146:58;42200:2;42185:18;;42177:6;42146:58;:::i;42215:358::-;42423:6;42456:15;;;42438:34;;42503:2;42488:18;;42481:34;;;;42551:15;;;42546:2;42531:18;;42524:43;42401:2;42386:18;;42368:205::o;42578:330::-;42808:6;42796:19;;;;42778:38;;42847:2;42832:18;;42825:34;;;;42890:2;42875:18;;42868:34;42766:2;42751:18;;42733:175::o;42913:594::-;43270:6;43258:19;;43240:38;;43309:2;43294:18;;43287:34;;;43352:2;43337:18;;43330:34;;;-1:-1:-1;;;;;43400:32:16;;43395:2;43380:18;;43373:60;43227:3;43212:19;;43442:59;43496:3;43481:19;;43473:6;43442:59;:::i;43512:1297::-;44124:6;44112:19;;44094:38;;44163:2;44148:18;;44141:34;;;44206:2;44191:18;;44184:34;;;-1:-1:-1;;;;;44254:32:16;;44249:2;44234:18;;44227:60;43512:1297;44082:3;44296:59;44350:3;44335:19;;44327:6;44296:59;:::i;:::-;44364:57;44416:3;44405:9;44401:19;44393:6;44364:57;:::i;:::-;44458:2;44452:3;44441:9;44437:19;44430:31;44484:56;44536:2;44525:9;44521:18;44513:6;44484:56;:::i;:::-;44470:70;;44589:9;44581:6;44577:22;44571:3;44560:9;44556:19;44549:51;44623;44667:6;44659;44651;44623:51;:::i;:::-;44609:65;;44723:9;44715:6;44711:22;44705:3;44694:9;44690:19;44683:51;44751:52;44796:6;44787:7;44779:6;44751:52;:::i;:::-;44743:60;44062:747;-1:-1:-1;;;;;;;;;;;;;;44062:747:16:o;44814:1332::-;45469:6;45457:19;;45439:38;;45508:2;45493:18;;45486:34;;;45551:2;45536:18;;45529:34;;;-1:-1:-1;;;;;45599:32:16;;45594:2;45579:18;;45572:60;44814:1332;45427:3;45641:59;45695:3;45680:19;;45672:6;45641:59;:::i;:::-;45709:57;45761:3;45750:9;45746:19;45738:6;45709:57;:::i;:::-;45803:2;45797:3;45786:9;45782:19;45775:31;45829:56;45881:2;45870:9;45866:18;45858:6;45829:56;:::i;:::-;45815:70;;45934:9;45926:6;45922:22;45916:3;45905:9;45901:19;45894:51;45968;46012:6;46004;45996;45968:51;:::i;:::-;46056:22;;;46050:3;46035:19;;;46028:51;;;;-1:-1:-1;46088:20:16;;46137:2;46125:15;;45407:739;-1:-1:-1;;;;;;;;;45407:739:16:o;46151:1033::-;46656:6;46644:19;;46626:38;;46695:2;46680:18;;46673:34;;;46738:2;46723:18;;46716:34;;;-1:-1:-1;;;;;46786:32:16;;46781:2;46766:18;;46759:60;46151:1033;46614:3;46828:59;46882:3;46867:19;;46859:6;46828:59;:::i;:::-;46924:6;46918:3;46907:9;46903:19;46896:35;46968:2;46962:3;46951:9;46947:19;46940:31;46994:63;47053:2;47042:9;47038:18;47030:6;47022;46994:63;:::i;:::-;46980:77;;47106:9;47098:6;47094:22;47088:3;47077:9;47073:19;47066:51;47134:44;47171:6;47163;47134:44;:::i;:::-;47126:52;46594:590;-1:-1:-1;;;;;;;;;;;;46594:590:16:o;47189:572::-;47504:6;47492:19;;;;47474:38;;47543:2;47528:18;;47521:34;;;;47586:2;47571:18;;47564:34;;;;-1:-1:-1;;;;;47634:32:16;47629:2;47614:18;;47607:60;47698:3;47683:19;;47676:35;47654:3;47727:19;;47720:35;47461:3;47446:19;;47428:333::o;47766:616::-;;48073:6;48065;48061:19;48050:9;48043:38;48117:6;48112:2;48101:9;48097:18;48090:34;48160:6;48155:2;48144:9;48140:18;48133:34;48203:3;48198:2;48187:9;48183:18;48176:31;48224:64;48283:3;48272:9;48268:19;48260:6;48252;48224:64;:::i;:::-;48319:3;48304:19;;48297:35;;;;-1:-1:-1;48363:3:16;48348:19;48341:35;48216:72;48033:349;-1:-1:-1;;;;;48033:349:16:o;48387:802::-;;48740:6;48732;48728:19;48717:9;48710:38;48796:4;48788:6;48784:17;48779:2;48768:9;48764:18;48757:45;48838:3;48833:2;48822:9;48818:18;48811:31;48865:64;48924:3;48913:9;48909:19;48901:6;48893;48865:64;:::i;:::-;48977:9;48969:6;48965:22;48960:2;48949:9;48945:18;48938:50;49011:51;49055:6;49047;49039;49011:51;:::i;:::-;48997:65;;49111:9;49103:6;49099:22;49093:3;49082:9;49078:19;49071:51;49139:44;49176:6;49168;49139:44;:::i;49194:177::-;49340:25;;;49328:2;49313:18;;49295:76::o;49376:713::-;49659:25;;;-1:-1:-1;;;;;49720:32:16;;49715:2;49700:18;;49693:60;49801:4;49789:17;;;49784:2;49769:18;;49762:45;49843:17;;49838:2;49823:18;;49816:45;49898:3;49892;49877:19;;49870:32;;;49376:713;;49925:47;;49952:19;;49944:6;49925:47;:::i;:::-;50021:9;50013:6;50009:22;50003:3;49992:9;49988:19;49981:51;50049:34;50076:6;50068;50049:34;:::i;50094:248::-;50268:25;;;50324:2;50309:18;;50302:34;50256:2;50241:18;;50223:119::o;50347:452::-;;50584:4;50576:6;50572:17;50561:9;50554:36;50638:6;50630;50626:19;50621:2;50610:9;50606:18;50599:47;50682:3;50677:2;50666:9;50662:18;50655:31;50703:47;50745:3;50734:9;50730:19;50722:6;50703:47;:::i;:::-;50695:55;;50786:6;50781:2;50770:9;50766:18;50759:34;50544:255;;;;;;;:::o;50804:568::-;51117:4;51105:17;;;;51087:36;;51154:2;51139:18;;51132:34;;;;51197:2;51182:18;;51175:34;;;;-1:-1:-1;;;;;51245:32:16;51240:2;51225:18;;51218:60;51309:3;51294:19;;51287:35;51265:3;51338:19;;51331:35;51074:3;51059:19;;51041:331::o;51377:629::-;;51688:4;51680:6;51676:17;51665:9;51658:36;51730:6;51725:2;51714:9;51710:18;51703:34;51773:6;51768:2;51757:9;51753:18;51746:34;51828:4;51820:6;51816:17;51811:2;51800:9;51796:18;51789:45;51871:6;51865:3;51854:9;51850:19;51843:35;51915:3;51909;51898:9;51894:19;51887:32;51936:64;51995:3;51984:9;51980:19;51972:6;51964;51936:64;:::i;52011:775::-;52406:4;52394:17;;52376:36;;52443:2;52428:18;;52421:34;;;52486:2;52471:18;;52464:34;;;52529:2;52514:18;;52507:34;;;-1:-1:-1;;;;;52578:32:16;;52572:3;52557:19;;52550:61;52011:775;52364:3;52620:57;52598:3;52657:19;;52649:6;52620:57;:::i;:::-;52714:2;52708:3;52697:9;52693:19;52686:31;52734:46;52776:2;52765:9;52761:18;52753:6;52734:46;:::i;52791:612::-;;53096:4;53088:6;53084:17;53073:9;53066:36;53138:6;53133:2;53122:9;53118:18;53111:34;53181:6;53176:2;53165:9;53161:18;53154:34;53224:6;53219:2;53208:9;53204:18;53197:34;53268:6;53262:3;53251:9;53247:19;53240:35;53312:3;53306;53295:9;53291:19;53284:32;53333:64;53392:3;53381:9;53377:19;53369:6;53361;53333:64;:::i;53408:242::-;53478:2;53472:9;53508:17;;;-1:-1:-1;;;;;53540:34:16;;53576:22;;;53537:62;53534:2;;;53602:9;53534:2;53629;53622:22;53452:198;;-1:-1:-1;53452:198:16:o;53655:181::-;;-1:-1:-1;;;;;53730:6:16;53727:30;53724:2;;;53760:9;53724:2;-1:-1:-1;53819:2:16;53796:17;-1:-1:-1;;53792:31:16;53825:4;53788:42;;53714:122::o;53841:258::-;53913:1;53923:113;53937:6;53934:1;53931:13;53923:113;;;54013:11;;;54007:18;53994:11;;;53987:39;53959:2;53952:10;53923:113;;;54054:6;54051:1;54048:13;54045:2;;;54089:1;54080:6;54075:3;54071:16;54064:27;54045:2;;53894:205;;;:::o;54104:133::-;-1:-1:-1;;;;;54181:31:16;;54171:42;;54161:2;;54227:1;54224;54217:12;54161:2;54151:86;:::o;54242:120::-;54330:5;54323:13;54316:21;54309:5;54306:32;54296:2;;54352:1;54349;54342:12;54367:116;54453:4;54446:5;54442:16;54435:5;54432:27;54422:2;;54473:1;54470;54463:12
Swarm Source
ipfs://181f743e310103183abe262a9c1c475826edb38bc83616c2ec93acd59de1b2dd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
AVAX | Avalanche (AVAX) | 24.52% | $35.4 | 2.93 | $103.73 |
AVAX | 10.87% | $1 | 46 | $46 | |
ZKSYNC | 27.44% | $3,218.09 | 0.0361 | $116.08 | |
BLAST | 24.73% | $3,219.15 | 0.0325 | $104.61 | |
BASE | 6.97% | $3,219.38 | 0.0091575 | $29.48 | |
BSC | 3.20% | $35.5 | 0.3813 | $13.53 | |
BSC | 0.47% | $0.999388 | 2 | $2 | |
POL | 1.76% | $3,226.5 | 0.00230116 | $7.42 | |
GLMR | 0.04% | $0.179894 | 0.9 | $0.161905 |
[ 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.