60a060405234801561000f575f80fd5b5060405161287a38038061287a83398101604081905261002e91610129565b336040518060400160405280600e81526020016d524742205369676e61747572657360901b815250604051806040016040528060038152602001622923a160e91b815250815f908161008091906101ee565b50600161008d82826101ee565b5050506001600160a01b0381166100bd57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100c6816100d8565b506001600160a01b03166080526102ad565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f60208284031215610139575f80fd5b81516001600160a01b038116811461014f575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061017e57607f821691505b60208210810361019c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156101e957805f5260205f20601f840160051c810160208510156101c75750805b601f840160051c820191505b818110156101e6575f81556001016101d3565b50505b505050565b81516001600160401b0381111561020757610207610156565b61021b81610215845461016a565b846101a2565b602080601f83116001811461024e575f84156102375750858301515b5f19600386901b1c1916600185901b1785556102a5565b5f85815260208120601f198616915b8281101561027c5788860151825594840194600190910190840161025d565b508582101561029957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6080516125ae6102cc5f395f81816103490152610df401526125ae5ff3fe6080604052600436106101af575f3560e01c80636352211e116100e7578063b88d4fde11610087578063e6f12af911610062578063e6f12af9146104fa578063e8a3d4851461050d578063e985e9c514610521578063f2fde38b14610540575f80fd5b8063b88d4fde146104a2578063c662e481146104c1578063c87b56dd146104db575f80fd5b80638da5cb5b116100c25780638da5cb5b1461043357806395d89b4114610450578063a22cb46514610464578063b31b0eac14610483575f80fd5b80636352211e146103e157806370a0823114610400578063715018a61461041f575f80fd5b806323b872dd1161015257806342842e0e1161012d57806342842e0e1461031957806346904840146103385780634f6ccce71461036b57806352fa270d1461038a575f80fd5b806323b872dd146102bb5780632db5b8e7146102da5780632f745c59146102fa575f80fd5b8063095ea7b31161018d578063095ea7b31461023f5780630ee19fc0146102605780631498cfae1461028857806318160ddd146102a7575f80fd5b806301ffc9a7146101b357806306fdde03146101e7578063081812fc14610208575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004611ce1565b61055f565b60405190151581526020015b60405180910390f35b3480156101f2575f80fd5b506101fb610589565b6040516101de9190611d2a565b348015610213575f80fd5b50610227610222366004611d3c565b610618565b6040516001600160a01b0390911681526020016101de565b34801561024a575f80fd5b5061025e610259366004611d69565b61063f565b005b34801561026b575f80fd5b5061027a66038d7ea4c6800081565b6040519081526020016101de565b348015610293575f80fd5b5061027a6102a2366004611da1565b61064e565b3480156102b2575f80fd5b5060085461027a565b3480156102c6575f80fd5b5061025e6102d5366004611de1565b61066f565b6102ed6102e8366004611e1a565b6106fd565b6040516101de9190611e33565b348015610305575f80fd5b5061027a610314366004611d69565b61088f565b348015610324575f80fd5b5061025e610333366004611de1565b6108f2565b348015610343575f80fd5b506102277f000000000000000000000000000000000000000000000000000000000000000081565b348015610376575f80fd5b5061027a610385366004611d3c565b610911565b348015610395575f80fd5b506103bd6103a4366004611d3c565b60ff601082901c811692600883901c8216929190911690565b6040805160ff948516815292841660208401529216918101919091526060016101de565b3480156103ec575f80fd5b506102276103fb366004611d3c565b610966565b34801561040b575f80fd5b5061027a61041a366004611e6a565b610970565b34801561042a575f80fd5b5061025e6109b5565b34801561043e575f80fd5b50600a546001600160a01b0316610227565b34801561045b575f80fd5b506101fb6109c8565b34801561046f575f80fd5b5061025e61047e366004611e83565b6109d7565b34801561048e575f80fd5b5061027a61049d366004611ebc565b6109e2565b3480156104ad575f80fd5b5061025e6104bc366004611f21565b610a00565b3480156104cc575f80fd5b5061027a660e35fa931a000081565b3480156104e6575f80fd5b506101fb6104f5366004611d3c565b610a18565b61027a610508366004611da1565b610ab3565b348015610518575f80fd5b506101fb610b16565b34801561052c575f80fd5b506101d261053b366004611ff6565b610bab565b34801561054b575f80fd5b5061025e61055a366004611e6a565b610bd8565b5f6001600160e01b0319821663780e9d6360e01b1480610583575061058382610c15565b92915050565b60605f805461059790612027565b80601f01602080910402602001604051908101604052809291908181526020018280546105c390612027565b801561060e5780601f106105e55761010080835404028352916020019161060e565b820191905f5260205f20905b8154815290600101906020018083116105f157829003601f168201915b5050505050905090565b5f61062282610c64565b505f828152600460205260409020546001600160a01b0316610583565b61064a828233610c9c565b5050565b62ff0000601084901b1661ff00600884901b161760ff8216175b9392505050565b6001600160a01b03821661069d57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6106a9838333610ca9565b9050836001600160a01b0316816001600160a01b0316146106f7576040516364283d7b60e01b81526001600160a01b0380861660048301526024820184905282166044820152606401610694565b50505050565b606061071360ff831666038d7ea4c6800061206d565b3410156107575760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610694565b8160ff1667ffffffffffffffff81111561077357610773611f0d565b60405190808252806020026020018201604052801561079c578160200160208202803683370190505b5090505f5b8260ff168160ff1610156108815760408051446020808301919091523360601b6bffffffffffffffffffffffff19168284015260f884901b6001600160f81b031916605483015282516035818403018152605590920190925280519101205f61080c61010083612098565b90505f61010061081c81856120ab565b6108269190612098565b90505f61010061083962010000866120ab565b6108439190612098565b905061085183838333610d7c565b868660ff1681518110610866576108666120be565b60209081029190910101525050600190920191506107a19050565b5061088a610df1565b919050565b5f61089983610970565b82106108ca5760405163295f44f760e21b81526001600160a01b038416600482015260248101839052604401610694565b506001600160a01b03919091165f908152600660209081526040808320938352929052205490565b61090c83838360405180602001604052805f815250610a00565b505050565b5f61091b60085490565b82106109435760405163295f44f760e21b81525f600482015260248101839052604401610694565b60088281548110610956576109566120be565b905f5260205f2001549050919050565b5f61058382610c64565b5f6001600160a01b03821661099a576040516322718ad960e21b81525f6004820152602401610694565b506001600160a01b03165f9081526003602052604090205490565b6109bd610eb0565b6109c65f610edd565b565b60606001805461059790612027565b61064a338383610f2e565b5f6109eb610eb0565b6109f785858585610d7c565b95945050505050565b610a0b84848461066f565b6106f73385858585610fcc565b606060ff601083901c811690600884901c8116908416610a37836110f4565b610a438360ff166110f4565b610a4f8360ff166110f4565b610a60610a5b89611184565b61147c565b610a6c8760ff166110f4565b610a788760ff166110f4565b610a848760ff166110f4565b604051602001610a9a97969594939291906120e9565b6040516020818303038152906040529350505050919050565b5f660e35fa931a0000341015610b005760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610694565b610b0c84848433610d7c565b9050610668610df1565b6060604051602001610b97907f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81527f65223a22524742205369676e617475726573222c226465736372697074696f6e60208201527f223a2252474220697320616e20696e66696e6974652063616e766173227d00006040820152605e0190565b604051602081830303815290604052905090565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b610be0610eb0565b6001600160a01b038116610c0957604051631e4fbdf760e01b81525f6004820152602401610694565b610c1281610edd565b50565b5f6001600160e01b031982166380ac58cd60e01b1480610c4557506001600160e01b03198216635b5e139f60e01b145b8061058357506301ffc9a760e01b6001600160e01b0319831614610583565b5f818152600260205260408120546001600160a01b03168061058357604051637e27328960e01b815260048101849052602401610694565b61090c83838360016114a2565b5f80610cb68585856115a6565b90506001600160a01b038116610d1257610d0d84600880545f838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b610d35565b846001600160a01b0316816001600160a01b031614610d3557610d358185611698565b6001600160a01b038516610d5157610d4c84611715565b610d74565b846001600160a01b0316816001600160a01b031614610d7457610d7485856117bc565b949350505050565b5f610d8885858561064e565b9050610d94828261180a565b807f5a3e96f397e68b20a43c25f664b628805b877334dadfcc925c6c1a3ad434045883610dc060085490565b604080516001600160a01b0390931683526020830191909152429082015260600160405180910390a2949350505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316476040515f6040518083038185875af1925050503d805f8114610e5a576040519150601f19603f3d011682016040523d82523d5f602084013e610e5f565b606091505b5050905080610c125760405162461bcd60e51b815260206004820152601760248201527f4661696c656420746f207472616e7366657220666565730000000000000000006044820152606401610694565b600a546001600160a01b031633146109c65760405163118cdaa760e01b8152336004820152602401610694565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b038216610f6057604051630b61174360e31b81526001600160a01b0383166004820152602401610694565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b156110ed57604051630a85bd0160e11b81526001600160a01b0384169063150b7a029061100e908890889087908790600401612320565b6020604051808303815f875af1925050508015611048575060408051601f3d908101601f191682019092526110459181019061235c565b60015b6110af573d808015611075576040519150601f19603f3d011682016040523d82523d5f602084013e61107a565b606091505b5080515f036110a757604051633250574960e11b81526001600160a01b0385166004820152602401610694565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146110eb57604051633250574960e11b81526001600160a01b0385166004820152602401610694565b505b5050505050565b60605f6111008361186b565b60010190505f8167ffffffffffffffff81111561111f5761111f611f0d565b6040519080825280601f01601f191660200182016040528015611149576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461115357509392505050565b60605f61119083611942565b60408051610140810182525f60a0808301828152600160c0850152600260e085015260036101008501526004610120850152835283518082018552600f81526010602082810191909152601182870152601260608084019190915260056080808501919091528287019390935286518085018852600e81526017818401526018818901526013818301526006818501528688015286518085018852600d81526016818401526015818901526014818301526007818501528187015286518085018852600c8152600b81840152600a818901526009918101919091526008818401529185019190915284519182019094526072808252949550919390926125079083013990505f5b60058160ff16101561146a575f5b60058160ff161015611461575f848360ff16600581106112c7576112c76120be565b60200201518260ff16600581106112e0576112e06120be565b602002015190506060808260ff1660180361133a5760405180604001604052806005815260200164626c61636b60d81b815250915060405180604001604052806005815260200164776869746560d81b8152509050611422565b878360ff166018811061134f5761134f6120be565b602002015161137b5760405180604001604052806005815260200164626c61636b60d81b81525061139a565b60405180604001604052806005815260200164776869746560d81b8152505b91508360ff168560ff161480156113b557508460ff16600314155b6113bf578161141f565b878360ff16601881106113d4576113d46120be565b60200201516114005760405180604001604052806005815260200164776869746560d81b81525061141f565b60405180604001604052806005815260200164626c61636b60d81b8152505b90505b8561142f868685856119a7565b604051602001611440929190612377565b604051602081830303815290604052955050505080806001019150506112a5565b50600101611297565b5080604051602001610a9a919061238b565b6060610583826040518060600160405280604081526020016124c7604091396001611a6d565b80806114b657506001600160a01b03821615155b15611577575f6114c584610c64565b90506001600160a01b038316158015906114f15750826001600160a01b0316816001600160a01b031614155b801561150457506115028184610bab565b155b1561152d5760405163a9fbf51f60e01b81526001600160a01b0384166004820152602401610694565b81156115755783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b03908116908316156115d2576115d2818486611be8565b6001600160a01b0381161561160c576115ed5f855f806114a2565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b0385161561163a576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f6116a283610970565b5f838152600760209081526040808320546001600160a01b03881684526006909252909120919250908183146116f7575f83815260208281526040808320548584528184208190558352600790915290208290555b5f938452600760209081526040808620869055938552525081205550565b6008545f90611726906001906123ac565b5f838152600960205260408120546008805493945090928490811061174d5761174d6120be565b905f5260205f2001549050806008838154811061176c5761176c6120be565b5f9182526020808320909101929092558281526009909152604080822084905585825281205560088054806117a3576117a36123bf565b600190038181905f5260205f20015f9055905550505050565b5f60016117c884610970565b6117d291906123ac565b6001600160a01b039093165f908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661183357604051633250574960e11b81525f6004820152602401610694565b5f61183f83835f610ca9565b90506001600160a01b0381161561090c576040516339e3563760e11b81525f6004820152602401610694565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106118a95772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106118d5576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106118f357662386f26fc10000830492506010015b6305f5e100831061190b576305f5e100830492506008015b612710831061191f57612710830492506004015b60648310611931576064830492506002015b600a83106105835760010192915050565b61194a611cad565b5f5b60188160ff1610156119a15782600116600114611969575f61196c565b60015b826119788360176123d3565b60ff166018811061198b5761198b6120be565b91151560209092020152600192831c920161194c565b50919050565b60408051602081019091525f808252606091905b60038160ff161015611a63575f5b60038160ff161015611a5a575f8260ff1660011480156119ec57508160ff166001145b6119f657866119f8565b855b905083611a1c83611a0a8b60036123ec565b611a14919061240f565b60ff166110f4565b611a2b85611a0a8d60036123ec565b83604051602001611a3f9493929190612428565b60408051601f198184030181529190529350506001016119c9565b506001016119bb565b5095945050505050565b606083515f03611a8b575060408051602081019091525f8152610668565b5f82611abb57600385516004611aa1919061206d565b611aac9060026124b3565b611ab691906120ab565b611ae0565b600385516002611acb91906124b3565b611ad591906120ab565b611ae090600461206d565b90505f8167ffffffffffffffff811115611afc57611afc611f0d565b6040519080825280601f01601f191660200182016040528015611b26576020820181803683370190505b509050600185016020820187885189016020810180515f82525b82841015611b9b576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865350600185019450611b40565b905250508515611bdc57600388510660018114611bbf5760028114611bd257611bda565b603d6001830353603d6002830353611bda565b603d60018303535b505b50909695505050505050565b611bf3838383611c4c565b61090c576001600160a01b038316611c2157604051637e27328960e01b815260048101829052602401610694565b60405163177e802f60e01b81526001600160a01b038316600482015260248101829052604401610694565b5f6001600160a01b03831615801590610d745750826001600160a01b0316846001600160a01b03161480611c855750611c858484610bab565b80610d745750505f908152600460205260409020546001600160a01b03908116911614919050565b6040518061030001604052806018906020820280368337509192915050565b6001600160e01b031981168114610c12575f80fd5b5f60208284031215611cf1575f80fd5b813561066881611ccc565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6106686020830184611cfc565b5f60208284031215611d4c575f80fd5b5035919050565b80356001600160a01b038116811461088a575f80fd5b5f8060408385031215611d7a575f80fd5b611d8383611d53565b946020939093013593505050565b803560ff8116811461088a575f80fd5b5f805f60608486031215611db3575f80fd5b611dbc84611d91565b9250611dca60208501611d91565b9150611dd860408501611d91565b90509250925092565b5f805f60608486031215611df3575f80fd5b611dfc84611d53565b9250611e0a60208501611d53565b9150604084013590509250925092565b5f60208284031215611e2a575f80fd5b61066882611d91565b602080825282518282018190525f9190848201906040850190845b81811015611bdc57835183529284019291840191600101611e4e565b5f60208284031215611e7a575f80fd5b61066882611d53565b5f8060408385031215611e94575f80fd5b611e9d83611d53565b915060208301358015158114611eb1575f80fd5b809150509250929050565b5f805f8060808587031215611ecf575f80fd5b611ed885611d91565b9350611ee660208601611d91565b9250611ef460408601611d91565b9150611f0260608601611d53565b905092959194509250565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215611f34575f80fd5b611f3d85611d53565b9350611f4b60208601611d53565b925060408501359150606085013567ffffffffffffffff80821115611f6e575f80fd5b818701915087601f830112611f81575f80fd5b813581811115611f9357611f93611f0d565b604051601f8201601f19908116603f01168101908382118183101715611fbb57611fbb611f0d565b816040528281528a6020848701011115611fd3575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f8060408385031215612007575f80fd5b61201083611d53565b915061201e60208401611d53565b90509250929050565b600181811c9082168061203b57607f821691505b6020821081036119a157634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761058357610583612059565b634e487b7160e01b5f52601260045260245ffd5b5f826120a6576120a6612084565b500690565b5f826120b9576120b9612084565b500490565b634e487b7160e01b5f52603260045260245ffd5b5f81518060208401855e5f93019283525090919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d8152670ca447444e4cec4560c31b60208201525f61212b602883018a6120d2565b600b60fa1b808252612140600183018b6120d2565b908152905061215260018201896120d2565b90507f29222c226465736372697074696f6e223a2252474220697320616e20696e666981527f6e6974652063616e766173222c22696d616765223a22646174613a696d61676560208201526f0bdcdd99cade1b5b0ed8985cd94d8d0b60821b60408201526121c360508201886120d2565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a227281527f222c22646973706c61795f74797065223a226e756d626572222c226d61785f7660208201527130b63ab2911d191a9a96113b30b63ab2911d60711b604082015290506123066123006122a461229e612242605286018b6120d2565b7f7d2c7b2274726169745f74797065223a2267222c22646973706c61795f74797081527f65223a226e756d626572222c226d61785f76616c7565223a3235352c2276616c6020820152633ab2911d60e11b604082015260440190565b886120d2565b7f7d2c7b2274726169745f74797065223a2262222c22646973706c61795f74797081527f65223a226e756d626572222c226d61785f76616c7565223a3235352c2276616c6020820152633ab2911d60e11b604082015260440190565b856120d2565b627d5d7d60e81b81526003019a9950505050505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061235290830184611cfc565b9695505050505050565b5f6020828403121561236c575f80fd5b815161066881611ccc565b5f610d7461238583866120d2565b846120d2565b5f61239682846120d2565b651e17b9bb339f60d11b81526006019392505050565b8181038181111561058357610583612059565b634e487b7160e01b5f52603160045260245ffd5b60ff828116828216039081111561058357610583612059565b60ff818116838216029081169081811461240857612408612059565b5092915050565b60ff818116838216019081111561058357610583612059565b5f61243382876120d2565b681e3932b1ba103c1e9160b91b815261244f60098201876120d2565b6411103c9e9160d91b8152905061246960058201866120d2565b90507f222077696474683d223122206865696768743d2231222066696c6c3d22000000815261249b601d8201856120d2565b631110179f60e11b8152600401979650505050505050565b808201808211156105835761058361205956fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076696577426f783d2230203020313520313522206865696768743d22353132222077696474683d22353132222073686170652d72656e646572696e673d2263726973704564676573223ea2646970667358221220908831e154d032840bb630abe53e3ac1eddff70ca78eb43fca1cfaaa831eac9364736f6c634300081900330000000000000000000000003ed8df4650d21c55f0ddc32392a32288def66f68