71 txs
44 calls
constructor
constructor(address _migoldToken, address _botWallet, address _admin, address _backendSigner)
functions
activeChallenges
viewfunction activeChallenges() view returns (uint256)
activeTournaments
viewfunction activeTournaments() view returns (uint256)
ADMIN_ROLE
viewfunction ADMIN_ROLE() view returns (bytes32)
backendSigner
viewfunction backendSigner() view returns (address)
BOT_ROLE
viewfunction BOT_ROLE() view returns (bytes32)
cancellationFeeBps
viewfunction cancellationFeeBps() view returns (uint256)
challengeFeeBps
viewfunction challengeFeeBps() view returns (uint256)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getChallengeStats
viewfunction getChallengeStats(string challengeId) view returns (bool exists, uint256 wagerCount, uint256 totalWagered, uint256 totalDistributed, bool completed)
getPlayerWager
viewfunction getPlayerWager(string challengeId, address player) view returns (bool hasWagered, uint256 amount, uint256 timestamp)
getPotentialWinnings
viewfunction getPotentialWinnings(uint256 wagerAmount) view returns (uint256 feeAmount, uint256 winningAmount)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getSystemStats
viewfunction getSystemStats() view returns (uint256 migoldBalance, uint256 ethBalance, uint256 numUniquePlayers, uint256 totalTournamentsCount, uint256 activeTournamentsCount, uint256 totalChallengesCount, uint256 activeChallengesCount, uint256 totalMigoldIn, uint256 totalMigoldOut, uint256 totalEthIn, uint256 totalEthOut, uint256 totalFees, uint256 currentFeeRate)
getTournamentInfo
viewfunction getTournamentInfo(string tournamentId) view returns (tuple)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isBotWallet
viewfunction isBotWallet(address wallet) view returns (bool)
isCloakRegistered
viewfunction isCloakRegistered(string tournamentId, uint256 cloakId) view returns (bool)
isNonceUsed
viewfunction isNonceUsed(bytes32 nonce) view returns (bool)
isPlayerRefunded
viewfunction isPlayerRefunded(string tournamentId, address player, uint256 cloakId) view returns (bool)
isPlayerRegistered
viewfunction isPlayerRegistered(string tournamentId, address player) view returns (bool isRegistered, uint256 amount, uint256 timestamp)
migoldToken
viewfunction migoldToken() view returns (address)
paused
viewfunction paused() view returns (bool)
processedChallenges
viewfunction processedChallenges(string) view returns (bool)
processedTournaments
viewfunction processedTournaments(string) view returns (bool)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
totalChallenges
viewfunction totalChallenges() view returns (uint256)
totalEthCollected
viewfunction totalEthCollected() view returns (uint256)
totalEthDistributed
viewfunction totalEthDistributed() view returns (uint256)
totalFeesCollected
viewfunction totalFeesCollected() view returns (uint256)
totalMigoldCollected
viewfunction totalMigoldCollected() view returns (uint256)
totalMigoldDistributed
viewfunction totalMigoldDistributed() view returns (uint256)
totalTournaments
viewfunction totalTournaments() view returns (uint256)
totalUniqueParticipants
viewfunction totalUniqueParticipants() view returns (uint256)
usedNonces
viewfunction usedNonces(bytes32) view returns (bool)
addBotWallet
nonpayablefunction addBotWallet(address newBotWallet)
adminWithdraw
nonpayablefunction adminWithdraw(address token, address to, uint256 amount)
batchWithdrawTournamentEthRewards
nonpayablefunction batchWithdrawTournamentEthRewards(string tournamentId, address[] recipients, uint256[] cloakIds, uint256[] positions, uint256[] amounts)
batchWithdrawTournamentRewards
nonpayablefunction batchWithdrawTournamentRewards(string tournamentId, address[] recipients, uint256[] cloakIds, uint256[] positions, uint256[] amounts)
createTournament
nonpayablefunction createTournament(string tournamentId, uint256 entryFee, uint256 maxParticipants)
depositChallengeEthWager
payablefunction depositChallengeEthWager(string challengeId, uint256 cloakId, address player, bytes signature, bytes32 nonce, uint256 expiry) payable
depositChallengeWager
nonpayablefunction depositChallengeWager(string challengeId, uint256 cloakId, uint256 amount, address player, bytes signature, bytes32 nonce, uint256 expiry)
depositTournamentEth
payablefunction depositTournamentEth(string tournamentId, uint256 cloakId) payable
depositTournamentFee
nonpayablefunction depositTournamentFee(string tournamentId, uint256 cloakId, uint256 amount, address player, bytes signature, bytes32 nonce, uint256 expiry)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
markChallengeProcessed
nonpayablefunction markChallengeProcessed(string challengeId)
markTournamentProcessed
nonpayablefunction markTournamentProcessed(string tournamentId)
pause
nonpayablefunction pause()
refundChallengeWager
nonpayablefunction refundChallengeWager(string challengeId, address recipient, uint256 cloakId, uint256 amount)
refundTournamentEntries
nonpayablefunction refundTournamentEntries(string tournamentId, address[] recipients, uint256[] cloakIds, uint256[] amounts)
removeBotWallet
nonpayablefunction removeBotWallet(address botWallet)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address account)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
unpause
nonpayablefunction unpause()
updateBackendSigner
nonpayablefunction updateBackendSigner(address newSigner)
updateCancellationFee
nonpayablefunction updateCancellationFee(uint256 newFeeBps)
updateChallengeFee
nonpayablefunction updateChallengeFee(uint256 newFeeBps)
withdrawChallengeEthReward
nonpayablefunction withdrawChallengeEthReward(string challengeId, address recipient, uint256 cloakId, uint256 amount)
withdrawChallengeReward
nonpayablefunction withdrawChallengeReward(string challengeId, address recipient, uint256 cloakId, uint256 amount)
withdrawFees
nonpayablefunction withdrawFees(uint256 amount)
withdrawTournamentEthReward
nonpayablefunction withdrawTournamentEthReward(string tournamentId, address recipient, uint256 cloakId, uint256 position, uint256 amount)
withdrawTournamentReward
nonpayablefunction withdrawTournamentReward(string tournamentId, address recipient, uint256 cloakId, uint256 position, uint256 amount)
events
AdminWithdrawal
event AdminWithdrawal(address token, address to, uint256 amount)
BackendSignerUpdated
event BackendSignerUpdated(address oldSigner, address newSigner)
ChallengeResultWithdrawn
event ChallengeResultWithdrawn(string indexed challengeId, address indexed recipient, uint256 cloakId, bool isWinner, uint256 amount, uint8 currency)
ChallengeWagerDeposited
event ChallengeWagerDeposited(string indexed challengeId, address indexed player, uint256 cloakId, uint256 amount, uint8 currency, address payer)
FeesWithdrawn
event FeesWithdrawn(uint256 amount)
FeeUpdated
event FeeUpdated(uint256 newFeeBps)
ParticipantAdded
event ParticipantAdded(address participant)
Paused
event Paused(address account)
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)
TournamentCancelled
event TournamentCancelled(string indexed tournamentId, uint256 refundCount, uint256 totalRefunded, uint256 totalFeesCollected)
TournamentCreated
event TournamentCreated(string indexed tournamentId, uint256 entryFee, uint256 maxParticipants, uint256 timestamp)
TournamentEntryRefunded
event TournamentEntryRefunded(string indexed tournamentId, address indexed player, uint256 cloakId, uint256 refundAmount, uint8 currency)
TournamentFeeDeposited
event TournamentFeeDeposited(string indexed tournamentId, address indexed player, uint256 cloakId, uint256 amount, uint8 currency, address payer)
TournamentRewardWithdrawn
event TournamentRewardWithdrawn(string indexed tournamentId, address indexed recipient, uint256 cloakId, uint256 position, uint256 amount, uint8 currency)
TournamentStatusChanged
event TournamentStatusChanged(string indexed tournamentId, uint8 newStatus)
Unpaused
event Unpaused(address account)
errors
No errors.
creation bytecode
0x6080604052346200003457620000226200001862000105565b929190916200024f565b604051615c51620004a28239615c5190f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200007157604052565b62000039565b906200008e6200008660405190565b92836200004f565b565b6001600160a01b031690565b90565b6001600160a01b038116036200003457565b905051906200008e826200009f565b6080818303126200003457620000d78282620000b1565b926200009c620000eb8460208501620000b1565b93620000fb8160408601620000b1565b93606001620000b1565b62000128620060f3803803806200011c8162000077565b928339810190620000c0565b90919293565b90600019905b9181191691161790565b6200009c6200009c6200009c9290565b90620001626200009c6200016a926200013e565b82546200012e565b9055565b620000906200009c6200009c9290565b6200009c906200016e565b156200019157565b60405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606490fd5b6200009c9062000090906001600160a01b031682565b6200009c90620001bb565b6200009c90620001d1565b90610100600160a81b039060081b62000134565b906200020f6200009c6200016a92620001dc565b8254620001e7565b906001600160a01b039062000134565b906200023b6200009c6200016a92620001dc565b825462000217565b6200009c60006200013e565b91620003156200008e946200030d62000305620003519596620002716200039d565b6200027f60c860056200014e565b6200028d606460066200014e565b620002ff620002b0620002a160006200017e565b620002c36001600160a01b0382165b6001600160a01b0386165b141562000189565b620002e16001600160a01b0382166001600160a01b038d16620002bb565b620000906001600160a01b0382166001600160a01b038b16620002bb565b620001dc565b6002620001fb565b600362000227565b6200032a816200032462000243565b620003f3565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775620003f3565b7f6d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9b620003f3565b9060ff9062000134565b90620003956200009c6200016a92151590565b825462000378565b620003a7620003c1565b6200008e6000600262000382565b6200009c60016200013e565b6200008e620003cf620003b5565b60016200014e565b905b600052602052604060002090565b90620003d990620001dc565b906200040862000404828462000482565b1590565b62000411575050565b620004376001620004318360006200042a8782620003d7565b01620003e7565b62000382565b3390620004716200046a6200046a7f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9590565b92620001dc565b926200047c60405190565b600090a4565b6200009c916200049a916200042a60009182620003d7565b5460ff169056fe60e0604052600436101561001b575b361561001957600080fd5b005b60003560e01c80621f119c146103ea57806301ffc9a7146103e557806302a71bde146103e057806302b98de5146103db5780630305caff146103d65780630728d1ce146103d1578063079e4100146103cc5780631aefa2d1146103c75780631f9119b0146103c257806320dc59d5146103bd578063248a9ca3146103b85780632a360631146103b35780632b1810b6146103ae5780632b86b179146103a95780632cedf7ce146103a45780632d4161e31461039f5780632f2ff15d1461039a57806336568abe146103955780633c2511ef146103905780633e09cae61461038b5780633f4ba83a1461038657806346be4cb5146103815780635c975abb1461037c5780635e1e62f3146103775780635e318e07146103725780635f9f4b9c1461036d57806360c6d8ae1461036857806365d65e861461036357806369ec56a11461035e5780637090b9041461035957806371da27ab1461035457806375b238fc1461034f57806377ab4d921461034a5780637a34a78f146103455780638456cb59146103405780638507f6031461033b578063898cdb861461033657806391d1485414610331578063951bcf3f1461032c5780639530568314610327578063a217fddf14610322578063a60ea5001461031d578063a638c61414610318578063ab11adb714610313578063b15037741461030e578063b646c02514610309578063b90665e514610304578063b9acc07f146102ff578063c480b9c2146102fa578063c6846132146102f5578063c8ca14c1146102f0578063cc3916aa146102eb578063ce2a9f62146102e6578063d0bec600146102e1578063d17defcb146102dc578063d1ce59a7146102d7578063d547741f146102d2578063e8230eec146102cd578063e8683589146102c8578063ec1ff049146102c35763feb617240361000e5761153a565b6114f3565b6114d7565b6114a5565b61144e565b611411565b611394565b611361565b6112fb565b6112d3565b6112bb565b6112a0565b611266565b611234565b611219565b6111fe565b6111cb565b6111b0565b611189565b611158565b611100565b6110c6565b6110a1565b611085565b61106d565b611052565b61103a565b61101d565b610f78565b610ec5565b610eb1565b610e60565b610e45565b610e03565b610dbd565b610d96565b610d72565b610d4a565b610c69565b610c4d565b610bf8565b610bdc565b610bc3565b610b85565b610b6c565b610b2e565b610b07565b610953565b610925565b61090d565b6108f2565b6108d3565b61085b565b610813565b6107da565b6106cf565b61065e565b610628565b61056b565b610511565b6104b7565b909182601f8301121561041e578135916001600160401b03831161041e57602001926001830284011161041e57565b600080fd5b6001600160a01b031690565b90565b6001600160a01b0381165b0361041e57565b9050359061045182610432565b565b8061043d565b9050359061045182610453565b9060808282031261041e5781356001600160401b03811161041e578161048d9184016103ef565b92909361042f6104a08460208501610444565b936104ae8160408601610459565b93606001610459565b3461041e576104d36104ca366004610466565b93929092614ce7565b604051005b0390f35b6001600160e01b0319811661043d565b90503590610451826104dc565b9060208282031261041e5761042f916104ec565b9052565b3461041e576104d861052c6105273660046104f9565b611555565b60405191829182901515815260200190565b600091031261041e57565b61042f916008021c81565b9061042f9154610549565b61042f6000600b610554565b3461041e5761057b36600461053e565b6104d861058661055f565b6040515b9182918290815260200190565b919060e08382031261041e5782356001600160401b03811161041e57816105bf9185016103ef565b9290936105cf8360208301610459565b926105dd8160408401610459565b926105eb8260608501610444565b926080810135916001600160401b03831161041e5761060f8461042f9484016103ef565b93909461061f8160a08601610459565b9360c001610459565b3461041e576104d361063b366004610597565b979690969591959492946125bb565b9060208282031261041e5761042f91610444565b3461041e576104d361067136600461064a565b615665565b9160408383031261041e5782356001600160401b03811161041e576106a08361042f9286016103ef565b939094602001610444565b90151581526060810193926104519290916040916106cb905b6020830152565b0152565b3461041e576104d86106eb6106e5366004610676565b91615382565b604051919391938493846106ab565b909182601f8301121561041e578135916001600160401b03831161041e57602001926020830284011161041e57565b9060a08282031261041e5781356001600160401b03811161041e57816107509184016103ef565b92909360208201356001600160401b03811161041e57836107729184016106fa565b92909360408201356001600160401b03811161041e57816107949184016106fa565b92909360608201356001600160401b03811161041e57836107b69184016106fa565b92909360808201356001600160401b03811161041e576107d692016106fa565b9091565b3461041e576104d36107ed366004610729565b98979097969196959295949394613b25565b9060208282031261041e5761042f91610459565b3461041e576104d36108263660046107ff565b615752565b909160608284031261041e5761042f6108448484610444565b936108528160208601610444565b93604001610459565b3461041e576104d361086e36600461082b565b91615b1c565b9160a08383031261041e5782356001600160401b03811161041e578261089b9185016103ef565b9290936108ab8260208301610444565b9261042f6108bc8460408501610459565b936108ca8160608601610459565b93608001610459565b3461041e576104d36108e6366004610874565b94939093929192613423565b3461041e576104d86105866109083660046107ff565b6115dc565b3461041e576104d361092036600461064a565b615616565b3461041e576104d3610938366004610597565b979690969591959492946145d5565b61042f6000600f610554565b3461041e5761096336600461053e565b6104d8610586610947565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176109a557604052565b61096e565b906104516109b760405190565b9283610984565b6001600160401b0381116109a557602090601f01601f19160190565b0190565b90826000939282370152565b909291926109ff6109fa826109be565b6109aa565b9381855260208501908284011161041e57610451926109de565b9080601f8301121561041e5781602061042f933591016109ea565b9060208282031261041e5781356001600160401b03811161041e5761042f9201610a19565b60005b838110610a6c5750506000910152565b8181015183820152602001610a5c565b6109da610a9492602092610a8e815190565b94859290565b93849101610a59565b610aad6109da9160209493610a7c565b918252565b610ac7610abe60405190565b92839283610a9d565b03902090565b61042f91610ab2565b61042f916008021c5b60ff1690565b9061042f9154610ad6565b61042f90610b02601b91600092610acd565b610ae5565b3461041e576104d861052c610b1d366004610a34565b610af0565b61042f60006007610554565b3461041e57610b3e36600461053e565b6104d8610586610b22565b919060408382031261041e5761042f90610b638185610459565b93602001610444565b3461041e576104d3610b7f366004610b49565b9061161b565b3461041e576104d3610b98366004610b49565b906117f4565b9060208282031261041e5781356001600160401b03811161041e576107d692016103ef565b3461041e576104d3610bd6366004610b9e565b90615b91565b3461041e576104d86106eb610bf2366004610676565b916152ad565b3461041e57610c0836600461053e565b6104d3615913565b91909160608184031261041e578035916001600160401b03831161041e57610c3d8461042f9484016103ef565b9390946108528160208601610459565b3461041e576104d3610c60366004610c10565b92919091611ff4565b3461041e57610c7936600461053e565b6104d861052c611911565b634e487b7160e01b600052602160045260246000fd5b60031115610ca457565b610c84565b9061045182610c9a565b61042f90610ca9565b61050d90610cb3565b805115158252610451919060e0908190610ce460208201516020860152565b610cf360408201516040860152565b610d0260608201516060860152565b610d1460808201516080860190610cbc565b610d2360a082015160a0860152565b610d3260c082015160c0860152565b0151910152565b610100810192916104519190610cc5565b3461041e576104d8610d66610d60366004610b9e565b906151e6565b60405191829182610d39565b3461041e576104d3610d853660046107ff565b61586a565b61042f6000600d610554565b3461041e57610da636600461053e565b6104d8610586610d8a565b61042f60006009610554565b3461041e57610dcd36600461053e565b6104d8610586610db1565b61042f916008021c6001600160a01b031690565b9061042f9154610dd8565b61042f60006003610dec565b3461041e57610e1336600461053e565b6104d8610e1e610df7565b6040515b918291826001600160a01b03909116815260200190565b61042f60006005610554565b3461041e57610e5536600461053e565b6104d8610586610e39565b3461041e576104d3610e73366004610466565b93929092614ad5565b9160408383031261041e5782356001600160401b03811161041e57610ea68361042f9286016103ef565b939094602001610459565b6104d3610ebf366004610e7c565b91612fe0565b3461041e57610ed536600461053e565b6104d8600080516020615bdc833981519152610586565b909160808284031261041e5781356001600160401b03811161041e5783610f149184016103ef565b92909360208201356001600160401b03811161041e5781610f369184016106fa565b92909360408201356001600160401b03811161041e5783610f589184016106fa565b92909360608201356001600160401b03811161041e576107d692016106fa565b3461041e576104d3610f8b366004610eec565b9695909594919493929361416a565b909160c08284031261041e5781356001600160401b03811161041e5783610fc29184016103ef565b929093610fd28160208401610459565b92610fe08260408501610444565b926060810135916001600160401b03831161041e576110048461042f9484016103ef565b9390946110148160808601610459565b9360a001610459565b6104d361102b366004610f9a565b96959095949194939293614838565b3461041e5761104a36600461053e565b6104d3615898565b3461041e576104d861052c61106836600461064a565b6154c4565b3461041e576104d361108036600461064a565b6155c7565b3461041e576104d861052c61109b366004610b49565b906115ac565b3461041e576104d36110b4366004610b9e565b90615b57565b61042f60006006610554565b3461041e576110d636600461053e565b6104d86105866110ba565b61042f61042f61042f9290565b61042f60006110e1565b61042f6110ee565b3461041e5761111036600461053e565b6104d86105866110f8565b91909160608184031261041e578035916001600160401b03831161041e576111488461042f9484016103ef565b9390946108528160208601610444565b3461041e576104d861052c61116e36600461111b565b929190916152f2565b61042f90610b02601a91600092610acd565b3461041e576104d861052c61119f366004610a34565b611177565b61042f60006008610554565b3461041e576111c036600461053e565b6104d86105866111a4565b3461041e576111db36600461053e565b6104d8600080516020615bfc833981519152610586565b61042f60006010610554565b3461041e5761120e36600461053e565b6104d86105866111f2565b3461041e576104d861052c61122f3660046107ff565b6154dc565b3461041e576104d3611247366004610874565b94939093929192613221565b9081526040810192916104519160200152565b3461041e5761127e6112793660046107ff565b61539e565b906104d861128b60405190565b92839283611253565b61042f6000600c610554565b3461041e576112b036600461053e565b6104d8610586611294565b3461041e576104d36112ce3660046107ff565b615712565b3461041e576104d861052c6112e9366004610e7c565b91615317565b61042f6000600a610554565b3461041e5761130b36600461053e565b6104d86105866112ef565b61042f60016002610dec565b61042f90610423906001600160a01b031682565b61042f90611322565b61042f90611336565b61050d9061133f565b6020810192916104519190611348565b3461041e5761137136600461053e565b6104d861137c611316565b60405191829182611351565b61042f6000600e610554565b3461041e576113a436600461053e565b6104d8610586611388565b9a98969492909d9c9b99979593916101a08c019e60008d016113cf919052565b60208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101608201526101800152565b3461041e5761142136600461053e565b6104d861142c6153bf565b996114459d9b9d99919998929897939796949660405190565b9d8e9d8e6113af565b3461041e576104d3611461366004610b49565b90611786565b901515815260a08101959461045194909360809361149d92916114969161148f906020870152565b6040850152565b6060830152565b019015159052565b3461041e576104d86114c16114bb366004610b9e565b90615333565b916114ce95939560405190565b95869586611467565b3461041e576104d36114ea366004610466565b9392909261517f565b3461041e576104d3611506366004610729565b9897909796919695929594939461383d565b905b600052602052604060002090565b61042f90610b02600491600092611518565b3461041e576104d861052c6115503660046107ff565b611528565b637965db0b60e01b6001600160e01b0319821614908115611574575090565b61042f91506001600160e01b0319166301ffc9a760e01b1490565b9061151a9061133f565b61042f90610adf565b61042f9054611599565b61042f916115c6916115c060009182611518565b0161158f565b6115a2565b61042f9081565b61042f90546115cb565b60016115f561042f926115ed600090565b506000611518565b016115d2565b906104519161161161160c826115dc565b611625565b9061045191611844565b90610451916115fb565b6104519033906116de565b61042f906110e1565b6110e1565b61167c61042f9392611676611676937f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260170190565b90610a7c565b7001034b99036b4b9b9b4b733903937b6329607d1b815260110190565b6116ba6116c36020936109da936116ae815190565b80835293849260200190565b95869101610a59565b601f01601f191690565b602080825261042f92910190611699565b906116f06116ec82846115ac565b1590565b6116f8575050565b6117679161042f61171461170e61174e94611b93565b92611630565b611729602091611723836110e1565b90611a44565b9261174261173660405190565b9485938401928361163e565b90810382520382610984565b6040515b62461bcd60e51b8152918291600483016116cd565b0390fd5b906104519161177c61160c826115dc565b90610451916118ba565b906104519161176b565b1561179757565b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b610451919061181561180533610423565b6001600160a01b03841614611790565b6118ba565b9060ff905b9181191691161790565b9061183961042f61184092151590565b825461181a565b9055565b906118526116ec82846115ac565b61185a575050565b611874600161186f8360006115c08782611518565b611829565b33906118aa6118a46118a47f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9590565b9261133f565b926118b460405190565b600090a4565b906118c581836115ac565b6118cd575050565b6118e1600061186f83826115c08782611518565b33906118aa6118a46118a47ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9590565b61042f60026115a2565b634e487b7160e01b600052601160045260246000fd5b8181029291811591840414171561194457565b61191b565b9190820180921161194457565b90610aad6109fa836109be565b369037565b9061045161197e61197884611956565b936109be565b601f190160208401611963565b634e487b7160e01b600052603260045260246000fd5b906119aa825190565b8110156119b8570160200190565b61198b565b8015611944576000190190565b610adf61042f61042f9290565b61042f906119ef6119eb61042f9460ff1690565b9190565b901c90565b156119fb57565b60405162461bcd60e51b815280611767600482016020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b9190600292611a75611a70611a6184611a5c886110e1565b611931565b611a6a876110e1565b90611949565b611968565b916000906030611a8d611a87846110e1565b866119a1565b53611ac5611abc600f60fb1b92611a5c6001998a95871a611ab6611ab0886110e1565b8b6119a1565b536110e1565b611a6a836110e1565b905b611ae9575b5061042f93945090611ae36119eb61042f936110e1565b146119f4565b91611af3866110e1565b831115611b61576f181899199a1a9b1b9c1cb0b131b232b360811b611b18600f6110e1565b82169060108210156119b8578792611b38611b5592611b5b941a60f81b90565b851a611b4487896119a1565b53611b4f60046119ca565b906119d7565b936119bd565b90611ac7565b91611acc565b61042f9081906001600160a01b031681565b61042f60146119ca565b61042f61042f61042f9260ff1690565b611bb0611bab61042f92611ba5606090565b50611336565b611b67565b611723611bbb611b79565b611b83565b15611bc757565b60405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606490fd5b61045193929190611c1a611c15600080516020615bfc8339815191525b33906115ac565b611bc0565b90610451939291611c2961203f565b611e51565b15611c3557565b60405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606490fd5b15611c6657565b60405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606490fd5b90916109da90839080936109de565b610aad90602094936109da93611c90565b9091610ac790611cbf60405190565b93849384611c9f565b909161042f92611cb0565b15611cda57565b60405162461bcd60e51b8152602060048201526002602482015261229b60f11b6044820152606490fd5b61042f60c06109aa565b906000199061181f565b90611d2861042f611840926110e1565b8254611d0e565b6104519190611da19060a090600590611d5081611d4a875190565b90611d18565b611d6260018201611d4a602088015190565b611d7460028201611d4a604088015190565b611d8660038201611d4a606088015190565b611d9860048201611d4a608088015190565b01920151151590565b90611829565b9061045191611d2f565b61042f60606109aa565b6104519190611d4a90604090600290611dd48185875190565b611de660018201611d4a602088015190565b0192015190565b9061045191611dbb565b60001981146119445760010190565b9061183961042f61184092610cb3565b909161042f92611c90565b610ac7611e2d60405190565b92839283611e16565b9081526060810193926104519290916040916106cb906106c4565b90929091611fef611fdc85611e66565b905090565b95611e7f600097611e796119eb8a6110e1565b11611c2e565b611e93611e8b886110e1565b855b11611c5f565b611ea5611e9f886110e1565b86611e8d565b611f3087611f2b83896015611ed1611ecc6116ec6005611ec6878787611cc8565b016115a2565b611cd3565b611f266001611f1d611ee1611d04565b97611ef5611eee826110e1565b80928b0152565b611f008160208b0152565b611f0b8160408b0152565b611f168160608b0152565b6080890152565b151560a0870152565b611cc8565b611da7565b611fb54297611f71611f40611db1565b611f4a8884830152565b611f55896020830152565b611f608b6040830152565b611f6c858b6017611cc8565b611ded565b611f8d611f86611f81600d6115d2565b611df7565b600d611d18565b611fa4611f9d611f81600f6115d2565b600f611d18565b611fb083896014611cc8565b611e06565b7fab0cd72524102ab771b7e8fa0f8cb708ad25e5742b324e521b1e07b8553c62d595611e21565b94611fe660405190565b93849384611e36565b0390a2565b90610451939291611bf1565b1561200757565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b61045161204d6116ec611911565b612000565b9061206b9897969594939291612066612622565b612073565b610451612654565b90610451989796959493929161208761203f565b6122e1565b61042361042f61042f9290565b61042f9061208c565b156120a957565b60405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606490fd5b156120da57565b60405162461bcd60e51b8152602060048201526002602482015261453760f01b6044820152606490fd5b1561210b57565b60405162461bcd60e51b815260206004820152600260248201526108a760f31b6044820152606490fd5b1561213c57565b60405162461bcd60e51b8152602060048201526002602482015261453960f01b6044820152606490fd5b9061151a906110e1565b1561217757565b60405162461bcd60e51b815260206004820152600360248201526204531360ec1b6044820152606490fd5b156121a957565b60405162461bcd60e51b815260206004820152600360248201526245313160e81b6044820152606490fd5b61042f9136916109ea565b61042f9060081c610423565b61042f90546121df565b61042f60806109aa565b60021115610ca457565b90610451826121ff565b9061050d90612209565b61042f9051612209565b61042f90612209565b9061183961042f61184092612227565b61045191906122899060609060039061225d81611da18751151590565b61226f60018201611d4a602088015190565b61228160028201611d4a604088015190565b01920161221d565b90612230565b9061045191612240565b61050d90612227565b6122d2610451946122c86060949897956122c1608086019a6000870152565b6020850152565b6040830190612299565b01906001600160a01b03169052565b919293968198959196846000976122f7896110e1565b881161230290611c5f565b8961230c8a6110e1565b1061231690611c2e565b61231f89612099565b6001600160a01b03166001600160a01b038c16141561233d906120a2565b601560c052858a60c0519161235192611cc8565b60050161235d906115a2565b612366906120d3565b8560178a6123758d8484611cc8565b0161237f906115d2565b8a1461238a90612104565b8b8b838260c0519161239b92611cc8565b016123a5906115d2565b926123af92611cc8565b6001016123bb906115d2565b116123c590612135565b818660129d6123d4918f611cc8565b906123de91612166565b6123e7906115a2565b156123f190612170565b83888c6124008d8a6014611cc8565b612409906115a2565b978d6002996124178b610ca9565b9061242190610ca9565b141561242c906121a2565b612436908b6121d4565b96612440916121d4565b9461244a96612b19565b61245390612e91565b61245c906121eb565b339790848961246a3061133f565b90612474936126a9565b84828760c0519161248492611cc8565b0161248e816115d2565b61249790611df7565b6124a091611d18565b818660c051916124af92611cc8565b600101846124bc826115d2565b906124c691611949565b6124cf91611d18565b826001918784426124de6121f5565b8615158b820152906124f18a6020840152565b60408201526125038a60608301612213565b8b61251084846016611cc8565b9061251a9161158f565b906125249161228f565b61252d92611cc8565b9061253791612166565b9061254191611829565b61254a866129ab565b8261255560076115d2565b9061255f91611949565b61256a906007611d18565b7fe1ee8f8c5775fa89d5ab16c33a36c2e4cd0e953d6ec154b368839568bc1e6aab9461259591611e21565b9461259f9061133f565b956125a960405190565b9384936125b693856122a2565b0390a3565b906104519897969594939291612052565b61042f60026110e1565b156125dd57565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b61045161262f60016115d2565b61264361263a6125cc565b918214156125d6565b6001611d18565b61042f60016110e1565b61045161264361264a565b61267861267261042f9263ffffffff1690565b60e01b90565b6001600160e01b03191690565b6001600160a01b039182168152911660208201526060810192916104519160400152565b906126ee906126df610451956004956126c56323b872dd61265f565b936126cf60405190565b9788956020870190815201612685565b60208201810382520383610984565b6127b6565b6126fd6020611956565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b61042f6126f3565b80151561043d565b905051906104518261272e565b9060208282031261041e5761042f91612736565b1561275e57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b610451916127c66127d59261133f565b906127cf612726565b91612813565b80516127e46119eb60006110e1565b149081156127f3575b50612757565b61280d91506020612802825190565b818301019101612743565b386127ed565b61042f929161282260006110e1565b916128a2565b1561282f57565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b3d1561289d576128923d611956565b903d6000602084013e565b606090565b90600061042f949381926128b4606090565b506128cb6128c13061133f565b8390311015612828565b60208101905191855af16128dd612883565b9161292f565b156128ea57565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b91929015612961575081516129476119eb60006110e1565b14612950575090565b61295c61042f91612967565b6128e3565b82612979565b3b6129756119eb60006110e1565b1190565b90612982825190565b61298f6119eb60006110e1565b111561299e5750805190602001fd5b6117679061175260405190565b60116129bd6116ec6115c6848461158f565b6129c5575050565b6129d59061186f8360019261158f565b6129ec6129e5611f81600c6115d2565b600c611d18565b612a1a7f31d3ac54da09405b02d1de0ee0de648de637fbdc111123be0d7fc31f2a544c0b91610e2260405190565b0390a1565b15612a2657565b60405162461bcd60e51b8152602060048201526003602482015262114c8d60ea1b6044820152606490fd5b15612a5857565b60405162461bcd60e51b815260206004820152600360248201526245323560e81b6044820152606490fd5b61050d906001600160a01b031660601b90565b60208096612ace8260149c9b98612ace8e612ac69a612ace6109da9f9a869c612ac6610aad612ace9d8a94610a7c565b018092612a83565b01918252565b61042f90610423565b61042f9054612ad4565b15612aee57565b60405162461bcd60e51b815260206004820152600360248201526245323360e81b6044820152606490fd5b90612b7f91611742612bc1956104519997612bc699612b4342612b3c6119eb8490565b1115612a1f565b612b5c612b576116ec6115c6856004611518565b612a51565b4691612b673061133f565b93612b7160405190565b998a9860208a019889612a96565b612b91612b8a825190565b9160200190565b207f19457468657265756d205369676e6564204d6573736167653a0a333200000000600052601c52603c60002090565b612be9565b612be3612bd66104236003612add565b916001600160a01b031690565b14612ae7565b61042f91612bf691612d51565b919091612c12565b60051115610ca457565b9061045182612bfe565b612c1c6000612c08565b612c2582612c08565b03612c2d5750565b612c376001612c08565b612c4082612c08565b03612c8a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612c946002612c08565b612c9d82612c08565b03612ce75760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612cfa612cf46003612c08565b91612c08565b14612d0157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b90600091612d5d825190565b612d6a6119eb60416110e1565b03612d8d576107d692506020820151906060604084015193015160001a90612ddc565b505050612d9a6000612099565b90600290565b6106cb61045194612dc9606094989795612dbf608086019a6000870152565b60ff166020850152565b6040830152565b6040513d6000823e3d90fd5b919291612de883611630565b612e146119eb7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a06110e1565b11612e7d57612e34600093602095612e2b60405190565b94859485612da0565b838052039060015afa15612e785760005190600091612e5283612099565b6001600160a01b0381166001600160a01b03831614612e7057509190565b925050600190565b612dd0565b50505050612e8b6000612099565b90600390565b6104519061186f6001916004611518565b9061206b9291612eb0612622565b906104519291612ebe61203f565b612ef4565b15612eca57565b60405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606490fd5b610451929190612f19612f14600080516020615bdc833981519152611c0e565b612ec3565b91909134612f426000612f34612f2e826110e1565b84611e8d565b611e796119eb875b926110e1565b612f796003612f6686856015611f26612f616005611ec6868686611cc8565b6120d3565b01611d4a83612f74836115d2565b611949565b612f91612f8a82612f74600a6115d2565b600a611d18565b33926125b6612fc36001967fe1ee8f8c5775fa89d5ab16c33a36c2e4cd0e953d6ec154b368839568bc1e6aab95611e21565b94612fcd8161133f565b96612fd760405190565b948594856122a2565b906104519291612ea2565b9061206b9594939291612ffc612622565b61045195949392919061301f611c15600080516020615bfc833981519152611c0e565b90610451959493929161303061203f565b6130ae565b9050519061045182610453565b9060208282031261041e5761042f91613035565b1561305d57565b60405162461bcd60e51b815260206004820152600360248201526245313360e81b6044820152606490fd5b6130a761045194612dc96060949897956122c1608086019a6000870152565b0190612299565b929093919360006130c76130c1826110e1565b88611e8d565b6130e86130d661042383612099565b6001600160a01b0388165b14156120a2565b61313f60206130ff6130fa60026121eb565b61133f565b6370a08231906131286131113061133f565b9261311b60405190565b9586948593849360e01b90565b83526001600160a01b031660048301526024820190565b03915afa908115612e7857836131ad600261319f6125b6978b8d8f611f269061317b6131e09b6131da9b8e916131f3575b5082905b1015613056565b601592613191612f616005611ec6898989611cc8565b61319a886121eb565b61324c565b01611d4a8c612f74836115d2565b6131c56131be8b612f7460086115d2565b6008611d18565b600080516020615bbc83398151915297611e21565b9661133f565b966131ea60405190565b94859485613088565b613214915060203d811161321a575b61320c8183610984565b810190613042565b38613170565b503d613202565b906104519594939291612feb565b6001600160a01b0390911681526040810192916104519160200152565b6126ee6004926126df6104519561326663a9059cbb61265f565b9261327060405190565b968794602086019081520161322f565b9061206b9594939291613291612622565b6104519594939291906132b4611c15600080516020615bfc833981519152611c0e565b9061045195949392916132c561203f565b6132fc565b156132d157565b60405162461bcd60e51b8152602060048201526003602482015262114c4d60ea1b6044820152606490fd5b93909294919460009561330e876110e1565b841161331990611c5f565b61332287612099565b6001600160a01b03166133348261133f565b141561333f906120a2565b6133483061133f565b3184111561335590613056565b8486601592613365838386611cc8565b600501613371906115a2565b61337a906120d3565b6133839061133f565b988061338e60405190565b600090898d5af161339d612883565b506133a7906132ca565b6133b092611cc8565b600401836133bd826115d2565b906133c791611949565b6133d091611d18565b826133db600b6115d2565b906133e591611949565b6133f090600b611d18565b600194600080516020615bbc8339815191529461340c91611e21565b9461341660405190565b9384936125b69385613088565b906104519594939291613280565b9061206b999897969594939291613446612622565b6104519998979695949392919061346d611c15600080516020615bfc833981519152611c0e565b9061045199989796959493929161348261203f565b6134dd565b1561348e57565b60405162461bcd60e51b815260206004820152600360248201526208a62760eb1b6044820152606490fd5b91908110156119b8576020020190565b3561042f81610432565b3561042f81610453565b819a9998979693959294966134ef8790565b9484861480613834575b8061382b575b61350890613487565b8260159d613516918f611cc8565b600501613522906115a2565b61352b906120d3565b6000986135378a6110e1565b9d8e8f5b8911156135ac578f6135a5918f8f8f938f928f9261359a61359f9761358161357261356d87611a6a9a6135959a6134b9565b6134c9565b6130e1612bd661042385612099565b611e8d6119eb612f3c6135958888886134b9565b6134d3565b6134b9565b9f611df7565b9e8f61353b565b6135f79193979d9a9499959b9e92969c989f5060206135ce6130fa60026121eb565b6370a08231906131286135e03061133f565b926135ea60405190565b9687948593849360e01b90565b03915afa918215612e78578f92613807575b508f918f6116396119eb926131746119eb6136219690565b811015613783578d8d8d8d8d8d8d878e818f8f8f908f84928b84928e8b858f61364a60026121eb565b61365583898c6134b9565b61365e906134c9565b6136698484876134b9565b613672906134d3565b9061367c9261324c565b613685926134b9565b61368e906134d3565b9261369892611cc8565b600201906136a5826115d2565b906136af91611949565b6136b891611d18565b6136c3828c8b6134b9565b6136cc906134d3565b6136d660086115d2565b906136e091611949565b6136eb906008611d18565b6136f4926134b9565b6136fd906134c9565b9a613707926134b9565b613710906134d3565b9461371a926134b9565b613723906134d3565b9361372d926134b9565b613736906134d3565b92600080516020615bbc8339815191529461375091611e21565b9461375a9061133f565b9561376460405190565b9384936137719385613088565b0390a361377d90611df7565b8e613621565b509c50979950505050505050509290926137b96119eb61042f60016115f588886137b360026115f584848c611cc8565b97611cc8565b101590816137dd575b506137cb575050565b610451916137d8916121d4565b614199565b90506138006137fa6137f46115c686866014611cc8565b92610ca9565b91610ca9565b14386137c2565b6119eb9192506138249060203d811161321a5761320c8183610984565b9190613609565b50858b146134ff565b508186146134f9565b90610451999897969594939291613431565b9061206b999897969594939291613864612622565b6104519998979695949392919061388b611c15600080516020615bfc833981519152611c0e565b906104519998979695949392916138a061203f565b91939597969294909998996138b28690565b9382851480613b1c575b6138cd908d81613b12575b50613487565b6015996138db83868d611cc8565b6005016138e7906115a2565b6138f0906120d3565b6000986138fc8a6110e1565b9b8c5b888e1015613953578f61394d918f8f8f918f948f9261359a611a6a9561358161393261356d876139479c6135959a6134b9565b6130e161394161042385612099565b9161133f565b9d611df7565b9c6138ff565b61397b91949b93989f9a959c99969d509d91969d6131746119eb6139763061133f565b319290565b8d6139886119eb846110e1565b811015613b01578d8d8d8d8d8d868e818f8f8f908f8f928d8694928d8b878e8782986139b5848a8d6134b9565b6139be906134c9565b6139c79061133f565b6139d28585886134b9565b6139db906134d3565b60405190818003925af16139ed612883565b506139f7906132ca565b613a00926134b9565b613a09906134d3565b92613a1392611cc8565b60040190613a20826115d2565b90613a2a91611949565b613a3391611d18565b613a3e828b8b6134b9565b613a47906134d3565b613a51600b6115d2565b90613a5b91611949565b613a6690600b611d18565b613a6f926134b9565b613a78906134c9565b99613a82926134b9565b613a8b906134d3565b95613a95926134b9565b613a9e906134d3565b92613aa8926134b9565b613ab1906134d3565b91600195600080516020615bbc83398151915294613ace91611e21565b94613ad89061133f565b95613ae260405190565b938493613aef9385613088565b0390a3613afb90611df7565b8e613988565b509c50505050505050505050505050565b905086148d6138c7565b508481146138bc565b9061045199989796959493929161384f565b9061206b97969594939291613b4a612622565b6104519796959493929190613b6f611c15600080516020615bfc833981519152611c0e565b9061045197969594939291613b8261203f565b613d0e565b15613b8e57565b60405162461bcd60e51b815260206004820152600360248201526245313560e81b6044820152606490fd5b15613bc057565b60405162461bcd60e51b815260206004820152600360248201526245313960e81b6044820152606490fd5b90610451613c3b6003613bfc6121f5565b94613c0f613c09826115a2565b15158752565b613c25613c1e600183016115d2565b6020880152565b611ec6613c34600283016115d2565b6040880152565b60608401612213565b61042f90613beb565b15613c5457565b60405162461bcd60e51b815260206004820152600360248201526204532360ec1b6044820152606490fd5b634e487b7160e01b600052601260045260246000fd5b8115613c9f570490565b613c7f565b9190820391821161194457565b15613cb857565b60405162461bcd60e51b815260206004820152600360248201526245313760e81b6044820152606490fd5b9081526060810193926104519290916040916130a7906106c4565b6020810192916104519190610cbc565b9592909796939497613d1d8290565b9689881480614161575b613d3390989798613487565b613d47612f616005611ec685856015611cc8565b613d6d613d596115c684846014611cc8565b613d666137fa6001610ca9565b1415613b87565b613d7760006110e1565b978897895b8c828c1015613f04576020613ec3613ecf93611a6a8f808f8f8f8f8f8f8f93613e3561356d613ec99f9a86613e2f87876135959f613e418f8f61359a9f613ea59f613e529f613e4d9f8f97613e2f898f9361356d8588613e2f613e469f99613e35956116ec9f6115c69f613595613e3b9f6135959f93613e1b9361359a613e0b61356d8d8096613e289a6134b9565b6130e1612bd66104236000612099565b611e8d6119eb60006110e1565b6013611cc8565b946134b9565b9061158f565b90612166565b613bb9565b6016611cc8565b613c44565b613e64613e5f8251151590565b613c4d565b613ea0613e98613e87613e778e85015190565b613e8160066115d2565b90611931565b613e926127106110e1565b90613c95565b9b8c92015190565b613ca4565b613eb36135958686866134b9565b8110159081613ed6575b50613cb1565b9b611949565b9a611df7565b9998613d7c565b613eef9150613ee96135958787876134b9565b90613ca4565b613efc6119eb60016110e1565b111538613ebd565b50909a92979593969950979097613f2360206130ff6130fa60026121eb565b03915afa8015612e7857613f40916000916131f357508290613174565b613f4a60006110e1565b8b81101561403a57808b8b8f8b61401561400f8f936135958f998f9a8f61359583866140359f61356d8f8f928f978f8a8894613fe79f600161186f613fdb9a613fe19f6135958b613fb596613e2f8c613e358f8561359a9f91613e2f61356d93613e3b9b6013611cc8565b613fd561359587613fc660026121eb565b94613e2f61356d838b8b6134b9565b9161324c565b9c6134b9565b996134b9565b927fda3ab98ca5342b32c296369a75cfdf8e52a4f167089815054505b077869688ee94611e21565b9361133f565b9361402d600061402460405190565b93849384613ce3565b0390a3611df7565b613f4a565b509750989597509850505050611fdc611fef9161406c600261405e83896015611cc8565b01611d4a87612f74836115d2565b61408461407d88612f7460096115d2565b6009611d18565b6140936115c682886014611cc8565b6002906140a26137fa83610ca9565b036140d0575b507fc6f0b6a6a3f3eabbc05a02d59a49a82eb7cc3ac5e87f3df8b90e7f28b2c7116795611e21565b6140e081611fb0848a6014611cc8565b6140ea600f6115d2565b6140f76119eb60006110e1565b11614147575b7f8004009bfd86d0314abeb35479bae32c57b93c8e13dde7df962e9870047bd8ec61413e61412b848a611e21565b9261413560405190565b91829182613cfe565b0390a2386140a8565b61415c611f9d614157600f6115d2565b6119bd565b6140fd565b50878614613d27565b9061045197969594939291613b37565b61042f91610a7c565b610ac79061419060405190565b9182918261417a565b6001906141ab82611fb0836014610acd565b6141b5600f6115d2565b6141c26119eb60006110e1565b116141f5575b611fef61412b7f8004009bfd86d0314abeb35479bae32c57b93c8e13dde7df962e9870047bd8ec92614183565b614205611f9d614157600f6115d2565b6141c8565b9061206b989796959493929161421e612622565b90610451989796959493929161423261203f565b614329565b1561423e57565b60405162461bcd60e51b815260206004820152600360248201526222989960e91b6044820152606490fd5b61042f60e06109aa565b9061ff009060081b61181f565b9061429061042f61184092151590565b8254614273565b61045191906143199060c0906005906142b281611d4a875190565b6142c460018201611d4a602088015190565b6142d660028201611d4a604088015190565b6142e860038201611d4a606088015190565b6142fa60048201611d4a608088015190565b019261431261430c60a0830151151590565b85611829565b0151151590565b90614280565b9061045191614297565b9590979187928598858b96978499600060c05260c051614348906110e1565b831161435390611c5f565b60c0518990614361906110e1565b1061436b90611c2e565b60c05161437790612099565b6001600160a01b03166001600160a01b0383161415614395906120a2565b601998826143a4828f8d611cc8565b906143ae9161158f565b60c051016143bb906115a2565b156143c590614237565b6143cf908d6121d4565b966143d9916121d4565b946143e396612b19565b6143ec90612e91565b6143f660026121eb565b33969083886144043061133f565b9061440e936126a9565b8481601861441d828483611cc8565b600501614429906115a2565b1594614474600161446661451697614510976144c8966125b69b61452d575b611f26614456848484611cc8565b60c05101611d4a611f81826115d2565b01611d4a89612f74836115d2565b6144c38a6144be858c6001956144af8d6144a842916144a16144946121f5565b9b60c0518d019015159052565b60208b0152565b6040890152565b611f2660c05160608901612213565b61158f565b61228f565b6144d1886129ab565b6144e96144e286612f7460076115d2565b6007611d18565b7f4399762365f4f87f46fa36c993f5530d75ee8c9ab3a6ab06b32b25d41409904c96611e21565b9561133f565b9561452060405190565b93849360c05191856122a2565b6145a28561458861453c614269565b9161457f61454b60c0516110e1565b6145578160c051870152565b614562816020870152565b61456d816040870152565b614578816060870152565b6080850152565b151560a0830152565b60c0805115159082015261459d858585611cc8565b61431f565b6145b96145b2611f81600e6115d2565b600e611d18565b6145d06145c9611f8160106115d2565b6010611d18565b614448565b90610451989796959493929161420a565b9061206b979695949392916145f9612622565b906104519796959493929161460c61203f565b949386929784976146b16144be9761469f61469a6116ec8c611ec66146c29c6146bd9b6080523460a05260009e8f9361464f614647866110e1565b60a051611e8d565b61466b61465f611e616080518491565b611e796119eb886110e1565b61468961467a61042387612099565b6001600160a01b0385166130e1565b601960c0526080519060c051611cc8565b614237565b6146ab6080518b6121d4565b946121d4565b92898b60a05192612b19565b612e91565b614724600361470e60186146e16116ec6005611ec66080518a86611cc8565b6147d7575b614704856146f76080518985611cc8565b01611d4a611f81826115d2565b8560805191611cc8565b01611d4a61471b826115d2565b60a05190611949565b614771600191614751426147448561473a6121f5565b9485019015159052565b612dc960a0516020850152565b61475e8360608301612213565b6144c3856144be6080518760c051611cc8565b61477a836129ab565b61478a612f8a61471b600a6115d2565b33936125b66147c06145107f4399762365f4f87f46fa36c993f5530d75ee8c9ab3a6ab06b32b25d41409904c9560805190611e21565b956147ca60405190565b93849360a05190856122a2565b61481360016147fe6147e7614269565b9161457f6147f48a6110e1565b614557818c870152565b86151560c082015261459d6080518985611cc8565b6148236145b2611f81600e6115d2565b6148336145c9611f8160106115d2565b6146e6565b90610451979695949392916145e6565b9061206b94939291614858612622565b610451949392919061487a611c15600080516020615bfc833981519152611c0e565b906104519493929161488a61203f565b6148cd565b61042f9060081c610adf565b61042f905461488f565b6130a761045194612dc96060949897956148c4608086019a6000870152565b15156020850152565b9390919261492b906000956148e4611e8b886110e1565b6148f36130d661042389612099565b60206149026130fa60026121eb565b6370a08231906131286149143061133f565b9261491e60405190565b9788948593849360e01b90565b03915afa8015612e785785938891614ab7575b5084111561494b90613056565b601893614959848387611cc8565b600501614965906115a2565b61496e906120d3565b614979848387611cc8565b6005016149859061489b565b1561498f90613b87565b8161499a60056115d2565b6149a49083611931565b6149af6127106110e1565b6149b891613c95565b91826149c391613ca4565b9588876149d060026121eb565b916149da9261324c565b6149e5868383611cc8565b600201876149f2826115d2565b906149fc91611949565b614a0591611d18565b6001958692614a1392611cc8565b60050190614a2091614280565b84614a2b60086115d2565b90614a3591611949565b614a40906008611d18565b614a4a60096115d2565b90614a5491611949565b614a5f906009611d18565b614a6960106115d2565b614a72906119bd565b614a7d906010611d18565b600080516020615b9c83398151915294614a9691611e21565b94614aa09061133f565b95614aaa60405190565b9384936125b693856148a5565b614acf915060203d811161321a5761320c8183610984565b3861493e565b9061045194939291614848565b9061206b94939291614af2612622565b6104519493929190614b14611c15600080516020615bfc833981519152611c0e565b9061045194939291614b2461203f565b90809291600095614b34876110e1565b8111614b3f90611c5f565b614b4887612099565b6001600160a01b0316614b5a8561133f565b1415614b65906120a2565b614b6e3061133f565b31811115614b7b90613056565b816018614b89858383611cc8565b600501614b95906115a2565b614b9e906120d3565b614ba9858383611cc8565b600501614bb59061489b565b15614bbf90613b87565b614bc960056115d2565b614bd39084611931565b614bde6127106110e1565b614be791613c95565b9283614bf291613ca4565b95614bfc9061133f565b9880614c0760405190565b600090898d5af1614c16612883565b50614c20906132ca565b614c2b858383611cc8565b60040186614c38826115d2565b90614c4291611949565b614c4b91611d18565b6001948592614c5992611cc8565b60050190614c6691614280565b83614c71600b6115d2565b90614c7b91611949565b614c8690600b611d18565b614c9060096115d2565b90614c9a91611949565b614ca5906009611d18565b614caf60106115d2565b614cb8906119bd565b614cc3906010611d18565b600080516020615b9c83398151915293614cdc91611e21565b9381614aaa60405190565b9061045194939291614ae2565b9061206b94939291614d04612622565b6104519493929190614d26611c15600080516020615bfc833981519152611c0e565b9061045194939291614d3661203f565b614d6d565b15614d4257565b60405162461bcd60e51b815260206004820152600360248201526222989b60e91b6044820152606490fd5b938192936000614d7c816110e1565b8311614d8790611c5f565b614d9081612099565b6001600160a01b03166001600160a01b0387161415614dae906120a2565b601895614dbc858989611cc8565b600501614dc8906115a2565b614dd1906120d3565b614ddc858989611cc8565b600501614de89061489b565b15614df290613b87565b8181614e00878b6019611cc8565b90614e0a9161158f565b01614e14906115a2565b614e1d90614d3b565b80614e2a868a6019611cc8565b90614e349161158f565b600101614e40906115d2565b90614e4b60066115d2565b614e559083611931565b614e606127106110e1565b614e6991613c95565b9182614e7491613ca4565b8086111590868291614e8c9361515f575b5050613cb1565b88614ea26003611ec6846144be8b866019611cc8565b614eb4614eae86612209565b91612209565b0361504e5750614ef795506020614ece6130fa60026121eb565b6370a0823190613128614ee03061133f565b92614eea60405190565b9a8b948593849360e01b90565b03915afa958615612e78578380614fb1846144be8c8f8f9c61042f9c614fd19f614ffe9f614fd79d614f50600261405e614fb79f898f96611f268f8c908f95614f6b9c6131919161407d9d91615030575b508390613174565b614f616131be86612f7460086115d2565b612f7460096115d2565b600080516020615b9c83398151915288614f858686611e21565b92614fa682614f938b61133f565b96614f9d60405190565b948594856148a5565b0390a35b6019611cc8565b01611829565b6001614fc2846110e1565b9687926144be8a8d6019611cc8565b01611d18565b614ff381614fe6878a8a611cc8565b01611d4a614157826115d2565b6115f5858888611cc8565b1461500857505050565b61501a60059161502094600194611cc8565b01614280565b6104516145c961415760106115d2565b615048915060203d811161321a5761320c8183610984565b38614f48565b839692849683963061505f9061133f565b3182111561506c90613056565b6150758561133f565b928c87868a806150848961133f565b6040516000918a905af1615096612883565b506150a0906132ca565b6150a992611cc8565b600401836150b6826115d2565b906150c091611949565b6150c991611d18565b826150d4600b6115d2565b906150de91611949565b6150e990600b611d18565b6150f360096115d2565b906150fd91611949565b615108906009611d18565b60019187600080516020615b9c833981519152926151268988611e21565b9461513060405190565b93849361513d93856148a5565b0390a3614fd196614ffe96614fb161042f976144be614fd797614fb796614faa565b6151699250613ca4565b6151766119eb60016110e1565b11158638614e85565b9061045194939291614cf4565b61042f6101006109aa565b61519f61518c565b906000825260208080808080808089016000815201600081520160008152016000815201600081520160008152016000905250565b61042f615197565b9061050d90610ca9565b6151ee6151d4565b506151fb82826015611cc8565b61520783836017611cc8565b90615214600582016115a2565b9361521e826115d2565b9361522b600184016115d2565b92600201615238906115d2565b91615244916014611cc8565b61524d906115a2565b90615257846115d2565b92615264600186016115d2565b94600201615271906115d2565b9561527a61518c565b971515885260208801526040870152606086015261529b90608086016151dc565b60a084015260c083015260e082015290565b916144be61042f926152c9946152c1600090565b506016611cc8565b906152d3826115a2565b906152ec60026152e5600186016115d2565b94016115d2565b91929190565b6115c6926144be61042f95936153129361530a600090565b506013611cc8565b612166565b916153126115c69261042f9461532b600090565b506012611cc8565b6153429161042f916018611cc8565b6005810161534f816115a2565b615358836115d2565b9361537a615374600261536d600188016115d2565b96016115d2565b9361489b565b919493929190565b916144be61042f926152c994615396600090565b506019611cc8565b9061042f6153b8613e876153b260056115d2565b85611931565b8093613ca4565b6153f26153cf6130fa60026121eb565b60206370a082316153df3061133f565b926153e960405190565b94859260e01b90565b82526001600160a01b038416600483015260249082905afa918215612e78576000926154a4575b503191615426600c6115d2565b91615431600d6115d2565b9161543c600f6115d2565b91615447600e6115d2565b9161545260106115d2565b9161545d60076115d2565b9161546860086115d2565b91615473600a6115d2565b9161547e600b6115d2565b9161548960096115d2565b9161549460056115d2565b919c9b9a99989796959493929190565b6154bd91925060203d811161321a5761320c8183610984565b9038615419565b61042f90600080516020615bfc8339815191526115ac565b6115c661042f916154eb600090565b506004611518565b61045190615511612f14600080516020615bdc833981519152611c0e565b61555b565b906001600160a01b039061181f565b9061553561042f6118409261133f565b8254615516565b6001600160a01b039091168152604081019291610451916020906122d2565b61557a61556b6104236000612099565b6001600160a01b0383166130e1565b6155846003612add565b90615590816003615525565b7f93f9d0472cb0fc12887bf8f1f15cc7a197a5acd122ab23b8dcc25de0191e0d5e91612a1a6155be60405190565b9283928361553c565b610451906154f3565b610451906155ee612f14600080516020615bdc833981519152611c0e565b6104519061560261556b6104236000612099565b600080516020615bfc83398151915261161b565b610451906155d0565b6104519061563d612f14600080516020615bdc833981519152611c0e565b6104519061565161556b6104236000612099565b600080516020615bfc833981519152611786565b6104519061561f565b6104519061568c612f14600080516020615bdc833981519152611c0e565b6156c3565b1561569857565b60405162461bcd60e51b815260206004820152600360248201526245323160e81b6044820152606490fd5b6156d96156d16101f46110e1565b821115615691565b6156e4816005611d18565b612a1a7f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769161058a60405190565b6104519061566e565b61045190615739612f14600080516020615bdc833981519152611c0e565b6157476156d16101f46110e1565b6156e4816006611d18565b6104519061571b565b61045190615779612f14600080516020615bdc833981519152611c0e565b61206b90615785612622565b6157bc565b1561579157565b60405162461bcd60e51b815260206004820152600360248201526222991960e91b6044820152606490fd5b60006157d06157ca826110e1565b83611e8d565b6157e86157e061042f60096115d2565b83111561578a565b6157fa60206130ff6130fa60026121eb565b03915afa908115612e785761581692916131f357508290613174565b61582b8161582460026121eb565b339061324c565b61583c61407d82613ea060096115d2565b612a1a7f9800e6f57aeb4360eaa72295a820a4293e1e66fbfcabcd8874ae141304a76deb9161058a60405190565b6104519061575b565b61588d612f14600080516020615bdc833981519152611c0e565b6104516104516158e6565b610451615873565b6158a861203f565b6104516158b760016002611829565b33612a1a7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610e2260405190565b6104516158a0565b615908612f14600080516020615bdc833981519152611c0e565b610451610451615961565b6104516158ee565b6159236159ac565b61045161593260006002611829565b33612a1a7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610e2260405190565b61045161591b565b1561597057565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6104516159b7611911565b615969565b6104519291906159dc612f14600080516020615bdc833981519152611c0e565b9061206b92916159ea612622565b615a19565b6001600160a01b0390911681526060810193926104519290916040916106cb906020830190611348565b6000615a4f615a2782612099565b615a3d6001600160a01b0382166130e18761133f565b610423615a49846110e1565b87611e8d565b6001600160a01b03831603615acf57615a9890615a76615a6e3061133f565b869031613174565b80615a808561133f565b60405160009188905af1615a92612883565b506132ca565b612a1a7f8b192dc173e314b16d9067e45c2afbdcdc1713fc4fe1a95aff9076249648abc093615ac660405190565b938493846159ef565b615ae6615adb8361133f565b60206135ce8261133f565b03915afa928315612e7857615b17938793615b08929161503057508390613174565b615b118561133f565b9061324c565b615a98565b9061045192916159bc565b6104519190615b46611c15600080516020615bfc833981519152611c0e565b61186f61045192600192601a611cc8565b9061045191615b27565b6104519190615b80611c15600080516020615bfc833981519152611c0e565b61186f61045192600192601b611cc8565b9061045191615b6156fe811be7c5d38662bc399d6dab88e5c3941b5b37b4056b6aab54c6ccd6f6ef95ff8421cdfddc8a0ea1b9bdc015343e38a42db8ffa7a0cf34ba2eead262619f9ed8a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756d5c9827c1f410bbb61d3b2a0a34b6b30492d9a1fd38588edca7ec4562ab9c9ba2646970667358221220571729cbb3e1ebccfe613325099911cc4554a6a95ae8c1fa91e8697a59ea630b64736f6c634300081400330000000000000000000000004a23fb124d7146eff8e674ac88406bf572dc1405000000000000000000000000d8dc9174397a1ffa859cd7e4750f3fb292a4f6b00000000000000000000000005f91ed30f954e7f4b5cefa441c36e2a02cc6d77e000000000000000000000000d8dc9174397a1ffa859cd7e4750f3fb292a4f6b0