1 tx
2 calls
constructor
constructor()
functions
controller
viewfunction controller() view returns (address)
correctPriceDirection
purefunction correctPriceDirection(address base, address quote, uint160 sqrtPriceX96) pure returns (uint160 sqrtPriceX96Corrected)
factory
viewfunction factory() view returns (address)
funder
viewfunction funder() view returns (address)
getController
viewfunction getController() view returns (address _controller)
getFunder
viewfunction getFunder() view returns (address _funder)
getSqrtPriceX96FromPrice
purefunction getSqrtPriceX96FromPrice(int8 decimalDiff, uint80 price_12Decimals) pure returns (uint160 sqrtPriceX96)
getTotalValueEth12
viewfunction getTotalValueEth12() view returns (uint128 valueEth12)
getTotalValueUsd12
viewfunction getTotalValueUsd12() view returns (uint128 valueUsd12)
getUsd12ValueIn
viewfunction getUsd12ValueIn(address token) view returns (uint128 valueUsd12)
indexFromPositionId
viewfunction indexFromPositionId(uint256) view returns (uint8)
indexFromTokenAddress
viewfunction indexFromTokenAddress(address) view returns (uint8)
liquidityPositions
viewfunction liquidityPositions(uint256) view returns (uint256)
nLiquidityPositions
viewfunction nLiquidityPositions() view returns (uint8)
nTokensHeld
viewfunction nTokensHeld() view returns (uint8)
numLiquidityPositionsByToken
viewfunction numLiquidityPositionsByToken(address) view returns (uint16)
owner
viewfunction owner() view returns (address)
sqrt
purefunction sqrt(uint256 x) pure returns (uint128)
swapRouter
viewfunction swapRouter() view returns (address)
tokensHeld
viewfunction tokensHeld(uint256) view returns (address)
utils
viewfunction utils() view returns (address)
v4PoolManager
viewfunction v4PoolManager() view returns (address)
v4PositionIdToBase
viewfunction v4PositionIdToBase(uint256) view returns (address)
v4PositionIdToQuote
viewfunction v4PositionIdToQuote(uint256) view returns (address)
v4PositionManager
viewfunction v4PositionManager() view returns (address)
validEmergencyTokens
viewfunction validEmergencyTokens(address) view returns (bool)
addEmergencyTokens
nonpayablefunction addEmergencyTokens(address[] tokens)
collectFees
nonpayablefunction collectFees(uint256 positionId)
createPosition
nonpayablefunction createPosition(tuple key, address quote, uint80 lowPrice12, uint80 highPrice12, uint256 toAdd) returns (uint256 positionId)
depositEth
payablefunction depositEth() payable
depositToken
nonpayablefunction depositToken(address token, uint256 amount)
destroyPosition
nonpayablefunction destroyPosition(uint256 positionId)
emergencyCircuitBreaker
nonpayablefunction emergencyCircuitBreaker(address storeOfValueToken)
lockEmergencyTokens
nonpayablefunction lockEmergencyTokens()
modifyLiquidity
nonpayablefunction modifyLiquidity(uint256 positionId, uint256 newBaseBal, uint256 newQuoteBal)
obtainTokens
nonpayablefunction obtainTokens(address token0, address token1, uint256 amount0, uint256 amount1)
renounceOwnership
nonpayablefunction renounceOwnership()
rescueTokens
nonpayablefunction rescueTokens(address token)
setController
nonpayablefunction setController(address newController)
setFunder
nonpayablefunction setFunder(address newFunder)
setUtils
nonpayablefunction setUtils(address utilsAdr)
swapTokensInto
nonpayablefunction swapTokensInto(address tokenFrom, address tokenTo, uint256 maxIn, uint256 maxOut) returns (uint256 tokensIn, uint256 tokensOut)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdrawEth
nonpayablefunction withdrawEth(address destination, uint256 amount)
withdrawToken
nonpayablefunction withdrawToken(address token, address destination, uint256 amount)
events
ControllerSet
event ControllerSet(address newController, address oldController)
Deposited
event Deposited(address token, uint256 amount)
EmergencyCircuitBreakerFlipped
event EmergencyCircuitBreakerFlipped(address storeOfValueToken)
FunderSet
event FunderSet(address newController, address oldController)
LiquidityFeesCollected
event LiquidityFeesCollected(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
LiquidityModified
event LiquidityModified(uint256 poolPosition, address base, address quote, int128 liquidityChange)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
PositionBurned
event PositionBurned(uint256 poolPosition, address base, address quote, uint256 baseTaken, uint256 quoteTaken)
PositionMinted
event PositionMinted(uint256 poolPosition, address base, address quote, uint80 minPrice, uint80 maxPrice, uint256 toAdd)
TokensSwapped
event TokensSwapped(address from, address to, uint256 fromAmt, uint256 toAmt)
Withdrawn
event Withdrawn(address token, uint256 amount)
errors
No errors.
creation bytecode
0x60e060405273a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4860805273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc260a0527388e6a0c2ddd26feeb64f039a2c41296fcb3f564060c052600e805460ff199081169091556018805482169055601c80549091169055348015610075575f80fd5b5061007f33610202565b6080516001600160a01b039081165f908152600160208190526040808320805460ff19908116841790915560a05190941680845281842080548616841790559280527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909416909117909255905163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f19602482015263095ea7b3906044016020604051808303815f875af115801561013f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101639190610377565b5060805160405163095ea7b360e01b815273e592427a0aece92de3edee1f18e0157c0586156460048201525f1960248201526001600160a01b039091169063095ea7b3906044016020604051808303815f875af11580156101c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ea9190610377565b506101f433610251565b6101fd336102b8565b61039d565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610259610318565b600280546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a91015b60405180910390a15050565b6102c0610318565b600380546001600160a01b038381166001600160a01b03198316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691016102ac565b5f546001600160a01b031633146103755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b565b5f60208284031215610387575f80fd5b81518015158114610396575f80fd5b9392505050565b60805160a05160c0516159b56104735f395f50505f8181610fd10152818161153601528181611b6501528181611c2301528181611eff01528181611f32015281816122cf01528181612edf01528181612f27015281816135010152818161359e015281816135ed0152818161378c01528181613c560152613ccb01525f8181610f9f0152818161160201528181611b430152818161226f01528181612374015281816126240152818161265701528181612f8d0152818161317b0152818161396a01528181613b530152613bc801526159b55ff3fe6080604052600436106102c4575f3560e01c80638172047911610176578063bc329198116100d4578063df2a558b11610083578063f2fde38b11610060578063f2fde38b146108a5578063f60b36e3146108c4578063f77c4791146108e357005b8063df2a558b1461081c578063e2f4dd431461084a578063ed4ab0f81461087157005b8063c31c9c07116100b1578063c31c9c07146107af578063c45a0155146107d6578063c4b19b54146107fd57005b8063bc32919814610732578063bf0e622b1461074b578063c0c8eca61461078d57005b80639ba6924911610130578063b17acdcd1161010d578063b17acdcd146106d5578063b1df47d8146106f4578063b3a579431461071357005b80639ba6924914610656578063a9e88b8f1461066a578063ac75886f146106a857005b80638da5cb5b1161015e5780638da5cb5b146105fc57806392eefe9b146106185780639a7fe3a11461063757005b806381720479146105ab5780638abb9845146105df57005b806339040ed1116102235780634a2539c3116101dd578063677342ce116101ba578063677342ce146105595780636995350114610578578063715018a61461059757005b80634a2539c3146104e65780635a29638d1461050557806363011d1a1461052457005b8063439370b11161020b578063439370b1146104a0578063483e0cd7146104a8578063495915d3146104c757005b806339040ed11461044757806342d9843e1461047257005b806319cc33571161027f5780633018205f1161025c5780633018205f146103ec57806332c4171d14610409578063338b5dea1461042857005b806319cc33571461039a5780631b9a91a4146103ae5780631fba9eda146103cd57005b806302c512ca116102ad57806302c512ca1461030b578063041ae8801461035c5780630acc8cd11461037b57005b8062ae3bf8146102cd57806301e33667146102ec57005b366102cb57005b005b3480156102d8575f80fd5b506102cb6102e7366004614f5d565b610902565b3480156102f7575f80fd5b506102cb610306366004614f78565b610a80565b348015610316575f80fd5b5061033f610325366004614fb6565b601a6020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610367575f80fd5b5060035461033f906001600160a01b031681565b348015610386575f80fd5b506102cb610395366004614f5d565b610c33565b3480156103a5575f80fd5b506102cb610cb3565b3480156103b9575f80fd5b506102cb6103c8366004614fcd565b610ce8565b3480156103d8575f80fd5b5061033f6103e736600461500e565b610dc6565b3480156103f7575f80fd5b506002546001600160a01b031661033f565b348015610414575f80fd5b506102cb610423366004615049565b610e28565b348015610433575f80fd5b506102cb610442366004614fcd565b61108c565b348015610452575f80fd5b50600e546104609060ff1681565b60405160ff9091168152602001610353565b34801561047d575f80fd5b5061046061048c366004614fb6565b60196020525f908152604090205460ff1681565b6102cb61123b565b3480156104b3575f80fd5b506102cb6104c236600461508c565b611275565b3480156104d2575f80fd5b506102cb6104e13660046150b5565b6113fb565b3480156104f1575f80fd5b506102cb610500366004614fb6565b611696565b348015610510575f80fd5b5060045461033f906001600160a01b031681565b34801561052f575f80fd5b50610538611b00565b6040516fffffffffffffffffffffffffffffffff9091168152602001610353565b348015610564575f80fd5b50610538610573366004614fb6565b611f71565b348015610583575f80fd5b506102cb610592366004614f5d565b6120f2565b3480156105a2575f80fd5b506102cb612134565b3480156105b6575f80fd5b506105ca6105c5366004615049565b612147565b60408051928352602083019190915201610353565b3480156105ea575f80fd5b506003546001600160a01b031661033f565b348015610607575f80fd5b505f546001600160a01b031661033f565b348015610623575f80fd5b506102cb610632366004614f5d565b6121e5565b348015610642575f80fd5b50610538610651366004614f5d565b61225c565b348015610661575f80fd5b5061053861229b565b348015610675575f80fd5b50610698610684366004614f5d565b60016020525f908152604090205460ff1681565b6040519015158152602001610353565b3480156106b3575f80fd5b506106c76106c2366004614fb6565b612692565b604051908152602001610353565b3480156106e0575f80fd5b506102cb6106ef366004614fb6565b6126a8565b3480156106ff575f80fd5b506106c761070e366004615126565b6126b5565b34801561071e575f80fd5b5061033f61072d36600461518d565b612bb3565b34801561073d575f80fd5b506018546104609060ff1681565b348015610756575f80fd5b5061077a610765366004614f5d565b60056020525f908152604090205461ffff1681565b60405161ffff9091168152602001610353565b348015610798575f80fd5b5061033f6e04444c5dc75cb358380d2e3de08a9081565b3480156107ba575f80fd5b5061033f73e592427a0aece92de3edee1f18e0157c0586156481565b3480156107e1575f80fd5b5061033f731f98431c8ad98523631ae4a59f267346ea31f98481565b348015610808575f80fd5b5061033f610817366004614fb6565b612c09565b348015610827575f80fd5b50610460610836366004614f5d565b600f6020525f908152604090205460ff1681565b348015610855575f80fd5b5061033f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e81565b34801561087c575f80fd5b5061033f61088b366004614fb6565b601b6020525f90815260409020546001600160a01b031681565b3480156108b0575f80fd5b506102cb6108bf366004614f5d565b612c28565b3480156108cf575f80fd5b506102cb6108de366004614f5d565b612ccf565b3480156108ee575f80fd5b5060025461033f906001600160a01b031681565b61090a61306b565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811015806109635750816001600160a01b031660068260ff1660088110610955576109556151d5565b01546001600160a01b031614155b6109ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f43616e6e6f74202772657363756527206465706f73697473000000000000000060448201526064015b60405180910390fd5b816001600160a01b031663a9059cbb6109ee5f546001600160a01b031690565b6109f7856130de565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190615202565b505050565b6003546001600160a01b03163314610af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7d9190615202565b610be3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109c5565b610bec83613179565b604080516001600160a01b0385168152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a1505050565b610c3b61306b565b600380546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917f9fb5233a5c1113ee4f5aafa72ecf995c4c5bc0c057ecbcad707ea04ebc829c6691015b60405180910390a15050565b610cbb61306b565b601c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6003546001600160a01b03163314610d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040516001600160a01b0383169082156108fc029083905f818181858888f19350505050158015610d8f573d5f803e3d5ffd5b50604080515f8152602081018390527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59101610ca7565b5f80610e018369ffffffffffffffffffff16780100000000000000000000000000000000000000000000000086600c0160ff16600a0a61336f565b9050610e0c81611f71565b6fffffffffffffffffffffffffffffffff169150505b92915050565b6002546001600160a01b0316331480610e4057503330145b610ea6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f610eb0856130de565b90505f610ebc856130de565b9050838210158015610ece5750828110155b15610eda575050611086565b5f805f848710610eec57848703610eee565b5f5b9150838610610eff57838603610f01565b5f5b90508685108015610f1157508584115b15610f525785840392505f610f36898b86620f4240620f7cd888025b04613a98613438565b915050808310610f4857808303610f4a565b5f5b925050610f98565b8584108015610f6057508685115b15610f985786850392505f610f808a8a86620f4240620f7cd88702610f2d565b915050808210610f9257808203610f94565b5f5b9250505b610fc589897f00000000000000000000000000000000000000000000000000000000000000008585613858565b9092509050610ff789897f00000000000000000000000000000000000000000000000000000000000000008585613858565b909250905061100989895f8585613858565b90925090508115801561101a575080155b611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f556e64657266756e64656400000000000000000000000000000000000000000060448201526064016109c5565b50505050505b50505050565b6003546001600160a01b03163314611100576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526001600160a01b038316906323b872dd906064016020604051808303815f875af1158015611169573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061118d9190615202565b6111f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016109c5565b6111fc82613955565b604080516001600160a01b0384168152602081018390527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c49101610ca7565b604080515f81523460208201527f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4910160405180910390a1565b6002546001600160a01b031633146112e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f838152601a6020908152604080832054601b9092528220546001600160a01b039182169291169061131a836130de565b90505f611326836130de565b600480546040517f080085220000000000000000000000000000000000000000000000000000000081529182018a90526001600160a01b0387811660248401528681166044840152606483018690526084830184905260a483018a905260c483018990529293505f92169063080085229060e401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d9919061524e565b90506113e58882613e13565b6113f185858989610e28565b5050505050505050565b61140361306b565b601c5460ff1615611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f6c6f636b6564000000000000000000000000000000000000000000000000000060448201526064016109c5565b5f61147961229b565b600802666a94d74f4300000190505f5b60ff8116831115611086575f84848360ff168181106114aa576114aa6151d5565b90506020020160208101906114bf9190614f5d565b6001600160a01b038181165f8181526001602081905260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556004805491517f7afd0a86000000000000000000000000000000000000000000000000000000008152908101929092527f0000000000000000000000000000000000000000000000000000000000000000831660248301526fffffffffffffffffffffffffffffffff87166044830152929350911690637afd0a86906064016020604051808303815f875af115801561159f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c3919061526e565b50600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03848116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff86166044820152911690637afd0a86906064016020604051808303815f875af1158015611668573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061168c919061526e565b5050600101611489565b6002546001600160a01b0316331461170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b5f818152601a6020908152604080832054601b9092528220546001600160a01b039182169291169061173b836130de565b90505f611747836130de565b90505f60036011604051602001611768929190918252602082015260400190565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b60608152602001906001900390816117a95790505060408051602081018a90525f9181018290526060810182905260808082015260a081019190915290915060c001604051602081830303815290604052815f8151811061180c5761180c6151d5565b602090810291909101810191909152604080516001600160a01b03808a16938201939093529187169082015230606082015260800160405160208183030381529060405281600181518110611863576118636151d5565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f83836040516020016118a49291906152d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526118dd42603c615395565b6040518363ffffffff1660e01b81526004016118fa9291906153a8565b5f604051808303815f87803b158015611911575f80fd5b505af1158015611923573d5f803e3d5ffd5b505050505f84611932886130de565b61193c91906153c9565b90505f84611949886130de565b61195391906153c9565b6001600160a01b0389165f908152600560205260408120805492935061ffff9092169190611980836153dc565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b0389165f908152600560205260408120805490921692506119c2836153dc565b825461ffff9182166101009390930a9283029190920219909116179055506018805460ff16905f6119f283615417565b82546101009290920a60ff81810219909316918316021790915560185416159050611a9e575f8981526019602052604090205460185460ff918216916010911660088110611a4257611a426151d5565b015460108260ff1660088110611a5a57611a5a6151d5565b01558060195f601060ff841660088110611a7657611a766151d5565b015481526020019081526020015f205f6101000a81548160ff021916908360ff160217905550505b604080518a81526001600160a01b038a81166020830152891681830152606081018490526080810183905290517f5501b833962ceaf131361ff8d59683c382ab00f523035d0fc4c2ffc19bef3a459181900360a00190a1505050505050505050565b5f611b0e620f424047615429565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909150611bde907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b038316906370a08231906024015b602060405180830381865afa158015611bb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bd99190615461565b6140c8565b611be89082615478565b90505f5b600e5460ff9081169082161015611cac57611ca060068260ff1660088110611c1657611c166151d5565b01546001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000600660ff851660088110611c5857611c586151d5565b01546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03909116906370a0823190602401611b9a565b90910190600101611bec565b505f5b60185460ff9081169082161015611f6d575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110611cf157611cf16151d5565b01546040518263ffffffff1660e01b8152600401611d1191815260200190565b602060405180830381865afa158015611d2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5091906154a0565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff871660088110611d8457611d846151d5565b01546040518263ffffffff1660e01b8152600401611da491815260200190565b60c060405180830381865afa158015611dbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611de3919061553b565b915091505f611e0c611df68460a0902090565b6e04444c5dc75cb358380d2e3de08a909061422d565b50506004549192505f918291506001600160a01b031663c72e160b84611e3d611e388860081c60020b90565b6142f8565b611e4d611e388960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa158015611ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ef291906155cc565b91509150611f24855f01517f0000000000000000000000000000000000000000000000000000000000000000846140c8565b88019750611f5785602001517f0000000000000000000000000000000000000000000000000000000000000000836140c8565b90970196505060019094019350611caf92505050565b5090565b5f815f03611f8057505f919050565b8160017001000000000000000000000000000000008210611fa65760809190911c9060401b5b680100000000000000008210611fc15760409190911c9060201b5b6401000000008210611fd85760209190911c9060101b5b620100008210611fed5760109190911c9060081b5b61010082106120015760089190911c9060041b5b601082106120145760049190911c9060021b5b600882106120205760011b5b600181858161203157612031615221565b048201901c9050600181858161204957612049615221565b048201901c9050600181858161206157612061615221565b048201901c9050600181858161207957612079615221565b048201901c9050600181858161209157612091615221565b048201901c905060018185816120a9576120a9615221565b048201901c905060018185816120c1576120c1615221565b0491909101901c5f6120d38286615429565b90508082106120e257806120e4565b815b95945050505050565b919050565b6120fa61306b565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b61213c61306b565b6121455f6145f5565b565b6002545f9081906001600160a01b031633148061216357503330145b6121c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b6121d886868686613a98613438565b9150915094509492505050565b6121ed61306b565b600280546001600160a01b038381167fffffffffffffffffffffffff00000000000000000000000000000000000000008316811790935560408051938452911660208301819052917e7582b62407f53d49cfc72e7ddab574c06ef3b8aced104b54b7bed4681ee54a9101610ca7565b5f80612267836130de565b9050612294837f0000000000000000000000000000000000000000000000000000000000000000836140c8565b9392505050565b600480546040517fea4bc51c0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116938201939093525f92670de0b6b3a764000092169063ea4bc51c90602401602060405180830381865afa158015612329573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234d91906155ee565b6123639069ffffffffffffffffffff1647615609565b61236d9190615429565b90506123987f000000000000000000000000000000000000000000000000000000000000000061225c565b6123a29082615478565b90505f5b600e5460ff90811690821610156123ec576123e060068260ff16600881106123d0576123d06151d5565b01546001600160a01b031661225c565b909101906001016123a6565b505f5b60185460ff9081169082161015611f6d575f73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e631efeed33601060ff851660088110612431576124316151d5565b01546040518263ffffffff1660e01b815260040161245191815260200190565b602060405180830381865afa15801561246c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249091906154a0565b90505f8073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e637ba03aad601060ff8716600881106124c4576124c46151d5565b01546040518263ffffffff1660e01b81526004016124e491815260200190565b60c060405180830381865afa1580156124ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612523919061553b565b915091505f612536611df68460a0902090565b50506004549192505f918291506001600160a01b031663c72e160b84612562611e388860081c60020b90565b612572611e388960201c60020b90565b60405160e085901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039384166004820152918316602483015290911660448201526fffffffffffffffffffffffffffffffff891660648201526084016040805180830381865afa1580156125f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261791906155cc565b91509150612649855f01517f0000000000000000000000000000000000000000000000000000000000000000846140c8565b8801975061267c85602001517f0000000000000000000000000000000000000000000000000000000000000000836140c8565b909701965050600190940193506123ef92505050565b601081600881106126a1575f80fd5b0154905081565b6126b2815f613e13565b50565b6002545f906001600160a01b0316331461272b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f556e617574686f72697a6564000000000000000000000000000000000000000060448201526064016109c5565b601854600860ff9091161061279c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109c5565b73bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b03166375794a3c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128109190615461565b90505f6001600160a01b03861661282a6020890189614f5d565b6001600160a01b03161461284a576128456020880188614f5d565b61285a565b61285a6040880160208901614f5d565b90505f866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128bd9190615620565b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291d9190615620565b6129279190615640565b90505f612939838961072d858b610dc6565b90505f61294b848a61072d868b610dc6565b90505f61296a611df6612963368e90038e018e61567e565b60a0902090565b5050509050816001600160a01b0316836001600160a01b0316111561298d579091905b5f61299984848a61465c565b90506129a88c838686856146c6565b85601a5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508a601b5f8981526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060055f876001600160a01b03166001600160a01b031681526020019081526020015f205f81819054906101000a900461ffff1680929190612a52906156f8565b82546101009290920a61ffff8181021990931691831602179091556001600160a01b038d165f90815260056020526040812080549092169250612a94836156f8565b825461ffff9182166101009390930a928302919092021990911617905550601854879060109060ff1660088110612acd57612acd6151d5565b0155601880545f89815260196020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff93841617905582549091169190612b1c83615718565b82546101009290920a60ff81810219909316919092169190910217905550604080518881526001600160a01b0388811660208301528d168183015269ffffffffffffffffffff8c811660608301528b16608082015260a081018a905290517f29cd472535c058e9f744cc9cead6f8c38cbe5ea230674d825060f275884bdd729181900360c00190a150505050505095945050505050565b5f826001600160a01b0316846001600160a01b03161015612bd5575080612294565b612c016001600160a01b0383167801000000000000000000000000000000000000000000000000615429565b949350505050565b60068160088110612c18575f80fd5b01546001600160a01b0316905081565b612c3061306b565b6001600160a01b038116612cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c5565b6126b2816145f5565b6002546001600160a01b0316331480612cf157505f546001600160a01b031633145b612d57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4163636573732064656e6965640000000000000000000000000000000000000060448201526064016109c5565b6001600160a01b0381165f9081526001602052604090205460ff16612dd8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c696420746f6b656e0000000000000000000000000000000000000060448201526064016109c5565b60185460ff165b60ff811615612e78577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0130634a2539c3601060ff841660088110612e2657612e266151d5565b01546040518263ffffffff1660e01b8152600401612e4691815260200190565b5f604051808303815f87803b158015612e5d575f80fd5b505af1158015612e6f573d5f803e3d5ffd5b50505050612ddf565b50600e5460ff165b60ff811615612f21577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015f600660ff831660088110612ec257612ec26151d5565b01546001600160a01b03908116915083168114612f1b57612f18817f0000000000000000000000000000000000000000000000000000000000000000612f07846130de565b6001600160a01b03620124f8613438565b50505b50612e80565b50612f597f000000000000000000000000000000000000000000000000000000000000000082476001600160a01b03620124f8613438565b50506040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152613002907f00000000000000000000000000000000000000000000000000000000000000009083906001600160a01b038316906370a0823190602401602060405180830381865afa158015612fde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f079190615461565b5050600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040516001600160a01b03821681527f2cc79b200fc7fdf7af6be005fc77813bfacedb82066816356eed5b7df46194709060200160405180910390a150565b5f546001600160a01b03163314612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c5565b5f6001600160a01b03821615613172576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015613149573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061316d9190615461565b610e22565b4792915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614806131c057506001600160a01b038116155b156131c85750565b6001600160a01b0381165f908152600f6020526040902054600e5460ff9182169116811080156132205750816001600160a01b031660068260ff1660088110613213576132136151d5565b01546001600160a01b0316145b801561323457506064613232836130de565b105b801561325957506001600160a01b0382165f9081526005602052604090205461ffff16155b1561336b57600e805460ff16905f61327083615417565b82546101009290920a60ff818102199093169183160217909155600e541615905061336b57600e5460069060ff16600881106132ae576132ae6151d5565b01546001600160a01b0316600660ff8316600881106132cf576132cf6151d5565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580600f5f600660ff841660088110613320576133206151d5565b01546001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff929092169190911790555b5050565b5f80807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709858702925082811083820303915050805f036133c2575f84116133b7575f80fd5b508290049050612294565b8084116133cd575f80fd5b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600480546040517f64aa79a30000000000000000000000000000000000000000000000000000000081526001600160a01b03888116938201939093528683166024820152604481018690526064810185905262ffffff841660848201525f92839283928392909116906364aa79a39060a401606060405180830381865afa1580156134c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134e9919061572d565b90955090925090506001600160a01b038916613570577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015613558575f80fd5b505af115801561356a573d5f803e3d5ffd5b50505050505b5f6040518061010001604052805f6001600160a01b03168c6001600160a01b03161461359c578b6135be565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b031681526020015f6001600160a01b03168b6001600160a01b0316146135eb578a61360d565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b03168152602001846001600160a01b031663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015613657573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061367b9190615761565b62ffffff168152602001306001600160a01b031681526020014281526020018681526020018381526020015f6001600160a01b0316815250905073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389826040518263ffffffff1660e01b81526004016136f5919061577c565b6020604051808303815f875af1158015613711573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137359190615461565b93506001600160a01b038a161561374f5761374f8a613179565b6001600160a01b0389166137f0576040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b1580156137d5575f80fd5b505af11580156137e7573d5f803e3d5ffd5b505050506137f9565b6137f989613955565b604080516001600160a01b03808d1682528b166020820152908101869052606081018590527f25f1d03755df23c30e25db2dbd3891e31ce084bdfbfc46f9fe5e446ee5f9b2d49060800160405180910390a15050509550959350505050565b5f80846001600160a01b0316876001600160a01b03161415801561388e5750846001600160a01b0316866001600160a01b031614155b15613949575f61389d866130de565b9050620f424081101580156138b157505f85115b15613900575f806138e1888b85620f42406138cf8c620f7cd8615609565b6138d99190615429565b613a98613438565b9150915081830392508681116138f9578087036138fb565b5f5b965050505b620f4240811015801561391257505f84115b15613947575f61392f878984620f42406138cf8a620f7cd8615609565b91505084811161394157808503613943565b5f5b9450505b505b50919590945092505050565b6001600160a01b0381161580159061399f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b156126b2576040517f095ea7b300000000000000000000000000000000000000000000000000000000815273e592427a0aece92de3edee1f18e0157c0586156460048201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60248201526001600160a01b0382169063095ea7b3906044016020604051808303815f875af1158015613a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5e9190615202565b506001600160a01b0381165f818152600f602052604090205460069060ff1660088110613a8d57613a8d6151d5565b01546001600160a01b0316141580613ac55750600e546001600160a01b0382165f908152600f602052604090205460ff918216911610155b156126b257600e54600860ff90911610613b3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f4f7574206f66206d656d6f72790000000000000000000000000000000000000060448201526064016109c5565b5f613b4461229b565b613b4f90600461580d565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613c5457600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613c2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c52919061526e565b505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614613d5757600480546040517f7afd0a860000000000000000000000000000000000000000000000000000000081526001600160a01b03858116938201939093527f0000000000000000000000000000000000000000000000000000000000000000831660248201526fffffffffffffffffffffffffffffffff84166044820152911690637afd0a86906064016020604051808303815f875af1158015613d31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d55919061526e565b505b600e54829060069060ff1660088110613d7257613d726151d5565b0180546001600160a01b039283167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055600e80549184165f908152600f6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff948516179055815490921691613df683615718565b91906101000a81548160ff021916908360ff160217905550505050565b5f8082600f0b12613e24575f613e27565b60015b5f83600f0b12613e3857600d613e3b565b60115b604080516020810193909352820152606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081613e8e579050509050835f84600f0b12613eb65783613ebf565b613ebf84615838565b6040805160208101939093526fffffffffffffffffffffffffffffffff909116908201525f606082018190526080820181905260a08083015260c082015260e001604051602081830303815290604052815f81518110613f2157613f216151d5565b6020908102919091018101919091525f858152601a8252604080822054601b8452918190205481516001600160a01b0393841694810194909452919091169082015230606082015260800160405160208183030381529060405281600181518110613f8e57613f8e6151d5565b602002602001018190525073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f8383604051602001613fcf9291906152d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905261400842603c615395565b6040518363ffffffff1660e01b81526004016140259291906153a8565b5f604051808303815f87803b15801561403c575f80fd5b505af115801561404e573d5f803e3d5ffd5b5050505f858152601a6020908152604080832054601b8352928190205481518981526001600160a01b03948516938101939093529290921681830152600f86900b606082015290517f1172e6c2fa5b068f7396efd2ed20f26bf1ce7899860acd635416a62a99bb975c92509081900360800190a150505050565b5f806001600160a01b0385161561413e57846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614115573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141399190615620565b614141565b60125b90505f846001600160a01b0316866001600160a01b03161461420357600480546040517f2b0697830000000000000000000000000000000000000000000000000000000081526001600160a01b03898116938201939093528783166024820152869290911690632b06978390604401602060405180830381865afa1580156141cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ef91906155ee565b69ffffffffffffffffffff1602905061420d565b5064e8d4a5100083025b8160ff16600a0a818161422257614222615221565b049695505050505050565b5f805f805f61423b86614abd565b6040517f1e2eaeaf000000000000000000000000000000000000000000000000000000008152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa15801561429c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142c09190615461565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b60020b5f60ff82901d80830118620d89e881111561433a5761433a7f8b86327a0000000000000000000000000000000000000000000000000000000084614af9565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615614383576ffff97272373d413259a46990580e213a0260801c5b60048216156143a2576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156143c1576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156143e0576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156143ff576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561441e576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561443d576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561445d576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561447d576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561449d576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156144bd576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156144dd576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156144fd576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161561451d576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561453d576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561455e576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561457e576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561459d576d2216e584f5fa1ea926041bedfe980260801c5b620800008216156145ba576b048a170391f7dc42444e8fa20260801c5b5f8413156145e5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff045b63ffffffff0160201c9392505050565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f826001600160a01b0316846001600160a01b0316111561467b579192915b5f6146a6856001600160a01b0316856001600160a01b03166c01000000000000000000000000614b08565b90506120e46146c184838888036001600160a01b0316614b08565b614b58565b600480546040517fc72e160b0000000000000000000000000000000000000000000000000000000081526001600160a01b0387811693820193909352858316602482015284831660448201526fffffffffffffffffffffffffffffffff841660648201525f928392169063c72e160b906084016040805180830381865afa158015614753573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061477791906155cc565b90925090506147a361478c6020890189614f5d565b61479c60408a0160208b01614f5d565b8484610e28565b6040517f020000000000000000000000000000000000000000000000000000000000000060208201527f0d0000000000000000000000000000000000000000000000000000000000000060218201525f90602201604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815260028084526060840190925292505f9190816020015b6060815260200190600190039081614838579050509050886148606080820160608301615874565b61487060808c0160608d01615874565b60020b61487c8a614b9b565b60020b8161488c5761488c615221565b050261489e60808c0160608d01615874565b6148ae60808d0160608e01615874565b60020b6148ba8a614b9b565b60020b816148ca576148ca615221565b0502600a886103ff026fffffffffffffffffffffffffffffffff16901c8787303060405160200161490a91906001600160a01b0391909116815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261494c989796959493929160200161588f565b604051602081830303815290604052815f8151811061496d5761496d6151d5565b6020026020010181905250885f01602081019061498a9190614f5d565b61499a60408b0160208c01614f5d565b604080516001600160a01b0393841660208201529290911690820152606001604051602081830303815290604052816001815181106149db576149db6151d5565b60200260200101819052505f42603c0190505f614a108b5f016020810190614a039190614f5d565b6001600160a01b03161590565b614a1a575f614a1c565b855b905073bd216513d74c8cf14cf4747e6aaa6420ff64ee9e6001600160a01b031663dd46508f828686604051602001614a559291906152d5565b604051602081830303815290604052856040518463ffffffff1660e01b8152600401614a829291906153a8565b5f604051808303818588803b158015614a99575f80fd5b505af1158015614aab573d5f803e3d5ffd5b50505050505050505050505050505050565b6040515f90614adc908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870982811083820303915050808411614b46575f80fd5b805f036133cd57508290049050612294565b806fffffffffffffffffffffffffffffffff811681146120ed576120ed7f93dafdf100000000000000000000000000000000000000000000000000000000614e98565b5f73fffd8963efd1fc6a506488495d951d51639616827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffd895d83016001600160a01b03161115614c0d57614c0d7f614875240000000000000000000000000000000000000000000000000000000083614ea0565b77ffffffffffffffffffffffffffffffffffffffff00000000602083901b16805f614c3782614eb5565b60ff16905060808110614c5257607f810383901c9150614c5c565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581027ffffffffffffffffffffffffffffffffffd709b7e5480fba5a50fed5e62ffc5568101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b14614e8957886001600160a01b0316614e6e826142f8565b6001600160a01b03161115614e835781614e8b565b80614e8b565b815b9998505050505050505050565b805f5260045ffd5b815f526001600160a01b03811660045260245ffd5b5f808211614ec1575f80fd5b507f0706060506020500060203020504000106050205030304010505030400000000601f6f8421084210842108cc6318c6db6d54be6fffffffffffffffffffffffffffffffff841160071b84811c67ffffffffffffffff1060061b1784811c63ffffffff1060051b1784811c61ffff1060041b1784811c60ff1060031b1793841c1c161a1790565b6001600160a01b03811681146126b2575f80fd5b5f60208284031215614f6d575f80fd5b813561229481614f49565b5f805f60608486031215614f8a575f80fd5b8335614f9581614f49565b92506020840135614fa581614f49565b929592945050506040919091013590565b5f60208284031215614fc6575f80fd5b5035919050565b5f8060408385031215614fde575f80fd5b8235614fe981614f49565b946020939093013593505050565b69ffffffffffffffffffff811681146126b2575f80fd5b5f806040838503121561501f575f80fd5b8235805f0b811461502e575f80fd5b9150602083013561503e81614ff7565b809150509250929050565b5f805f806080858703121561505c575f80fd5b843561506781614f49565b9350602085013561507781614f49565b93969395505050506040820135916060013590565b5f805f6060848603121561509e575f80fd5b505081359360208301359350604090920135919050565b5f80602083850312156150c6575f80fd5b823567ffffffffffffffff8111156150dc575f80fd5b8301601f810185136150ec575f80fd5b803567ffffffffffffffff811115615102575f80fd5b8560208260051b8401011115615116575f80fd5b6020919091019590945092505050565b5f805f805f85870361012081121561513c575f80fd5b60a0811215615149575f80fd5b5085945060a086013561515b81614f49565b935060c086013561516b81614ff7565b925060e086013561517b81614ff7565b94979396509194610100013592915050565b5f805f6060848603121561519f575f80fd5b83356151aa81614f49565b925060208401356151ba81614f49565b915060408401356151ca81614f49565b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615212575f80fd5b81518015158114612294575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6020828403121561525e575f80fd5b815180600f0b8114612294575f80fd5b5f6020828403121561527e575f80fd5b815161229481614f49565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b604081525f6152e76040830185615289565b828103602084015280845180835260208301915060208160051b840101602087015f5b8381101561535a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403018552615344838351615289565b602095860195909350919091019060010161530a565b509098975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115610e2257610e22615368565b604081525f6153ba6040830185615289565b90508260208301529392505050565b81810381811115610e2257610e22615368565b5f61ffff8216806153ef576153ef615368565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b5f60ff8216806153ef576153ef615368565b5f8261545c577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215615471575f80fd5b5051919050565b6fffffffffffffffffffffffffffffffff8181168382160190811115610e2257610e22615368565b5f602082840312156154b0575f80fd5b81516fffffffffffffffffffffffffffffffff81168114612294575f80fd5b60405160a0810167ffffffffffffffff81118282101715615517577f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60405290565b62ffffff811681146126b2575f80fd5b8060020b81146126b2575f80fd5b5f8082840360c081121561554d575f80fd5b60a081121561555a575f80fd5b506155636154cf565b835161556e81614f49565b8152602084015161557e81614f49565b602082015260408401516155918161551d565b604082015260608401516155a48161552d565b606082015260808401516155b781614f49565b608082015260a0939093015192949293505050565b5f80604083850312156155dd575f80fd5b505080516020909101519092909150565b5f602082840312156155fe575f80fd5b815161229481614ff7565b8082028115828204841417610e2257610e22615368565b5f60208284031215615630575f80fd5b815160ff81168114612294575f80fd5b5f82810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808112607f82131715610e2257610e22615368565b5f60a082840312801561568f575f80fd5b506156986154cf565b82356156a381614f49565b815260208301356156b381614f49565b602082015260408301356156c68161551d565b604082015260608301356156d98161552d565b606082015260808301356156ec81614f49565b60808201529392505050565b5f61ffff821661ffff810361570f5761570f615368565b60010192915050565b5f60ff821660ff810361570f5761570f615368565b5f805f6060848603121561573f575f80fd5b835161574a81614f49565b602085015160409095015190969495509392505050565b5f60208284031215615771575f80fd5b81516122948161551d565b5f610100820190506001600160a01b0383511682526001600160a01b03602084015116602083015262ffffff604084015116604083015260608301516157cd60608401826001600160a01b03169052565b506080830151608083015260a083015160a083015260c083015160c083015260e083015161580660e08401826001600160a01b03169052565b5092915050565b6fffffffffffffffffffffffffffffffff818116838216029081169081811461580657615806615368565b5f81600f0b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000810361586c5761586c615368565b5f0392915050565b5f60208284031215615884575f80fd5b81356122948161552d565b5f893561589b81614f49565b6001600160a01b0316825260208a01356158b481614f49565b6001600160a01b0316602083015260408a01356158d08161551d565b62ffffff16604083015260608a01356158e88161552d565b60020b606083015260808a01356158fe81614f49565b6001600160a01b03166080830152600289810b60a084015288900b60c08301526fffffffffffffffffffffffffffffffff871660e0830152856101008301528461012083015261595a6101408301856001600160a01b03169052565b610180610160830152615971610180830184615289565b9a995050505050505050505056fea26469706673582212205fda1da396fb98960454fee4ee80efabd40f1550e6415d5080c649a0c20950b664736f6c634300081a0033