34 txs
10 calls
constructor
constructor(address _stakingToken, address _tokenWhitelist, address _incentiveWallet, address _admin)
functions
accruedRewards
viewfunction accruedRewards(address, address) view returns (uint256)
ADMIN_ROLE
viewfunction ADMIN_ROLE() view returns (bytes32)
AIRDROP_ROLE
viewfunction AIRDROP_ROLE() view returns (bytes32)
canUnstake
viewfunction canUnstake(address user) view returns (bool canUnstakeNow)
cooldownInfo
viewfunction cooldownInfo(address) view returns (uint256 amount, uint256 expiry)
cooldownPeriod
viewfunction cooldownPeriod() view returns (uint256)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DIGITAL_TWIN_THRESHOLD
viewfunction DIGITAL_TWIN_THRESHOLD() view returns (uint256)
earned
viewfunction earned(address user, address token) view returns (uint256)
emergencyFee
viewfunction emergencyFee() view returns (uint256)
emergencyWithdrawEnabled
viewfunction emergencyWithdrawEnabled() view returns (bool)
failedTransfers
viewfunction failedTransfers(address, address) view returns (uint256)
getAccruedRewards
viewfunction getAccruedRewards(address wallet, address token) view returns (uint256)
getActiveStakersCount
viewfunction getActiveStakersCount() view returns (uint256)
getAllRewardTokens
viewfunction getAllRewardTokens() view returns (address[] tokens)
getBatchPendingRewards
viewfunction getBatchPendingRewards(address user, address[] tokens) view returns (uint256[] rewards)
getBatchStakingSummary
viewfunction getBatchStakingSummary(address[] users) view returns (uint256[] userStakedAmounts, uint256[] userCooldownAmounts, uint256[] userCooldownExpiries, bool[] userDigitalTwinEligible)
getCooldownInfo
viewfunction getCooldownInfo(address wallet) view returns (uint256 amount, uint256 expiry)
getCooldownPeriod
viewfunction getCooldownPeriod() view returns (uint256)
getCooldownTimeRemaining
viewfunction getCooldownTimeRemaining(address user) view returns (uint256 timeRemaining)
getDigitalTwinThreshold
viewfunction getDigitalTwinThreshold() view returns (uint256)
getEmergencyFee
viewfunction getEmergencyFee() view returns (uint256)
getFailedTransferAmount
viewfunction getFailedTransferAmount(address user, address token) view returns (uint256 amount)
getIncentivePercentage
viewfunction getIncentivePercentage() view returns (uint256)
getIncentiveRewardSummary
viewfunction getIncentiveRewardSummary() view returns (address[] tokens, uint256[] amounts, uint256 totalTokenCount)
getIncentiveWallet
viewfunction getIncentiveWallet() view returns (address)
getMinimumCooldownPeriod
viewfunction getMinimumCooldownPeriod() view returns (uint256)
getMinimumStakeAmount
viewfunction getMinimumStakeAmount() view returns (uint256)
getPendingRewards
viewfunction getPendingRewards(address wallet, address token) view returns (uint256)
getProtocolStats
viewfunction getProtocolStats() view returns (uint256 protocolTotalStaked, uint256 activeStakersCount, uint256 digitalTwinEligibleCount, uint256 totalRewardTokensCount)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getStakedAmount
viewfunction getStakedAmount(address wallet) view returns (uint256)
getTokensWithFailedTransfers
viewfunction getTokensWithFailedTransfers() view returns (address[] tokens)
getTotalStaked
viewfunction getTotalStaked() view returns (uint256)
getUserDashboard
viewfunction getUserDashboard(address user) view returns (uint256 stakedAmount, uint256 cooldownAmount, uint256 cooldownExpiry, bool canUnstakeNow, bool isDigitalTwinEligible, address[] rewardTokens, uint256[] rewardAmounts)
getUserFailedTransfers
viewfunction getUserFailedTransfers(address user) view returns (address[] tokens, uint256[] amounts)
getUserRewardSummary
viewfunction getUserRewardSummary(address user) view returns (address[] tokens, uint256[] amounts, uint256 totalTokenCount)
getUserRewardTokenCount
viewfunction getUserRewardTokenCount(address user) view returns (uint256 count)
getUserRewardTokens
viewfunction getUserRewardTokens(address user) view returns (address[] tokens)
hasAirdropPermission
viewfunction hasAirdropPermission(address wallet) view returns (bool hasPermission)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
incentivePercentage
viewfunction incentivePercentage() view returns (uint256)
incentiveRewardsAccrued
viewfunction incentiveRewardsAccrued(address) view returns (uint256)
incentiveWallet
viewfunction incentiveWallet() view returns (address)
isEligibleForDigitalTwin
viewfunction isEligibleForDigitalTwin(address wallet) view returns (bool)
isEmergencyWithdrawEnabled
viewfunction isEmergencyWithdrawEnabled() view returns (bool)
isOwner
viewfunction isOwner(address account) view returns (bool hasOwnership)
isPaused
viewfunction isPaused(bytes4 functionSelector) view returns (bool)
MAX_EMERGENCY_FEE
viewfunction MAX_EMERGENCY_FEE() view returns (uint256)
MAX_INCENTIVE_PERCENTAGE
viewfunction MAX_INCENTIVE_PERCENTAGE() view returns (uint256)
MAXIMUM_COOLDOWN_PERIOD
viewfunction MAXIMUM_COOLDOWN_PERIOD() view returns (uint256)
MINIMUM_COOLDOWN_PERIOD
viewfunction MINIMUM_COOLDOWN_PERIOD() view returns (uint256)
MINIMUM_STAKE_AMOUNT
viewfunction MINIMUM_STAKE_AMOUNT() view returns (uint256)
owner
viewfunction owner() view returns (address primaryOwner)
pausedFunctions
viewfunction pausedFunctions(bytes4) view returns (bool)
rewardDebt
viewfunction rewardDebt(address, address) view returns (uint256)
rewardPerToken
viewfunction rewardPerToken(address token) view returns (uint256)
rewardPerTokenStored
viewfunction rewardPerTokenStored(address) view returns (uint256)
stakedAmounts
viewfunction stakedAmounts(address) view returns (uint256)
stakingToken
viewfunction stakingToken() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenWhitelist
viewfunction tokenWhitelist() view returns (address)
totalRewardsAccrued
viewfunction totalRewardsAccrued(address) view returns (uint256)
totalStaked
viewfunction totalStaked() view returns (uint256)
userHasPendingRewards
viewfunction userHasPendingRewards(address user) view returns (bool hasRewards)
_performAutoClaim
nonpayablefunction _performAutoClaim(address user)
airdropRewards
nonpayablefunction airdropRewards(address[] tokens, uint256[] amounts)
airdropStake
nonpayablefunction airdropStake(address recipient, uint256 amount)
cancelUnstake
nonpayablefunction cancelUnstake()
claimIncentiveFees
nonpayablefunction claimIncentiveFees(address[] tokens)
claimRewards
nonpayablefunction claimRewards(address[] tokens)
contributeFees
nonpayablefunction contributeFees(address[] tokens, uint256[] amounts, string source)
emergencyTokenRecovery
nonpayablefunction emergencyTokenRecovery(address token, address to, uint256 amount)
emergencyWithdraw
nonpayablefunction emergencyWithdraw()
grantAirdropPermission
nonpayablefunction grantAirdropPermission(address wallet)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initiateUnstake
nonpayablefunction initiateUnstake(uint256 amount)
pauseFunction
nonpayablefunction pauseFunction(bytes4 functionSelector)
recoverFailedTransfers
nonpayablefunction recoverFailedTransfers(address user, address[] tokens)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeAirdropPermission
nonpayablefunction revokeAirdropPermission(address wallet)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setCooldownPeriod
nonpayablefunction setCooldownPeriod(uint256 period)
setEmergencyWithdraw
nonpayablefunction setEmergencyWithdraw(bool enabled, uint256 fee)
setIncentivePercentage
nonpayablefunction setIncentivePercentage(uint256 percentage)
stake
nonpayablefunction stake(uint256 amount)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unpauseFunction
nonpayablefunction unpauseFunction(bytes4 functionSelector)
unstake
nonpayablefunction unstake()
events
AirdropPermissionGranted
event AirdropPermissionGranted(address indexed wallet, address indexed admin)
AirdropPermissionRevoked
event AirdropPermissionRevoked(address indexed wallet, address indexed admin)
AirdropStakeExecuted
event AirdropStakeExecuted(address indexed admin, address indexed recipient, uint256 amount, uint256 timestamp)
CooldownPeriodUpdated
event CooldownPeriodUpdated(uint256 oldPeriod, uint256 newPeriod)
CooldownRestaked
event CooldownRestaked(address indexed user, uint256 amount, uint256 timestamp)
EmergencyTokenRecovery
event EmergencyTokenRecovery(address indexed admin, address indexed token, address indexed to, uint256 amount)
EmergencyWithdraw
event EmergencyWithdraw(address indexed user, uint256 amount, uint256 fee)
EmergencyWithdrawConfigured
event EmergencyWithdrawConfigured(bool enabled, uint256 fee)
FailedTransferRecovered
event FailedTransferRecovered(address indexed user, address indexed token, uint256 amount)
FeesAccruedToStakers
event FeesAccruedToStakers(address[] tokens, uint256[] amounts, uint256 stakersCount, uint256 totalStaked)
FeesContributed
event FeesContributed(address indexed contributor, address[] tokens, uint256[] amounts, string source)
FunctionPaused
event FunctionPaused(bytes4 indexed functionSelector, address indexed admin)
FunctionUnpaused
event FunctionUnpaused(bytes4 indexed functionSelector, address indexed admin)
IncentiveFeesClaimed
event IncentiveFeesClaimed(address indexed wallet, address[] tokens, uint256[] amounts)
IncentivePercentageUpdated
event IncentivePercentageUpdated(uint256 oldPercentage, uint256 newPercentage)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
RewardsClaimed
event RewardsClaimed(address indexed user, address indexed token, uint256 amount)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Staked
event Staked(address indexed user, uint256 amount, uint256 timestamp)
TransferFailedEvent
event TransferFailedEvent(address indexed user, address indexed token, uint256 amount, string reason)
Unstaked
event Unstaked(address indexed user, uint256 amount, uint256 timestamp, bool autoClaimedRewards)
UnstakeInitiated
event UnstakeInitiated(address indexed user, uint256 amount, uint256 cooldownEnd)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ArrayLengthMismatch
error ArrayLengthMismatch()
CooldownNotExpired
error CooldownNotExpired()
FunctionPausedError
error FunctionPausedError()
InsufficientStake
error InsufficientStake()
InvalidCooldownPeriod
error InvalidCooldownPeriod()
InvalidEmergencyFee
error InvalidEmergencyFee()
InvalidIncentivePercentage
error InvalidIncentivePercentage()
InvalidPercentage
error InvalidPercentage(uint256 percentage)
InvalidTokenAddress
error InvalidTokenAddress()
NoCooldownActive
error NoCooldownActive()
NoRewardsToClaim
error NoRewardsToClaim()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
ScaleTooLarge
error ScaleTooLarge(uint256 scale, uint256 maxScale)
TokenNotWhitelisted
error TokenNotWhitelisted()
TransferFailed
error TransferFailed()
UnauthorizedAccess
error UnauthorizedAccess()
ZeroTotalStaked
error ZeroTotalStaked()
creation bytecode
0x60e0346101a657601f61501938819003918201601f19168301916001600160401b038311848410176101aa578084926080946040528339810103126101a657610047816101be565b610053602083016101be565b9161006c6060610065604084016101be565b92016101be565b600180556213c68060025560146003556001600160a01b039092169283158015610195575b8015610184575b8015610173575b610164576080939093526001600160a01b0392831660a05260c052600980546001600160a01b031916928216929092179091556100e5906100df816101d2565b50610248565b50604051614cdd90816102dc823960805181818161108a01528181611a67015281816122c70152818161282801528181612e2501526131fb015260a0518181816106840152818161095f01528181610d15015281816112be015281816115b80152818161261b0152612872015260c051818181610ce201526135a90152f35b630f58058360e11b5f5260045ffd5b506001600160a01b0383161561009f565b506001600160a01b03821615610098565b506001600160a01b03811615610091565b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101a657565b6001600160a01b0381165f9081525f516020614ff95f395f51905f52602052604090205460ff16610243576001600160a01b03165f8181525f516020614ff95f395f51905f5260205260408120805460ff191660011790553391905f516020614fb95f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f516020614fd95f395f51905f52602052604090205460ff16610243576001600160a01b03165f8181525f516020614fd95f395f51905f5260205260408120805460ff191660011790553391907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775905f516020614fb95f395f51905f529080a460019056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a7146133a25750806304646a4914611f6857806305b57d89146132ca5780630917e77614611e9157806309b65e66146130ab5780630b6a577d14612bfe5780630d3db673146130eb57806310460d51146130ab57806310c1c1031461307357806312edb24c146130445780631b60f26614612ff45780631d86575214612f725780631e0fbfa214612fcd578063211dc32d14612fa1578063248a9ca314612f775780632bb86cdc14612f725780632dd1e5f814612e975780632def662014612daa5780632f2ff15d14612d6d5780632f54bf6e14612d1f57806336568abe14612cdb578063368415c914612c1b5780633765cf0214611e6e5780634338e18a14612bfe5780634ab1796914612b055780634da6a55614612ac7578063515a879c14612aa4578063517fac6814612a5957806354c3a192146127be57806356ae5541146126025780635747e69f14611dd757806357d51b45146125425780635f58f7161461239757806365a36b7a146122f657806372f702f3146122b2578063742fd52f1461212957806375b238fc146120ef578063771aceef1461205d57806377bc2e1d14611fd55780637a27db5714611df95780637b4717a414611f855780637ce2bfc9146103ef5780637defd5b014611f685780637ea143fb14611f4b57806380ea3de114611eae578063817b1cd214611e9157806384d804be14611e6e57806385f4498b14611dfe57806386a8b33114611df9578063870cfa4014611dd75780638cefa92d14611d7b5780638da5cb5b14611d5357806391d1485414611d0b578063928cf80214611bf85780639454cc841461144257806397fa8b6814611b875780639c0869cc14611afa5780639ce43f9014611b4f578063a07c6f9214611b17578063a0cc74ee14611afa578063a217fddf14611ae0578063a694fc3a1461199a578063ac6bbbb21461196d578063aded8f77146110c2578063ae5ac92114611816578063b7e7908f14611773578063c114c2e714611501578063c525e2141461145f578063c59670f414611442578063c5d304e9146112ed578063ca735cc1146112a9578063ca9f2e8b14611259578063d2bb742c14611238578063d38a21c6146111f7578063d48b71a914611109578063d547741f146110c7578063d8e5f147146110c2578063db2e21bc14610fcb578063dcf54b1714610f93578063de3c2ee514610ed8578063e9b8be9014610ebb578063efb0bcad14610ca7578063f05c3a1b14610c2b578063f122977714610c00578063f2fde38b14610bdd578063f45464ad1461088e578063f9f031df14610649578063faaf8076146104175763fef44a00146103ef575f80fd5b34610413575f36600319011261041357602060405169021e19e0c9bab24000008152f35b5f80fd5b34610413576020366003190112610413576001600160a01b036104386133f5565b16801561063a57806020915f52600a825260405f205490805f52600b835260405f209160405161046781613627565b600184549485835201549485910152831515908161062f575b6040519263c5d304e960e01b845260048401525f83602481305afa918215610624575f935f93610504575b509269021e19e0c9bab24000006104f29261050095604051988998838a5260208a01526040890152151560608801521015608086015260e060a086015260e0850190613421565b9083820360c08501526134eb565b0390f35b925092503d805f843e6105178184613656565b8201916060818403126104135780516001600160401b0381116104135781019083601f8301121561041357815161054d816138ea565b9261055b6040519485613656565b81845260208085019260051b8201019086821161041357602001915b818310610604575050506020810151906001600160401b03821161041357019280601f850112156104135783516105ad816138ea565b946105bb6040519687613656565b81865260208087019260051b82010192831161041357602001905b8282106105f457509194915069021e19e0c9bab240000090506104ab565b81518152602091820191016105d6565b82516001600160a01b038116810361041357815260209283019201610577565b6040513d5f823e3d90fd5b428511159150610480565b630f58058360e11b5f5260045ffd5b34610413576020366003190112610413576004356001600160401b03811161041357610679903690600401613478565b90610682613c13565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f5b83811061080157505081156107f2575f5b8281106107d257505f916106d281613901565b905f5b8181106106f75784156106e85760018055005b6373380d9960e01b5f5260045ffd5b61070a6107058284876138c6565b6138d6565b335f52600d60205260405f2060018060a01b0382165f5260205260405f2054908161073a575b50506001016106d5565b335f52600d60205260405f2060018060a01b0382165f526020525f6040812055335f5260156020526107868260405f209261077e60018060a01b0382168095614b3e565b5033906143f5565b1561073057818392975061079c60019487613807565b5282966040519081527f9310ccfcb8de723f578a9e4282ea9f521f05ae40dc08f3068dfad528a65ee3c760203392a39086610730565b806107ec6107e661070560019487876138c6565b336146e3565b016106bf565b63512509d360e11b5f5260045ffd5b61080f6107058286866138c6565b60405163b5af090f60e01b81526001600160a01b039091166004820152602081602481865afa908115610624575f91610860575b5015610851576001016106ae565b6307c241ad60e51b5f5260045ffd5b610881915060203d8111610887575b6108798183613656565b8101906138ae565b85610843565b503d61086f565b34610413576060366003190112610413576004356001600160401b038111610413576108be903690600401613478565b906024356001600160401b038111610413576108de903690600401613478565b9190926044356001600160401b0381116104135736602382011215610413578060040135936001600160401b03851161041357366024868401011161041357610925613c13565b63f45464ad60e01b5f52600c6020527ffab62a8dbc7408bf84f756e4c39215a913400323f25c95e5339abb7da237009b5460ff16610bce577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f5b848110610b605750508083036107f25782156107f2575f5b838110610a275750908460246109fb7fcaa1b85e5c13f2698557b6808ee83ee8f963e96f3831cf70d626cb10514d14b59798602096956109ee604051998a9860608a5260608a01916139b2565b9187830389890152613a02565b92848403604086015282845201848301375f8187018401523395601f01601f191601030190a260018055005b610a328183896138c6565b3515610b5857610a466107058286886138c6565b610a5182848a6138c6565b3590610a5c81614591565b6001600160a01b0316610a7182303384613d45565b60035491610a7f83826146be565b9260648111610b465781610a9b610aa1926001979695946146be565b906136a1565b9180610b27575b5081151580610b1c575b610ac0575b50505b016109a1565b610b1491815f526018602052610add60405f205460065483614644565b825f526010602052610af460405f20918254613606565b9055815f52600e602052610b0d60405f20918254613606565b9055614817565b508880610ab7565b506006541515610ab2565b815f52600f602052610b3e60405f20918254613606565b90558a610aa8565b63aa31867360e01b5f5260045260245ffd5b600190610aba565b610b6e6107058287896138c6565b60405163b5af090f60e01b81526001600160a01b039091166004820152602081602481865afa908115610624575f91610bb0575b501561085157600101610989565b610bc8915060203d8111610887576108798183613656565b89610ba2565b639115528960e01b5f5260045ffd5b3461041357602036600319011261041357610bfe610bf96133f5565b613b77565b005b34610413576020366003190112610413576020610c23610c1e6133f5565b613b3b565b604051908152f35b3461041357602036600319011261041357610c446133f5565b6001600160a01b0316801561063a575f52600b602052602060405f20600160405191610c6f83613627565b805483520154918291015280151580610c9e575b15610c9557610c2360209142906136a1565b5060205f610c23565b50428111610c83565b34610413576020366003190112610413576004356001600160401b03811161041357610cd7903690600401613478565b90610ce0613c13565b7f00000000000000000000000000000000000000000000000000000000000000009060018060a01b03821692833303610eac577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f5b828110610e3e57505080156107f257610d5781613901565b925f905f5b838110610dc6575050610d70575b60018055005b610dba7f114e951a6ad582d5843e3c1525b16b9e14b4e7619efe735c2cda3992ca38184f93610dac6040519485946040865260408601916139b2565b9083820360208501526134eb565b0390a280808080610d6a565b610dd46107058286886138c6565b6001600160a01b0381165f818152600f602052604090205491849183610e01575b50505050600101610d5c565b918391610e1a935f52600f6020525f60408120556143f5565b610e27575b828180610df5565b909250610e348387613807565b5260019182610e1f565b610e4c6107058285876138c6565b60405163b5af090f60e01b81526001600160a01b039091166004820152602081602481865afa908115610624575f91610e8e575b501561085157600101610d3f565b610ea6915060203d8111610887576108798183613656565b87610e80565b631a27eac360e11b5f5260045ffd5b34610413575f366003190112610413576020600754604051908152f35b3461041357602036600319011261041357610ef16133f5565b6001600160a01b0381165f811561063a57610f0a614963565b925f5b8451811015610f88576001600160a01b03610f288287613807565b5116845f52600d60205260405f2060018060a01b0382165f5260205260405f20541590811591610f75575b50610f61575b600101610f0d565b91610f6d600191613933565b929050610f59565b610f809150836136c1565b151586610f53565b602083604051908152f35b34610413576020366003190112610413576001600160a01b03610fb46133f5565b165f52600f602052602060405f2054604051908152f35b34610413575f36600319011261041357610fe3613c13565b60ff6004541615610eac57335f52600b60205260405f2060016040519161100983613627565b805483520154806020830152156110b3575161103161102a60055483613d90565b80926136a1565b90335f52600b6020525f600160408220828155015581611083575b60405191825260208201527fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059560403392a260018055005b6110ae82337f0000000000000000000000000000000000000000000000000000000000000000613f31565b61104c565b6377ce8b0d60e11b5f5260045ffd5b613594565b3461041357604036600319011261041357610bfe6004356110e661340b565b906111046110ff825f525f602052600160405f20015490565b613f6d565b614316565b34610413575f36600319011261041357611121614963565b61112b8151613901565b5f905f5b8351811015611186576001600160a01b0361114a8286613807565b5116805f52600f60205260405f2054611167575b5060010161112f565b8361117f916111796001949686613807565b52613933565b929061115e565b509061119181613901565b9061119b81613901565b925f5b8281106111b757505061050090604051938493846135d8565b6001906001600160a01b036111cc8285613807565b5116806111d98388613807565b525f52600f60205260405f20546111f08288613807565b520161119e565b34610413576020366003190112610413576001600160a01b036112186133f5565b165f52600b6020526040805f206001815491015482519182526020820152f35b3461041357602036600319011261041357610bfe6112546133f5565b613a26565b34610413576040366003190112610413576112726133f5565b61127a61340b565b6001600160a01b039182165f908152600d60209081526040808320949093168252928352819020549051908152f35b34610413575f366003190112610413576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610413576020366003190112610413576113066133f5565b6001600160a01b03811690811561063a5761131f614963565b9161132a8351613901565b905f905f5b85518110156113ad576001600160a01b0361134a8288613807565b5116825f52600d60205260405f2060018060a01b0382165f5260205260405f20541580159061139b575b611382575b5060010161132f565b83611394916111796001949688613807565b9290611379565b506113a681876136c1565b1515611374565b5092916113b982613901565b926113c383613901565b945f5b8481106113dd5760405180610500878a8a846135d8565b6001906114316001600160a01b036113f58388613807565b511680611402848b613807565b52845f52600d60205260405f20848060a01b0382165f5260205261142b60405f205491876136c1565b90613606565b61143b828a613807565b52016113c6565b34610413575f36600319011261041357602060405162093a808152f35b34610413575f3660031901126104135760135461147b81613901565b905f601354905b82811061149f576040516020808252819061050090820187613421565b818110156114ed5760135f527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090810154600191906001600160a01b03166114e68287613807565b5201611482565b634e487b7160e01b5f52603260045260245ffd5b34610413576040366003190112610413576004356001600160401b03811161041357611531903690600401613478565b906024356001600160401b03811161041357611551903690600401613478565b909161155b613c13565b335f9081525f516020614c085f395f51905f52602052604090205460ff1615610eac5763c114c2e760e01b5f52600c6020527f6f71f4c6837f96d246c5beefdcd314deeeb2b78c1e874a441f5d5a0075e98e1b5460ff16610bce577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f5b8581106117055750508184036107f25783156107f2575f5b84811061167d57509161164c9161163e7fcaa1b85e5c13f2698557b6808ee83ee8f963e96f3831cf70d626cb10514d14b594604051966060885260608801916139b2565b918583036020870152613a02565b916c041444d494e5f41495244524f5609c1b602082850394856040850152600d81520152604033930190a260018055005b8061168b60019285876138c6565b35156117005761169f6107058288866138c6565b6116aa8286886138c6565b35838060a01b038216906116c081303385613d45565b6006546116d2575b5050505b016115fa565b6116de6116f793614591565b815f526018602052610add60405f205460065483614644565b508680806116c8565b6116cc565b6117136107058288866138c6565b60405163b5af090f60e01b81526001600160a01b039091166004820152602081602481865afa908115610624575f91611755575b5015610851576001016115e2565b61176d915060203d8111610887576108798183613656565b87611747565b3461041357611781366134a8565b916001600160a01b0381169190821561063a5761179d84613901565b935f5b8181106117bd5760405160208082528190610500908201896134eb565b600190855f52600d60205260405f206117da6107058386896138c6565b838060a01b03165f5260205261180560405f205461142b6117ff61070585888b6138c6565b876136c1565b61180f8289613807565b52016117a0565b3461041357602036600319011261041357600435611832613c13565b80158015611958575b6119495761184833613c33565b335f52600b602052600160405f20015442105f1461190b57335f52600b60205260405f20611877828254613606565b90555b335f52600a60205260405f206118918282546136a1565b905561189f816006546136a1565b600655335f52600a60205260405f2054156118fc575b335f52600b602052600160405f20015460405191825260208201527f9cee5eacd317086e5050733a5dad16ef5aaec185de792371a9625bfee2a3213b60403392a260018055005b61190533614a7f565b506118b5565b61191760025442613606565b60016040519161192683613627565b83835260208301908152335f52600b60205260405f20925183555191015561187a565b6378de4a6960e11b5f5260045ffd5b50335f52600a60205260405f2054811161183b565b3461041357602036600319011261041357602061199061198b6133f5565b613941565b6040519015158152f35b34610413576020366003190112610413576004356119b6613c13565b63534a7e1d60e11b5f52600c6020527f26ae9ab2828c52f592ece3f02102d27c0f887a693e2d70f296a9328d73916f715460ff16610bce5780156119495768056bc75e2d63100000811061194957611a0d33613c33565b335f52600b602052600160405f2001544210611ad2575b335f52600a60205260405f205415611ac3575b335f52600a60205260405f20611a4e828254613606565b9055611a5c81600654613606565b600655611a8b8130337f0000000000000000000000000000000000000000000000000000000000000000613d45565b6040519081524260208201527f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9060403392a260018055005b611acc336147b1565b50611a37565b611adb33613c73565b611a24565b34610413575f3660031901126104135760206040515f8152f35b34610413575f366003190112610413576020600354604051908152f35b34610413576020366003190112610413576001600160a01b03611b386133f5565b165f52600e602052602060405f2054604051908152f35b34610413576020366003190112610413576001600160a01b03611b706133f5565b165f526010602052602060405f2054604051908152f35b3461041357604036600319011261041357611ba06133f5565b611ba861340b565b906001600160a01b031680158015611be7575b61063a575f52601260205260405f209060018060a01b03165f52602052602060405f2054604051908152f35b506001600160a01b03821615611bbb565b3461041357602036600319011261041357611c116133f5565b6001600160a01b03811690811561063a57611c2a614963565b91611c358351613901565b905f905f5b8551811015611cb8576001600160a01b03611c558288613807565b5116825f52600d60205260405f2060018060a01b0382165f5260205260405f205415801590611ca6575b611c8d575b50600101611c3a565b83611c9f916111796001949688613807565b9290611c84565b50611cb181876136c1565b1515611c7f565b5050611cc381613901565b915f5b828110611ce3576040516020808252819061050090820187613421565b6001906001600160a01b03611cf88285613807565b5116611d048287613807565b5201611cc6565b3461041357604036600319011261041357611d2461340b565b6004355f525f60205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610413575f366003190112610413576009546040516001600160a01b039091168152602090f35b34610413576020366003190112610413576001600160a01b03611d9c6133f5565b16801561063a575f52600b6020526040805f2060208251611dbc81613627565b60018354938483520154918291015282519182526020820152f35b34610413575f36600319011261041357602060ff600454166040519015158152f35b61351e565b34610413576020366003190112610413576001600160a01b03611e1f6133f5565b16801561063a575f52600b60205260208060405f20600160405191611e4383613627565b80548352015491829101528015159081611e63575b506040519015158152f35b905042101582611e58565b34610413575f36600319011261041357602060405168056bc75e2d631000008152f35b34610413575f366003190112610413576020600654604051908152f35b3461041357602036600319011261041357335f9081525f516020614c085f395f51905f5260205260409020546004359060ff1615610eac5762093a8081108015611f3f575b611f305760407f98eaabfe135a9c40c420208962bf81e7926b4d6df3e23502164c0554b7b3522491600254908060025582519182526020820152a1005b631a3c1dd960e01b5f5260045ffd5b5062278d008111611ef3565b34610413575f36600319011261041357602060405162278d008152f35b34610413575f366003190112610413576020600254604051908152f35b3461041357604036600319011261041357611f9e6133f5565b611fa661340b565b6001600160a01b039182165f908152601160209081526040808320949093168252928352819020549051908152f35b3461041357602036600319011261041357335f9081525f516020614c085f395f51905f5260205260409020546004359060ff1615610eac576064811161204e5760407f8d8b447dd32d163ee230b6e4257521e7f946aba0a3f4e5fa4a952f952f58e03e91600354908060035582519182526020820152a1005b63bacfbcdf60e01b5f5260045ffd5b34610413575f366003190112610413575f600654600754601654905f5b81811061209d575092608093604051938452602084015260408301526060820152f35b6120a681614784565b60018060a01b0391549060031b1c165f52600a60205269021e19e0c9bab240000060405f205410156120db575b60010161207a565b936120e7600191613933565b9490506120d3565b34610413575f3660031901126104135760206040517fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758152f35b34610413576020366003190112610413576001600160a01b0361214a6133f5565b16801561063a57604051601354808252816020810160135f5260205f20925f5b81811061229957505061217f92500382613656565b5f5f5b82518110156121df575f8481526012602052604090206001600160a01b036121aa8386613807565b511660018060a01b03165f5260205260405f20546121cb575b600101612182565b906121d7600191613933565b9190506121c3565b50906121f36121ed83613901565b92613901565b905f905f5b815181101561227d575f8681526012602052604090206001600160a01b036122208385613807565b511660018060a01b03165f5260205260405f205480612243575b506001016121f8565b909260019161227691906001600160a01b0361225f8787613807565b511661226b838a613807565b526111798288613807565b929061223a565b610dac8561050086604051938493604085526040850190613421565b845483526001948501948694506020909301920161216a565b34610413575f366003190112610413576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346104135760403660031901126104135760043580151580910361041357335f9081525f516020614c085f395f51905f5260205260409020546024359060ff1615610eac5760648111612388577f53d795ef7075af39231a14c1325aca259eda26ab76c19c025423847786baed9a9160409160ff196004541660ff8316176004558060055582519182526020820152a1005b63406b11a560e01b5f5260045ffd5b34610413576020366003190112610413576004356001600160401b038111610413576123c7903690600401613478565b906123d182613901565b916123db81613901565b6123e482613901565b906123ee836138ea565b926123fc6040519485613656565b808452612408816138ea565b602085019590601f19013687375f5b82811061249957612442888888602061245d8a61244f8b60405198899860808a5260808a01906134eb565b90888203868a01526134eb565b9086820360408801526134eb565b91848303606086015251918281520191905f5b81811061247e575050500390f35b82511515845285945060209384019390920191600101612470565b6001906001600160a01b036124b26107058387876138c6565b16806124c0575b5001612417565b805f52600a60205260405f20546124d7838c613807565b52805f52600b60205260405f20604051906124f182613627565b6020858254928385520154920191825261250b8489613807565b52516125178389613807565b525f52600a60205269021e19e0c9bab240000060405f2054101561253b8289613807565b52896124b9565b346104135760203660031901126104135761255b6133f5565b335f9081525f516020614c085f395f51905f52602052604090205460ff1615610eac576001600160a01b03811690811561063a575f516020614c685f395f51905f525f9081526020527fc36282328fcdfb3ab7b55ebd970e39b3777a8c58b872e64ea8cf6803645f57b1546125d991906125d490613f6d565b613fa5565b5033907f500df928303c0adc716494880ad758fdf52c3ed75ff8882077eb0e321c8352295f80a3005b3461041357612610366134a8565b91612619613c13565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165f5b8481106127505750506001600160a01b038116801561063a5783156107f257803314158061272b575b610eac575f5b8481106126815760018055005b8061269261070560019388886138c6565b835f52601260205260405f20838060a01b0382165f526020528360405f205491826126c1575b50505001612674565b815f52601260205260405f20858060a01b0382165f526020525f60408120556126eb8388836143f5565b156126b85760207fb05058dfc723d88dcb59f0e9761aa7d1b33f24b1d241f6a37feffc9fbd62ecf391604051948552868060a01b031693a38683816126b8565b50335f9081525f516020614c085f395f51905f52602052604090205460ff161561266e565b61275e6107058287876138c6565b60405163b5af090f60e01b81526001600160a01b039091166004820152602081602481865afa908115610624575f916127a0575b501561085157600101612645565b6127b8915060203d8111610887576108798183613656565b86612792565b34610413576060366003190112610413576127d76133f5565b6127df61340b565b335f9081525f516020614c085f395f51905f526020526040902054604435929060ff1615610eac5761280f613c13565b6001600160a01b03169081158015612a48575b61063a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214610eac5760405163b5af090f60e01b8152600481018390526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610624575f91612a29575b5015610851576040516370a0823160e01b815230600482015292602084602481865afa938415610624575f946129f5575b5083156119495780159081156129f05750835b8094808211611949575f600754905f915b8083106129ad575061291f9150865f52600f60205260405f205490613606565b808211156129a457612930916136a1565b915b158061299c575b610eac578110612994575b50821561194957612956838284613f31565b6040519283526001600160a01b03169133907fd298cad46c8580338c7cba085f8629f86c44677918478ad7e14c646bc1017cd790602090a460018055005b925083612944565b508115612939565b50505f91612932565b906129e76001916129bd85614784565b848060a01b0391549060031b1c165f52600d60205260405f208a5f5260205260405f205490613606565b920191906128ff565b6128ee565b9093506020813d602011612a21575b81612a1160209383613656565b81010312610413575192846128db565b3d9150612a04565b612a42915060203d602011610887576108798183613656565b846128aa565b506001600160a01b03811615612822565b34610413576020366003190112610413576001600160a01b03612a7a6133f5565b16801561063a575f52600a602052602069021e19e0c9bab240000060405f20541015604051908152f35b34610413576020366003190112610413576020611990612ac26133f5565b61381b565b34610413576020366003190112610413576001600160a01b03612ae86133f5565b16801561063a575f52600a602052602060405f2054604051908152f35b34610413575f36600319011261041357612b1d613c13565b612b2633613c33565b335f52600b60205260405f20600160405191612b4183613627565b8054835201548060208301528015908115612bf3575b506110b35751335f52600b6020525f6001604082208281550155335f52600a60205260405f205415612be4575b335f52600a60205260405f20612b9b828254613606565b9055612ba981600654613606565b6006556040519081524260208201527fc821fa08badfef20dbf5b0f0f070d76e8ca75e8ea32979032c91dae520691e2c60403392a260018055005b612bed336147b1565b50612b84565b905042101582612b57565b34610413575f366003190112610413576020600554604051908152f35b3461041357602036600319011261041357612c346133f5565b335f9081525f516020614c085f395f51905f52602052604090205460ff1615610eac576001600160a01b03811690811561063a575f516020614c685f395f51905f525f9081526020527fc36282328fcdfb3ab7b55ebd970e39b3777a8c58b872e64ea8cf6803645f57b154612cb29190612cad90613f6d565b614198565b5033907fc77c7df0a00c07e9fadd08c50c0d39c6bfdaadca32ea0c59a59ae041edafd0c25f80a3005b3461041357604036600319011261041357612cf461340b565b336001600160a01b03821603612d1057610bfe90600435614316565b63334bd91960e11b5f5260045ffd5b3461041357602036600319011261041357612d386133f5565b6001600160a01b03165f9081525f516020614c885f395f51905f52602090815260409182902054915160ff9092161515825290f35b3461041357604036600319011261041357610bfe600435612d8c61340b565b90612da56110ff825f525f602052600160405f20015490565b614129565b34610413575f36600319011261041357612dc2613c13565b612dcb33613c33565b335f52600b60205260405f20600160405191612de683613627565b8054835201546020820190808252156110b357514210612e885751335f52600b6020525f6001604082208281550155612e1e33613ec4565b612e4982337f0000000000000000000000000000000000000000000000000000000000000000613f31565b604051918252426020830152151560408201527f6c42d2bb36ad42ac675a97c8627d2cd9e34346d5057bbc3a6ed3c5d1f0a8219b60603392a260018055005b633ce33ddb60e01b5f5260045ffd5b346104135760203660031901126104135760043563ffffffff60e01b811680910361041357335f9081525f516020614c085f395f51905f52602052604090205460ff1615610eac5763534a7e1d60e11b81141580612f61575b80612f50575b80612f3f575b610eac57805f52600c60205260405f20600160ff1982541617905533907f37cf9c7afb089036a9b0b180050ebd47f0fb1d71ed1e4e30271b667d420d66bc5f80a3005b50630d3db67360e01b811415612efc565b5063c114c2e760e01b811415612ef6565b5063f45464ad60e01b811415612ef0565b61345d565b34610413576020366003190112610413576020610c236004355f525f602052600160405f20015490565b34610413576040366003190112610413576020610c23612fbf6133f5565b612fc761340b565b906136c1565b34610413575f3660031901126104135760206040515f516020614c685f395f51905f528152f35b346104135760403660031901126104135761300d6133f5565b61301561340b565b6001600160a01b039182165f908152601260209081526040808320949093168252928352819020549051908152f35b34610413575f3660031901126104135761050061305f614963565b604051918291602083526020830190613421565b34610413576020366003190112610413576001600160a01b036130946133f5565b165f52600a602052602060405f2054604051908152f35b346104135760203660031901126104135760043563ffffffff60e01b8116809103610413575f52600c602052602060ff60405f2054166040519015158152f35b34610413576040366003190112610413576131046133f5565b60243561310f613c13565b335f9081525f516020614c085f395f51905f52602052604090205460ff1615806132a5575b610eac57630d3db67360e01b5f52600c6020527ff7860ff7783007ee83e25e43231044a51ce46036c3e8a4cd4d2105e6554b3eda5460ff16610bce576001600160a01b03821691821561063a5781156119495768056bc75e2d631000008210611949576131a081613c33565b825f52600b602052600160405f2001544210613296575b50815f52600a60205260405f205415613287575b815f52600a60205260405f206131e2828254613606565b90556131f081600654613606565b60065561321f8130337f0000000000000000000000000000000000000000000000000000000000000000613d45565b817f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee9060408051848152426020820152a26040519081524260208201527f6032150a407bcbcf18560b09ac0f3f7a5d570c19bcee2b089f92df2cdea76d4d60403392a360018055005b613290826147b1565b506131cb565b61329f90613c73565b826131b7565b50335f9081525f516020614c285f395f51905f52602052604090205460ff1615613134565b346104135760203660031901126104135760043563ffffffff60e01b811680910361041357335f9081525f516020614c085f395f51905f52602052604090205460ff1615610eac5763534a7e1d60e11b81141580613391575b80613380575b8061336f575b610eac57805f52600c60205260405f2060ff19815416905533907f1a1b94b44f657b334b61a599f62cdf62aeae8e61435e97db3fd4e78ba458cba65f80a3005b50630d3db67360e01b81141561332f565b5063c114c2e760e01b811415613329565b5063f45464ad60e01b811415613323565b34610413576020366003190112610413576004359063ffffffff60e01b821680920361041357602091637965db0b60e01b81149081156133e4575b5015158152f35b6301ffc9a760e01b149050836133dd565b600435906001600160a01b038216820361041357565b602435906001600160a01b038216820361041357565b90602080835192838152019201905f5b81811061343e5750505090565b82516001600160a01b0316845260209384019390920191600101613431565b34610413575f36600319011261041357602060405160648152f35b9181601f84011215610413578235916001600160401b038311610413576020808501948460051b01011161041357565b906040600319830112610413576004356001600160a01b03811681036104135791602435906001600160401b038211610413576134e791600401613478565b9091565b90602080835192838152019201905f5b8181106135085750505090565b82518452602093840193909201916001016134fb565b34610413576040366003190112610413576135376133f5565b61353f61340b565b6001600160a01b0382169182158015613583575b61063a5761142b610c23926020945f52600d855260405f2060018060a01b0382165f52855260405f2054926136c1565b506001600160a01b03821615613553565b34610413575f366003190112610413576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b939291613601906135f3604093606088526060880190613421565b9086820360208801526134eb565b930152565b9190820180921161361357565b634e487b7160e01b5f52601160045260245ffd5b604081019081106001600160401b0382111761364257604052565b634e487b7160e01b5f52604160045260245ffd5b90601f801991011681019081106001600160401b0382111761364257604052565b90816020910312610413575160ff811681036104135790565b60ff16604d811161361357600a0a90565b9190820391821161361357565b8181029291811591840414171561361357565b6001600160a01b0382165f8181526018602052604090205461375393929091821561375d575b9061374761374d92670de0b6b3a764000085105f1461375657670de0b6b3a7640000925b60018060a01b031690815f52600a60205261372a60405f205497613b3b565b915f52601160205260405f20905f5260205260405f2054906136a1565b926136ae565b91613e11565b90565b849261370b565b60405163313ce56760e01b8152909250602081600481865afa5f91816137d6575b5061379f575061374d90613747670de0b6b3a7640000935b919250506136e7565b6137a890613690565b90670de0b6b3a764000082116137c6575b61374761374d9293613796565b670de0b6b3a764000091506137b9565b6137f991925060203d602011613800575b6137f18183613656565b810190613677565b905f61377e565b503d6137e7565b80518210156114ed5760209160051b010190565b6001600160a01b03811690811561063a57613834614963565b915f5b83518110156138a6576001600160a01b036138528286613807565b5116825f52600d60205260405f2060018060a01b0382165f5260205260405f20541590811591613893575b5061388a57600101613837565b50505050600190565b61389e9150846136c1565b15155f61387d565b505050505f90565b90816020910312610413575180151581036104135790565b91908110156114ed5760051b0190565b356001600160a01b03811681036104135790565b6001600160401b0381116136425760051b60200190565b9061390b826138ea565b6139186040519182613656565b8281528092613929601f19916138ea565b0190602036910137565b5f1981146136135760010190565b6001600160a01b038116156139ad576001600160a01b0381165f9081525f516020614c085f395f51905f52602052604090205460ff16908115613982575090565b6001600160a01b03165f9081525f516020614c285f395f51905f52602052604090205460ff16919050565b505f90565b916020908281520191905f905b8082106139cc5750505090565b91929091908335906001600160a01b0382168203610413576001600160a01b0390911681526020908101930191600101906139bf565b81835290916001600160fb1b0383116104135760209260051b809284830137010190565b303303610eac576001600160a01b0381168015613b3757613a4682613c33565b805f52601560205260405f2091604051928381549182825260208201905f5260205f20925f5b818110613b1e575050613a8192500384613656565b5f5b8351811015613b18576001906001600160a01b03613aa18287613807565b5116845f52600d60205260405f20838060a01b0382165f5260205260405f20548481613ad1575b50505001613a83565b613b0f92875f52600d60205260405f20868060a01b0382165f526020525f6040812055875f526015602052613b098160405f20614b3e565b506143f5565b505f8084613ac8565b50505050565b8454835260019485019488945060209093019201613a6c565b5050565b60065415613b5d576001600160a01b03165f9081526010602052604090205490565b6001600160a01b03165f9081526010602052604090205490565b6001600160a01b03811690811561063a57335f9081525f516020614c885f395f51905f52602052604090205460ff1615610eac57338214613b3757600980546001600160a01b03191683179055613bd790613bd181614025565b50614096565b50613be133614216565b50613beb33614285565b50337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3565b600260015414613c24576002600155565b633ee5aeb560e01b5f5260045ffd5b90613c3c614963565b5f5b8151811015613c6d57600190613c676001600160a01b03613c5f8386613807565b5116866146e3565b01613c3e565b50509050565b6001600160a01b03168015613d4257805f52600b60205260405f20600160405191613c9d83613627565b805483520154806020830152613cb1575050565b60407fc821fa08badfef20dbf5b0f0f070d76e8ca75e8ea32979032c91dae520691e2c91835f52600b6020525f60018382208281550155835f52600a602052815f205415613d33575b8051845f52600a602052613d12835f20918254613606565b9055613d218151600654613606565b600655518151908152426020820152a2565b613d3c846147b1565b50613cfa565b50565b6040516323b872dd60e01b60208201526001600160a01b039283166024820152929091166044830152606480830193909352918152613d8e91613d89608483613656565b61490b565b565b9091905f905f198482099084810292838084109303928084039314613e05578260641115613df357507f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c2993946064910990828211900360fe1b910360021c170290565b634e487b71905260116020526024601cfd5b50505060649192500490565b90915f198383099280830292838086109503948086039514613ea25784831115613e8a5790829109815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b82634e487b715f52156003026011186020526024601cfd5b505091508115613eb0570490565b634e487b7160e01b5f52601260045260245ffd5b5f906001600160a01b03168015613f2b575a60021c90303b15610413575f916024839260405194859384926334aedd0b60e21b845260048401523090f19081613f16575b50613f105790565b50600190565b613f239192505f90613656565b5f905f613f08565b50505f90565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152613d8e91613d89606483613656565b5f8181526020818152604080832033845290915290205460ff1615613f8f5750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f516020614c285f395f51905f52602052604090205460ff166139ad576001600160a01b03165f8181525f516020614c285f395f51905f5260205260408120805460ff191660011790553391905f516020614c685f395f51905f52905f516020614be85f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614c885f395f51905f52602052604090205460ff166139ad576001600160a01b03165f8181525f516020614c885f395f51905f5260205260408120805460ff191660011790553391905f516020614be85f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020614c085f395f51905f52602052604090205460ff166139ad576001600160a01b03165f8181525f516020614c085f395f51905f5260205260408120805460ff191660011790553391907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775905f516020614be85f395f51905f529080a4600190565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16613f2b575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f516020614be85f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614c285f395f51905f52602052604090205460ff16156139ad576001600160a01b03165f8181525f516020614c285f395f51905f5260205260408120805460ff191690553391905f516020614c685f395f51905f52905f516020614c485f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020614c885f395f51905f52602052604090205460ff16156139ad576001600160a01b03165f8181525f516020614c885f395f51905f5260205260408120805460ff191690553391905f516020614c485f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020614c085f395f51905f52602052604090205460ff16156139ad576001600160a01b03165f8181525f516020614c085f395f51905f5260205260408120805460ff191690553391907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775905f516020614c485f395f51905f529080a4600190565b5f818152602081815260408083206001600160a01b038616845290915290205460ff1615613f2b575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291905f516020614c485f395f51905f529080a4600190565b5f60443d10613753576040513d600319016004823e8051913d60248401116001600160401b038411176143ef57828201928351916001600160401b0383116143e7573d840160031901858401602001116143e7575061375392910160200190613656565b949350505050565b92915050565b916001600160a01b03831680158015614580575b6138a657811561388a5760405163a9059cbb60e01b81526001600160a01b03841660048201526024810183905290602090829060449082905f905af15f918161455f575b5061451057505f60033d11614500575b6308c379a0146144e2575b3d156144d9573d926001600160401b038411613642576040516144d594614499601f8201601f191660200183613656565b81525f60203d92013e5b604051926144b2604085613656565b6011845270151c985b9cd9995c881c995d995c9d1959607a1b60208501526149ab565b5f90565b6144d5926144a3565b6144ea614383565b806144f55750614468565b91926144d5936149ab565b5060045f803e5f5160e01c61445d565b1561451d57505050600190565b6144d59260405192614530604085613656565b601784527f5472616e736665722072657475726e65642066616c736500000000000000000060208501526149ab565b61457991925060203d602011610887576108798183613656565b905f61444d565b506001600160a01b03831615614409565b6001600160a01b03165f81815260186020526040902054156145b05750565b60405163313ce56760e01b8152602081600481855afa5f9181614623575b506145eb57505f526018602052670de0b6b3a764000060405f2055565b6145f490613690565b90670de0b6b3a76400008211614613575b5f52601860205260405f2055565b670de0b6b3a76400009150614605565b61463d91925060203d602011613800576137f18183613656565b905f6145ce565b92919281156146af57670de0b6b3a76400008411614690576146846137539394670de0b6b3a764000081105f1461468a57670de0b6b3a7640000906136ae565b90613e11565b806136ae565b8363efd7050560e01b5f52600452670de0b6b3a764000060245260445ffd5b633b87189b60e11b5f5260045ffd5b606482116146d0579061375391613d90565b5063aa31867360e01b5f5260045260245ffd5b906146ee81836136c1565b80614727575b506146fe81613b3b565b9160018060a01b03165f52601160205260405f209060018060a01b03165f5260205260405f2055565b60018060a01b03831690815f52600d60205260405f2060018060a01b0384165f5260205261475a60405f20918254613606565b90555f90815260156020526040902061477d906001600160a01b038316906148b7565b505f6146f4565b6007548110156114ed5760075f5260205f2001905f90565b80548210156114ed575f5260205f2001905f90565b805f52600860205260405f2054155f146139ad57600754600160401b811015613642576148006147ea826001859401600755600761479c565b819391549060031b91821b915f19901b19161790565b9055600754905f52600860205260405f2055600190565b805f52601760205260405f2054155f146139ad57601654600160401b811015613642576148506147ea826001859401601655601661479c565b9055601654905f52601760205260405f2055600190565b805f52601460205260405f2054155f146139ad57601354600160401b811015613642576148a06147ea826001859401601355601361479c565b9055601354905f52601460205260405f2055600190565b6001810190825f528160205260405f2054155f14614904578054600160401b811015613642576148f16147ea82600187940185558461479c565b905554915f5260205260405f2055600190565b5050505f90565b905f602091828151910182855af115610624575f513d61495a57506001600160a01b0381163b155b61493a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b60011415614933565b60405190601654808352826020810160165f5260205f20925f5b818110614992575050613d8e92500383613656565b845483526001948501948794506020909301920161497d565b91926001600160a01b039092169182158015614a6e575b8015614a66575b613b185760607f73719fb71883f6f04e7163e349b0d5cca744c1e02d5f0a4c8bc8f5f1a1f6796592845f52601260205260405f2060018060a01b0382165f5260205260405f20614a1a878254613606565b90556001600160a01b031694614a2f86614867565b50602060405193849283526040828401528051918291826040860152018484015e5f828201840152601f01601f19168101030190a3565b5083156149c9565b506001600160a01b038216156149c2565b5f818152600860205260409020548015613f2b575f198101818111613613576007545f1981019190821161361357818103614b06575b5050506007548015614af2575f1901614acf81600761479c565b8154905f199060031b1b191690556007555f5260086020525f6040812055600190565b634e487b7160e01b5f52603160045260245ffd5b614b28614b176147ea93600761479c565b90549060031b1c928392600761479c565b90555f52600860205260405f20555f8080614ab5565b906001820191815f528260205260405f20548015155f146138a6575f1981018181116136135782545f1981019190821161361357818103614bb2575b50505080548015614af2575f190190614b93828261479c565b8154905f199060031b1b19169055555f526020525f6040812055600190565b614bd2614bc26147ea938661479c565b90549060031b1c9283928661479c565b90555f528360205260405f20555f8080614b7a56fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d7d7ffb7a348e1c6a02869081a26547b49160dd3df72d1d75a570eb9b698292ecc36282328fcdfb3ab7b55ebd970e39b3777a8c58b872e64ea8cf6803645f57b0f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b3a2f235c9daaf33349d300aadff2f15078a89df81bcfdd45ba11c8f816bddc6fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5a264697066735822122006db44520d3af77ea470d44ee1cda0919a63712c885e7d898a30c1ae9833f32364736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d7d7ffb7a348e1c6a02869081a26547b49160dd3df72d1d75a570eb9b698292ecad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb50000000000000000000000008e665c3a3622d7c1bef8ed8ffd7317d3f6318e31000000000000000000000000719b3215c1041b8b7a2b33ae2744e01ecfa8932a000000000000000000000000ac3d4fb94430498f6a1d61f3237f86be498e8a3600000000000000000000000000921726681d22706be0e377770b66a4f7f55d7c