608060405234801562000010575f80fd5b506200001c3262000022565b62000310565b6200002d81620000a8565b6200003a816001620000e3565b6040805180820190915260098152686e6f2068616e646c6560b81b60208201525f9062000068908262000244565b506040805180820190915260028152614e4f60f01b602082015260019062000091908262000244565b50506003805464ffffffffff19166288b81e179055565b6001600160a01b0316638b78c6d819819055805f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b6200016d826200012d836200011d836001600160a01b03165f90815268a20d6e21d0e525531060205260409020546001600160581b031690565b6001600160581b03169062000171565b6001600160a01b03919091165f90815268a20d6e21d0e52553106020526040902080546001600160581b0319166001600160581b03909216919091179055565b5050565b5f811515620001858460571c600116151590565b1515146200019f576a800000000000000000000092909218915b5090919050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620001cf57607f821691505b602082108103620001ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200023f57805f5260205f20601f840160051c810160208510156200021b5750805b601f840160051c820191505b818110156200023c575f815560010162000227565b50505b505050565b81516001600160401b03811115620002605762000260620001a6565b6200027881620002718454620001ba565b84620001f4565b602080601f831160018114620002ae575f8415620002965750858301515b5f19600386901b1c1916600185901b17855562000308565b5f85815260208120601f198616915b82811015620002de57888601518255948401946001909101908401620002bd565b5085821015620002fc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b61282a806200031e5f395ff3fe60806040526004361061021d575f3560e01c8063514e62fc116101225780638da5cb5b116100aa578063c87b56dd1161006e578063c87b56dd146109d3578063dd62ed3e146109f2578063f04e283e14610a3e578063f2fde38b14610a51578063fee81cf414610a6457610224565b80638da5cb5b1461094a57806395d89b4114610962578063a9059cbb14610976578063b19de39f14610995578063b6982069146109b457610224565b806355f804b3116100f157806355f804b3146108d15780635a446215146108f057806370a082311461090f578063715018a61461092e57806375b238fc1461093657610224565b8063514e62fc1461083f5780635327bba31461087457806353d6fd59146108aa57806354d1f13d146108c957610224565b806325692962116101a5578063313ce56711610174578063313ce567146107ad5780633af32abf146107c05780633ccfd60b146107df5780634a4ee7b1146107f35780634ef41efc1461080657610224565b80632569296214610736578063274e430b1461073e5780632a6a935d1461075d5780632de948071461077c57610224565b8063183a4f6e116101ec578063183a4f6e1461069d5780631c10893f146106b05780631cd64df4146106c3578063211c3af7146106f857806323b872dd1461071757610224565b806304dfe79d146105e757806306fdde0314610617578063095ea7b31461063857806318160ddd1461066757610224565b3661022457005b68a20d6e21d0e52553085f3560e01c63e985e9c58190036102c65760018201546001600160a01b0316331461026c5760405163ce5a776b60e01b815260040160405180910390fd5b6044361015610279575f80fd5b6004356001600160a01b038181165f908152600385016020908152604080832060243594851684529091529020546102c39060ff166102b8575f6102bb565b60015b60ff16610a95565b50505b80636352211e0361032a5760018201546001600160a01b031633146102fe5760405163ce5a776b60e01b815260040160405180910390fd5b602436101561030b575f80fd5b60043561032861031a82610a9d565b6001600160a01b0316610a95565b505b8063e5eb36c8036103965760018201546001600160a01b031633146103625760405163ce5a776b60e01b815260040160405180910390fd5b608436101561036f575f80fd5b60043560243560443560643561038784848484610ad3565b6103916001610a95565b505050505b8063813500fc0361042e5760018201546001600160a01b031633146103ce5760405163ce5a776b60e01b815260040160405180910390fd5b60643610156103db575f80fd5b6001600160a01b036044358181165f90815268a20d6e21d0e525530b6020908152604080832060043595861684529091529020805460ff191660243515159081179091559061042a6001610a95565b5050505b8063d10b6e0c0361048e5760018201546001600160a01b031633146104665760405163ce5a776b60e01b815260040160405180910390fd5b6064361015610473575f80fd5b60043560243560443561048a61031a848484610b1a565b5050505b8063081812fc036104e45760018201546001600160a01b031633146104c65760405163ce5a776b60e01b815260040160405180910390fd5b60243610156104d3575f80fd5b6004356104e261031a82610c0d565b505b8063f5b100ea0361056a5760018201546001600160a01b0316331461051c5760405163ce5a776b60e01b815260040160405180910390fd5b6024361015610529575f80fd5b600435610568610563826001600160a01b03165f90815268a20d6e21d0e5255310602052604090205463ffffffff600160801b9091041690565b610a95565b505b8063e2c79281036105d05760018201546001600160a01b031633146105a25760405163ce5a776b60e01b815260040160405180910390fd5b60043610156105af575f80fd5b68a20d6e21d0e5255308546105d090600160401b900463ffffffff16610a95565b8063b7a94eb8036105e5576105e56001610a95565b005b3480156105f2575f80fd5b506003546106009060ff1681565b60405160ff90911681526020015b60405180910390f35b348015610622575f80fd5b5061062b610c57565b60405161060e9190612394565b348015610643575f80fd5b506106576106523660046123f6565b610ce6565b604051901515815260200161060e565b348015610672575f80fd5b5068a20d6e21d0e525530854600160601b90046001600160601b03165b60405190815260200161060e565b6105e56106ab36600461241e565b610d5a565b6105e56106be3660046123f6565b610d67565b3480156106ce575f80fd5b506106576106dd3660046123f6565b638b78c6d8600c9081525f9290925260209091205481161490565b348015610703575f80fd5b506105e5610712366004612435565b610d7d565b348015610722575f80fd5b5061065761073136600461244e565b610db6565b6105e5610e56565b348015610749575f80fd5b50610657610758366004612435565b610ea3565b348015610768575f80fd5b506105e5610777366004612496565b610ef1565b348015610787575f80fd5b5061068f610796366004612435565b638b78c6d8600c9081525f91909152602090205490565b3480156107b8575f80fd5b506012610600565b3480156107cb575f80fd5b506106576107da366004612435565b610efb565b3480156107ea575f80fd5b506105e5610f13565b6105e56108013660046123f6565b610f27565b348015610811575f80fd5b5068a20d6e21d0e5255309546001600160a01b03165b6040516001600160a01b03909116815260200161060e565b34801561084a575f80fd5b506106576108593660046123f6565b638b78c6d8600c9081525f9290925260209091205416151590565b34801561087f575f80fd5b5060035461089590610100900463ffffffff1681565b60405163ffffffff909116815260200161060e565b3480156108b5575f80fd5b506105e56108c43660046124af565b610f39565b6105e5610f53565b3480156108dc575f80fd5b506105e56108eb36600461251e565b610f8c565b3480156108fb575f80fd5b506105e561090a36600461255d565b610fa4565b34801561091a575f80fd5b5061068f610929366004612435565b610fd1565b6105e5611003565b348015610941575f80fd5b5061068f600181565b348015610955575f80fd5b50638b78c6d81954610827565b34801561096d575f80fd5b5061062b611016565b348015610981575f80fd5b506106576109903660046123f6565b611025565b3480156109a0575f80fd5b506105e56109af3660046125c4565b61103a565b3480156109bf575f80fd5b506105e56109ce3660046125e7565b611068565b3480156109de575f80fd5b5061062b6109ed36600461241e565b61108a565b3480156109fd575f80fd5b5061068f610a0c366004612607565b6001600160a01b039182165f90815268a20d6e21d0e525530d6020908152604080832093909416825291909152205490565b6105e5610a4c366004612435565b611182565b6105e5610a5f366004612435565b6111bc565b348015610a6f575f80fd5b5061068f610a7e366004612435565b63389a75e1600c9081525f91909152602090205490565b805f5260205ff35b5f610aa7826111e2565b610ac45760405163677510db60e11b815260040160405180910390fd5b610acd826111fe565b92915050565b610adf84848484611251565b610ae984846115b2565b826001600160a01b0316846001600160a01b031614610b1457610b1484670de0b6b3a7640000611656565b50505050565b5f68a20d6e21d0e52553088168a20d6e21d0e525530a81610b6668a20d6e21d0e525530f600189901b5b600381901c5f90815260209290925260409091205460059190911b60e0161c90565b63ffffffff16815260208101919091526040015f20546001600160a01b03908116915084168114610bd8576001600160a01b038082165f90815260038401602090815260408083209388168352929052205460ff16610bd8576040516367d9dca160e11b815260040160405180910390fd5b5f8581526004909201602052604090912080546001600160a01b0387166001600160a01b031990911617905590509392505050565b5f610c17826111e2565b610c345760405163677510db60e11b815260040160405180910390fd5b505f90815268a20d6e21d0e525530c60205260409020546001600160a01b031690565b60605f8054610c659061262f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c919061262f565b8015610cdc5780601f10610cb357610100808354040283529160200191610cdc565b820191905f5260205f20905b815481529060010190602001808311610cbf57829003601f168201915b5050505050905090565b5f8068a20d6e21d0e5255308335f81815260058301602090815260408083206001600160a01b038a16808552908352928190208890555187815293945090927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610d6433826116cd565b50565b610d6f6116d8565b610d7982826116f2565b5050565b6001610d88816116fe565b5f610d9d670de0b6b3a7640000612710612675565b905033610dab82828661172f565b610b148160016118bd565b6001600160a01b0383165f90815268a20d6e21d0e525530d6020908152604080832033845290915281205468a20d6e21d0e5255308905f198114610e3f5780841115610e15576040516313be252b60e01b815260040160405180910390fd5b6001600160a01b0386165f9081526005830160209081526040808320338452909152902084820390555b610e4a8686866118e2565b50600195945050505050565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a250565b6001600160a01b0381165f90815268a20d6e21d0e5255310602052604081208054600160581b90046001168203610ede57823b5b9392505050565b54600160581b9004600216151592915050565b610d64338261191a565b5f610acd610f08836119a9565b60571c600116151590565b6001610f1e816116fe565b610d64336119d4565b610f2f6116d8565b610d7982826116cd565b6001610f44816116fe565b610f4e83836118bd565b505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2565b6001610f97816116fe565b6002610b148385836126e4565b6001610faf816116fe565b5f610fbb8587836126e4565b506001610fc98385836126e4565b505050505050565b6001600160a01b03165f90815268a20d6e21d0e52553106020526040902054600160a01b90046001600160601b031690565b61100b6116d8565b6110145f6119ed565b565b606060018054610c659061262f565b5f6110313384846118e2565b50600192915050565b6001611045816116fe565b506003805463ffffffff9092166101000264ffffffff0019909216919091179055565b6001611073816116fe565b506003805460ff191660ff92909216919091179055565b6060611095826111e2565b6110b25760405163677510db60e11b815260040160405180910390fd5b600280546110bf9061262f565b15905061117d57610acd600280546110d69061262f565b80601f01602080910402602001604051908101604052809291908181526020018280546111029061262f565b801561114d5780601f106111245761010080835404028352916020019161114d565b820191905f5260205f20905b81548152906001019060200180831161113057829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b81525061117885611a2a565b611a6c565b919050565b61118a6116d8565b63389a75e1600c52805f526020600c2080544211156111b057636f5e88185f526004601cfd5b5f9055610d64816119ed565b6111c46116d8565b8060601b6111d957637448fbae5f526004601cfd5b610d64816119ed565b5f806111ed836111fe565b6001600160a01b0316141592915050565b5f68a20d6e21d0e525530868a20d6e21d0e525530a8261122b68a20d6e21d0e525530f600187901b610b44565b63ffffffff16815260208101919091526040015f20546001600160a01b03169392505050565b68a20d6e21d0e52553086001600160a01b03841661128257604051633a954ecd60e21b815260040160405180910390fd5b5f816002015f61129984600701610b448860011b90565b63ffffffff16815260208101919091526040015f20546001600160a01b039081169150861681146112dc5760405162a1148160e81b815260040160405180910390fd5b856001600160a01b0316836001600160a01b03161461135e576001600160a01b038087165f90815260038401602090815260408083209387168352929052205460ff1661135e575f8481526004830160205260409020546001600160a01b0384811691161461135e57604051632ce44b5f60e11b815260040160405180910390fd5b5f61136887611b8c565b90505f61137487611b8c565b8254909150670de0b6b3a76400009083906014906113a3908490600160a01b90046001600160601b031661279e565b82546101009290920a6001600160601b0381810219909316918316021790915582546001600160a01b038116670de0b6b3a7640000600160a01b92839004841601909216021782555061140760078501600188901b611402848b611bf7565b611c97565b5f868152600485016020908152604080832080546001600160a01b03191690556001600160a01b038b168352600687018252808320855463ffffffff60801b198116600160801b9182900463ffffffff9081165f1901908116909202178755631fffffff600382901c168552925282205460059190911b60e0161c6001600160a01b038a165f908152600687016020526040902063ffffffff9190911691506114c8906114bc6007880160018b811b01610b44565b63ffffffff1683611c97565b8154600163ffffffff600160801b80840482169283019091160263ffffffff60801b1990921691909117835561151a6007870161150884600190811b0190565b61140260078a0160018d811b01610b44565b6001600160a01b0389165f908152600687016020526040902061153e90828a611c97565b6115516007870160018a811b0183611c97565b5050866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef670de0b6b3a76400006040516115a091815260200190565b60405180910390a35050505050505050565b60035460ff165f8190036115c557505050565b80670de0b6b3a7640000026115d983610fd1565b116115e357505050565b6115ef610f08836119a9565b156115f957505050565b638b78c6d819546001600160a01b0316836001600160a01b03160361161d57505050565b638b78c6d8600c9081525f84905260209020546001161561163d57505050565b6040516303cab2ff60e21b815260040160405180910390fd5b600354610100900463ffffffff165f81900361167157505050565b5f8061168f84611680876119a9565b6001600160581b031690611cc9565b91509150600281106116bc5780800283026301312d008082106116b0578091505b6116b982611d3d565b50505b6116c68583611d70565b5050505050565b610d7982825f611db4565b638b78c6d819543314611014576382b429005f526004601cfd5b610d7982826001611db4565b638b78c6d819543314610d6457638b78c6d8600c52335f52806020600c205416610d64576382b429005f526004601cfd5b68a20d6e21d0e52553088054640100000000900463ffffffff161561176757604051633ab534b960e21b815260040160405180910390fd5b6001600160a01b03821661178e576040516339a84a7b60e01b815260040160405180910390fd5b61179782611e0b565b805467ffffffff0000000019166401000000001781556001810180546001600160a01b0384166001600160a01b03199091161790558315610b14576001600160a01b0383166117f957604051633a954ecd60e21b815260040160405180910390fd5b6b0de0b6b39983494c589bffff8411156118265760405163e5cfe95760e01b815260040160405180910390fd5b80546bffffffffffffffffffffffff60601b1916600160601b6001600160601b038616021781555f61185784611b8c565b80546001600160a01b03908116600160a01b6001600160601b038916021782556040518781529192508516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a36116c684600161191a565b610d79826118dd836118ce866119a9565b6001600160581b031690611e38565b611d70565b6118ed838383611e5d565b6118f783836115b2565b816001600160a01b0316836001600160a01b031614610f4e57610f4e8382611656565b5f61192483611b8c565b8054909150600160581b900460021615158215151461195f57805460ff600160581b80830482166002189091160260ff60581b199091161781555b826001600160a01b03167fb5a1de456fff688115a4f75380060c23c8532d14ff85f687cc871456d64203938360405161199c911515815260200190565b60405180910390a2505050565b6001600160a01b03165f90815268a20d6e21d0e525531060205260409020546001600160581b031690565b5f385f3847855af1610d645763b12d13eb5f526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b60606080604051019050602081016040525f8152805f19835b928101926030600a8206018453600a900480611a43575050819003601f19909101908152919050565b60608351835183516020870196506020860195506020850194506020604051019350828701838311611b3c576001838203015f60208510611aac57508388205b601f851660200360031b89515b8b51818118831c611b23578315611af35783888e2014611af357808a5260019c8d019c90990198848d10611aed5750611b37565b50611ab9565b5f5b8b8101518b820152602001878110611af557509b87019b988601988715611b2357848d10611aed5750611b37565b895260019b8c019b90980197838c10611ab9575b505050505b84935060206040510194508781038585030192505b80881015611b6c578751845260209788019790930192611b51565b50505f818401908152602001604052601f19909201918252509392505050565b6001600160a01b0381165f90815268a20d6e21d0e5255310602052604081208054909168a20d6e21d0e525530891600160581b90046001169003611bf1576001833b15611bd7576002175b825460ff909116600160581b0260ff60581b199091161782555b50919050565b8154600160601b900463ffffffff1668a20d6e21d0e52553085f829003611c9057805481905f90611c2d9063ffffffff166127be565b825463ffffffff8083166101009490940a848102910219909116179092558554600160601b820263ffffffff60601b199091161786555f908152600283016020526040902080546001600160a01b0386166001600160a01b031990911617905591505b5092915050565b826020528160031c5f5260405f206007831660051b815463ffffffff8482841c188116831b8218845550505050505050565b5f80605784901c60011615611ce257508290505f611d36565b637fffffff620151804204811690603886901c1666ffffffffffffff8616818314611d0d57508190505f5b60389190911b66ffffffffffffff602887901c811692909201918216179350620de0b690049150505b9250929050565b80600117601052605b810460788211025f5b818114611d655760108080209052600101611d4f565b5050601051610d6457fe5b6001600160a01b03919091165f90815268a20d6e21d0e52553106020526040902080546affffffffffffffffffffff19166001600160581b03909216919091179055565b638b78c6d8600c52825f526020600c20805483811783611dd5575080841681185b80835580600c5160601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe265f80a3505050505050565b630f4599e55f523360205260205f6024601c5f855af160015f511416610d645763d125259c5f526004601cfd5b5f6001605784901c16151582151514611e5657600160571b92909218915b5090919050565b6001600160a01b038216611e8457604051633a954ecd60e21b815260040160405180910390fd5b68a20d6e21d0e52553085f611e9885611b8c565b90505f611ea485611b8c565b9050611ed96040518060c001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b825463ffffffff600160801b808304821660808501528454041660a08301526001600160601b03600160a01b9091041660408201819052851115611f3057604051631e9acf1760e31b815260040160405180910390fd5b6040810180518690039081905283546001600160601b03808316600160a01b9081026001600160a01b03938416178755855481810483168a01606087018190529092160291161783556080820151611f9691670de0b6b3a7640000900480821191030290565b81528154600160581b90046002165f0361200457856001600160a01b0316876001600160a01b031603611fd157805160808201510360a08201525b611ffe670de0b6b3a7640000826060015181611fef57611fef6127e0565b048260a0015180821191030290565b60208201525b5f61204b8260200151835f01510160408051808201909152606081525f60208201526040805101828152806020018360051b81016040528183528083602001525050919050565b825190915015612140576001600160a01b0388165f908152600686016020526040902060808301518351875463ffffffff600160401b808304821684900382160263ffffffff60401b199092169190911789558754918303908116600160801b0263ffffffff60801b199092169190911787555b5f1991909101600381901c5f90815260208490526040812054919291600584901b60e0161c63ffffffff1690506120fb89600701825f80612319565b5f81815260048a016020908152604090912080546001600160a01b0319169055858101805160089390931b60608f901b176001178352910190528082036120bf575050505b6020820151156122a1576001600160a01b0387165f9081526006860160209081526040822060a08501519185015190929082019061217e878c611bf7565b8954602088015163ffffffff60401b19821663ffffffff600160401b80850482169093018116909202178c55895463ffffffff60801b1916600160801b86831602178a55919250670de0b6b3a7640000600160601b82046001600160601b03160491640100000000909104165b6121fc8b600701610b448360011b90565b63ffffffff161561221b5760010181811115612216575060015b6121eb565b612226868683611c97565b61223b8b600701828588806001019950612319565b612264878e835f8360200151818360081b8560601b171781526020810185602001525050505050565b60010181811115612273575060015b8385036121eb578a5463ffffffff9091166401000000000267ffffffff0000000019909116178a5550505050505b805151156122c25760018501546122c29082906001600160a01b031661235d565b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161230891815260200190565b60405180910390a350505050505050565b8163ffffffff168160201b17846020528360021c5f5260405f206003851660061b815467ffffffffffffffff8482841c188116831b82188455505050505050505050565b81516040810363263c69d68152602080820152815160051b604401915060208183601c84015f875af1600182511416610b14575f81fd5b5f602080835283518060208501525f5b818110156123c0578581018301518582016040015282016123a4565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461117d575f80fd5b5f8060408385031215612407575f80fd5b612410836123e0565b946020939093013593505050565b5f6020828403121561242e575f80fd5b5035919050565b5f60208284031215612445575f80fd5b610ed7826123e0565b5f805f60608486031215612460575f80fd5b612469846123e0565b9250612477602085016123e0565b9150604084013590509250925092565b8035801515811461117d575f80fd5b5f602082840312156124a6575f80fd5b610ed782612487565b5f80604083850312156124c0575f80fd5b6124c9836123e0565b91506124d760208401612487565b90509250929050565b5f8083601f8401126124f0575f80fd5b50813567ffffffffffffffff811115612507575f80fd5b602083019150836020828501011115611d36575f80fd5b5f806020838503121561252f575f80fd5b823567ffffffffffffffff811115612545575f80fd5b612551858286016124e0565b90969095509350505050565b5f805f8060408587031215612570575f80fd5b843567ffffffffffffffff80821115612587575f80fd5b612593888389016124e0565b909650945060208701359150808211156125ab575f80fd5b506125b8878288016124e0565b95989497509550505050565b5f602082840312156125d4575f80fd5b813563ffffffff81168114610ed7575f80fd5b5f602082840312156125f7575f80fd5b813560ff81168114610ed7575f80fd5b5f8060408385031215612618575f80fd5b612621836123e0565b91506124d7602084016123e0565b600181811c9082168061264357607f821691505b602082108103611bf157634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610acd57610acd612661565b634e487b7160e01b5f52604160045260245ffd5b601f821115610f4e57805f5260205f20601f840160051c810160208510156126c55750805b601f840160051c820191505b818110156116c6575f81556001016126d1565b67ffffffffffffffff8311156126fc576126fc61268c565b6127108361270a835461262f565b836126a0565b5f601f841160018114612741575f851561272a5750838201355b5f19600387901b1c1916600186901b1783556116c6565b5f83815260208120601f198716915b828110156127705786850135825560209485019460019092019101612750565b508682101561278c575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160601b03828116828216039080821115611c9057611c90612661565b5f63ffffffff8083168181036127d6576127d6612661565b6001019392505050565b634e487b7160e01b5f52601260045260245ffdfea2646970667358221220977ea370dc45ae10fd10780d5514c52f0e3074bf3907147d85e3ee6a1ac0217f64736f6c63430008180033