0x608060405234801561001057600080fd5b5061205f806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a45760003560e01c80630328665f146100a95780632279d5d1146100d95780632d05b9ae146100fc5780633a161a461461010f5780633c7dd5b11461012257806350328bf91461015457806384e1eab3146101675780638c6ffffe146101a05780639a09daf6146101b3578063e855148c146101c6578063e9b7cbd0146101d9578063ff908b79146101ec575b600080fd5b6100bc6100b7366004611650565b610203565b6040516001600160a01b0390911681526020015b60405180910390f35b6100ec6100e73660046116ee565b6104b8565b60405190151581526020016100d0565b6100ec61010a366004611753565b61051a565b6100ec61011d366004611788565b6105b4565b610135610130366004611753565b6105dc565b604080516001600160a01b0390931683526020830191909152016100d0565b6100ec610162366004611896565b6106cb565b61017a610175366004611753565b6106f8565b604080516001600160a01b039485168152939092166020840152908201526060016100d0565b6100ec6101ae366004611987565b610777565b6100ec6101c1366004611a92565b610ab6565b6100ec6101d4366004611ab4565b610acd565b6100ec6101e7366004611b2a565b610be9565b6100ec6101fa366004611bb9565b60019392505050565b600080610211600384611bfb565b90506000816001600160401b0381111561022d5761022d6117d3565b60405190808252806020026020018201604052801561026057816020015b606081526020019060019003908161024b5790505b50905060005b828110156102f85785858281811061028057610280611c0e565b90506020028101906102929190611c24565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050845185925084915081106102da576102da611c0e565b602002602001018190525080806102f090611c6a565b915050610266565b50600061030482610e1a565b805160208201209091506000808888600a81811061032457610324611c0e565b90506020028101906103369190611c24565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250602085015196509394508392508c91508b9050600b81811061038a5761038a611c0e565b905060200281019061039c9190611c24565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250602085015196509394507f5fe7f977e71dba2ea1a68e21057beebb9be2ac30c6410aa38d4f3fbe41dcffd292508e91508d9050600981811061041057610410611c0e565b90506020028101906104229190611c24565b604051610430929190611c83565b6040518091039020036104455750601c610449565b50601b5b60408051600081526020810180835288905260ff831691810191909152606081018690526080810184905260019060a0016020604051602081039080840390855afa15801561049c573d6000803e3d6000fd5b5050506020604051035199505050505050505050505b92915050565b60008060006104c788886105dc565b91509150600084600014806104e157506104e18286610ab6565b90508080156105015750866001600160a01b0316836001600160a01b0316145b801561050d5750858210155b9998505050505050505050565b60008061056761052d8460018188611c93565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e6e92505050565b905060008160008151811061057e5761057e611c0e565b602002602001015190506105ab81604051806040016040528060018152602001600160f81b815250610eed565b95945050505050565b60006105ca6105c38385611cbd565b6000610f50565b80519060200120841490509392505050565b600080806105f061052d8560018189611c93565b905060008160058151811061060757610607611c0e565b6020026020010151905060008260068151811061062657610626611c0e565b602002602001015190506000815160206106409190611bfb565b6001600160401b03811115610657576106576117d3565b6040519080825280601f01601f191660200182016040528015610681576020820181803683370190505b50905061068f836000611030565b6106bb82846040516020016106a5929190611cee565b604051602081830303815290604052600061109a565b95509550505050505b9250929050565b60006106df6106da8385611cbd565b610e1a565b8051906020012084805190602001201490509392505050565b600080808061070d61052d866001818a611c93565b905060008160058151811061072457610724611c0e565b6020026020010151905060008260078151811061074357610743611c0e565b60200260200101519050600080610759836110f8565b91509150610768846000611030565b9a919950975095505050505050565b602082015183516000919084908380606089828561079757610797611c0e565b60200260200101518051906020012086146107bb5760009650505050505050610aae565b60005b84811015610a9b5760006107ea8c83815181106107dd576107dd611c0e565b6020026020010151610e6e565b9050811561082a57838c838151811061080557610805611c0e565b6020026020010151805190602001201461082a57600098505050505050505050610aae565b80516011036108b95761083e600187611bfb565b8203610866578060108151811061085757610857611c0e565b60200260200101519250610a88565b808a868151811061087957610879611c0e565b602002602001015160ff168151811061089457610894611c0e565b60200260200101516108a590611d1d565b9350846108b181611c6a565b955050610a88565b80516002036100a45760006108e7826000815181106108da576108da611c0e565b602002602001015161113b565b9050600060018260008151811061090057610900611c0e565b602002602001015160ff161115610989578160008151811061092457610924611c0e565b602002602001015160ff1660020361093e57506002610967565b8160008151811061095157610951611c0e565b602002602001015160ff16600303610967575060015b8260018151811061097a5761097a611c0e565b60200260200101519450610a06565b8160008151811061099c5761099c611c0e565b602002602001015160ff166000036109b6575060026109df565b816000815181106109c9576109c9611c0e565b602002602001015160ff166001036109df575060015b826001815181106109f2576109f2611c0e565b6020026020010151610a0390611d1d565b95505b805b8251811015610a8457828181518110610a2357610a23611c0e565b602002602001015160ff168d8981518110610a4057610a40611c0e565b602002602001015160ff1614610a645760009b505050505050505050505050610aae565b87610a6e81611c6a565b9850508080610a7c90611c6a565b915050610a08565b5050505b5080610a9381611c6a565b9150506107be565b5080516020909101208a14955050505050505b949350505050565b600081610ac561271085611d5a565b149392505050565b600080610ae061052d886001818c611c93565b9050600081600581518110610af757610af7611c0e565b60200260200101519050600082600781518110610b1657610b16611c0e565b602002602001015190506000610b2f826000600461127f565b9050600080610b3d846110f8565b9150915060008860001480610b575750610b57828a610ab6565b9050808015610b8157508b6001600160a01b0316610b76876000611030565b6001600160a01b0316145b8015610bae5750610bae8460405180604001604052806004815260200163a9059cbb60e01b815250610eed565b8015610bcb57508a6001600160a01b0316836001600160a01b0316145b8015610bd75750898210155b9e9d5050505050505050505050505050565b6000808715610c1157610c0a610c026080850185611c24565b878a8a6104b8565b9050610d34565b610c2a610c216080850185611c24565b86888b8b610acd565b8015610c415750610c4161010a60c0850185611c24565b8015610d315750610d31610c5860c0850185611c24565b604051610c66929190611c83565b6040518091039020848060400190610c7e9190611d6e565b610c8791611cbd565b610c95610100870187611d6e565b6005818110610ca657610ca6611c0e565b9050602002810190610cb89190611c24565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cfa9250505060a0880188611d6e565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061077792505050565b90505b808015610d525750610d52602084013561011d610100860186611d6e565b8015610db55750610db5610d696080850185611c24565b604051610d77929190611c83565b604051908190039020610d8d6060860186611d6e565b610d9691611cbd565b610da4610100870187611d6e565b6004818110610ca657610ca6611c0e565b8015610e0e5750610e0e610dcc6080850185611c24565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506101629250505060e0860186611d6e565b98975050505050505050565b60606000610e29836001610f50565b9050604051806040016040528060018152602001600160f91b81525081604051602001610e57929190611cee565b604051602081830303815290604052915050919050565b60405163e5c5e9a360e01b815260609073a89c8a2d22e8c43428f376502a77946fb78268529063e5c5e9a390610ea8908590600401611db7565b600060405180830381865af4158015610ec5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104b29190810190611dea565b815181516000916001918114808314610f095760009250610f46565b600160208701838101602088015b6002848385100103610f41578051835114610f355760009650600093505b60209283019201610f17565b505050505b5090949350505050565b81516060908160005b82811015610ff257600881148015610f6e5750845b15610f9a5781604051602001610f849190611ed6565b6040516020818303038152906040529150610fe0565b81610fbd878381518110610fb057610fb0611c0e565b602002602001015161138c565b604051602001610fce929190611cee565b60405160208183030381529060405291505b80610fea81611c6a565b915050610f59565b506000611001825160c06113e2565b90508082604051602001611016929190611cee565b604051602081830303815290604052935050505092915050565b600061103d826014611efb565b8351101561108a5760405162461bcd60e51b8152602060048201526015602482015274746f416464726573735f6f75744f66426f756e647360581b60448201526064015b60405180910390fd5b500160200151600160601b900490565b60006110a7826020611efb565b835110156110ef5760405162461bcd60e51b8152602060048201526015602482015274746f55696e743235365f6f75744f66426f756e647360581b6044820152606401611081565b50016020015190565b600080600061111461110d856004602061127f565b600c611030565b9050600061112f611128866024602061127f565b600061109a565b91959194509092505050565b8051606090600061114d826002611f0e565b6001600160401b03811115611164576111646117d3565b60405190808252806020026020018201604052801561118d578160200160208202803683370190505b50905060005b84518110156112775760006111a9826002611f0e565b905060048683815181106111bf576111bf611c0e565b602001015160f81c60f81b6001600160f81b031916901c60f81c8382815181106111eb576111eb611c0e565b60ff9092166020928302919091019091015261120681611c6a565b90506000600487848151811061121e5761121e611c0e565b016020015185516001600160f81b031990911690911b915060fc82901c9085908490811061124e5761124e611c0e565b602002602001019060ff16908160ff16815250505050808061126f90611c6a565b915050611193565b509392505050565b60608161128d81601f611efb565b10156112cc5760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401611081565b6112d68284611efb565b8451101561131a5760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401611081565b6060821580156113395760405191506000825260208201604052611383565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561137257805183526020928301920161135a565b5050858452601f01601f1916604052505b50949350505050565b606080825160011480156113ba57506080836000815181106113b0576113b0611c0e565b016020015160f81c105b156113c65750816104b2565b6113db6113d5845160806113e2565b8461158f565b9392505050565b606080603884101561144c57604080516001808252818301909252906020820181803683370190505090506114178385611efb565b601f1a60f81b8160008151811061143057611430611c0e565b60200101906001600160f81b031916908160001a9053506113db565b600060015b61145b8187611f25565b15611481578161146a81611c6a565b925061147a905061010082611f0e565b9050611451565b61148c826001611efb565b6001600160401b038111156114a3576114a36117d3565b6040519080825280601f01601f1916602001820160405280156114cd576020820181803683370190505b5092506114da8583611efb565b6114e5906037611efb565b601f1a60f81b836000815181106114fe576114fe611c0e565b60200101906001600160f81b031916908160001a905350600190505b818111610f465761010061152e8284611bfb565b61153a9061010061201d565b6115449088611f25565b61154e9190611d5a565b601f1a60f81b83828151811061156657611566611c0e565b60200101906001600160f81b031916908160001a9053508061158781611c6a565b91505061151a565b6060806040519050835180825260208201818101602087015b818310156115c05780518352602092830192016115a8565b50855184518101855292509050808201602086015b818310156115ed5780518352602092830192016115d5565b508651929092011591909101601f01601f191660405250905092915050565b60008083601f84011261161e57600080fd5b5081356001600160401b0381111561163557600080fd5b6020830191508360208260051b85010111156106c457600080fd5b6000806020838503121561166357600080fd5b82356001600160401b0381111561167957600080fd5b6116858582860161160c565b90969095509350505050565b60008083601f8401126116a357600080fd5b5081356001600160401b038111156116ba57600080fd5b6020830191508360208285010111156106c457600080fd5b80356001600160a01b03811681146116e957600080fd5b919050565b60008060008060006080868803121561170657600080fd5b85356001600160401b0381111561171c57600080fd5b61172888828901611691565b909650945061173b9050602087016116d2565b94979396509394604081013594506060013592915050565b6000806020838503121561176657600080fd5b82356001600160401b0381111561177c57600080fd5b61168585828601611691565b60008060006040848603121561179d57600080fd5b8335925060208401356001600160401b038111156117ba57600080fd5b6117c68682870161160c565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611811576118116117d3565b604052919050565b60006001600160401b03821115611832576118326117d3565b50601f01601f191660200190565b600082601f83011261185157600080fd5b813561186461185f82611819565b6117e9565b81815284602083860101111561187957600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000604084860312156118ab57600080fd5b83356001600160401b03808211156118c257600080fd5b6118ce87838801611840565b945060208601359150808211156118e457600080fd5b506117c68682870161160c565b60006001600160401b0382111561190a5761190a6117d3565b5060051b60200190565b600061192261185f846118f1565b8381529050602080820190600585901b84018681111561194157600080fd5b845b8181101561197c5780356001600160401b038111156119625760008081fd5b61196e89828901611840565b855250928201928201611943565b505050509392505050565b6000806000806080858703121561199d57600080fd5b843593506020808601356001600160401b03808211156119bc57600080fd5b818801915088601f8301126119d057600080fd5b6119de898335858501611914565b955060408801359150808211156119f457600080fd5b611a0089838a01611840565b94506060880135915080821115611a1657600080fd5b508601601f81018813611a2857600080fd5b8035611a3661185f826118f1565b81815260059190911b8201830190838101908a831115611a5557600080fd5b928401925b82841015611a8357833560ff81168114611a745760008081fd5b82529284019290840190611a5a565b979a9699509497505050505050565b60008060408385031215611aa557600080fd5b50508035926020909101359150565b60008060008060008060a08789031215611acd57600080fd5b86356001600160401b03811115611ae357600080fd5b611aef89828a01611691565b9097509550611b029050602088016116d2565b9350611b10604088016116d2565b925060608701359150608087013590509295509295509295565b60008060008060008060c08789031215611b4357600080fd5b86358015158114611b5357600080fd5b95506020870135945060408701359350611b6f606088016116d2565b9250611b7d608088016116d2565b915060a08701356001600160401b03811115611b9857600080fd5b8701610120818a031215611bab57600080fd5b809150509295509295509295565b600080600060608486031215611bce57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104b2576104b2611be5565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611c3b57600080fd5b8301803591506001600160401b03821115611c5557600080fd5b6020019150368190038213156106c457600080fd5b600060018201611c7c57611c7c611be5565b5060010190565b8183823760009101908152919050565b60008085851115611ca357600080fd5b83861115611cb057600080fd5b5050820193919092039150565b60006113db368484611914565b60005b83811015611ce5578181015183820152602001611ccd565b50506000910152565b60008351611d00818460208801611cca565b835190830190611d14818360208801611cca565b01949350505050565b80516020808301519190811015611d3e576000198160200360031b1b821691505b50919050565b634e487b7160e01b600052601260045260246000fd5b600082611d6957611d69611d44565b500690565b6000808335601e19843603018112611d8557600080fd5b8301803591506001600160401b03821115611d9f57600080fd5b6020019150600581901b36038213156106c457600080fd5b6020815260008251806020840152611dd6816040850160208701611cca565b601f01601f19169190910160400192915050565b60006020808385031215611dfd57600080fd5b82516001600160401b0380821115611e1457600080fd5b818501915085601f830112611e2857600080fd5b8151611e3661185f826118f1565b81815260059190911b83018401908481019088831115611e5557600080fd5b8585015b83811015611ec957805185811115611e715760008081fd5b8601603f81018b13611e835760008081fd5b878101516040611e9561185f83611819565b8281528d82848601011115611eaa5760008081fd5b611eb9838c8301848701611cca565b8652505050918601918601611e59565b5098975050505050505050565b60008251611ee8818460208701611cca565b600360fe1b920191825250600101919050565b808201808211156104b2576104b2611be5565b80820281158282048414176104b2576104b2611be5565b600082611f3457611f34611d44565b500490565b600181815b80851115611f74578160001904821115611f5a57611f5a611be5565b80851615611f6757918102915b93841c9390800290611f3e565b509250929050565b600082611f8b575060016104b2565b81611f98575060006104b2565b8160018114611fae5760028114611fb857611fd4565b60019150506104b2565b60ff841115611fc957611fc9611be5565b50506001821b6104b2565b5060208310610133831016604e8410600b8410161715611ff7575081810a6104b2565b6120018383611f39565b806000190482111561201557612015611be5565b029392505050565b60006113db8383611f7c56fea2646970667358221220347d5cf47b53ec37c25ba64fd9fd50de57651f2defc720fcfb0597ca41be45ce64736f6c63430008120033