0x608060405234801561000f575f80fd5b505f80546001600160a01b03191632179055611bae8061002e5f395ff3fe608060405234801561000f575f80fd5b506004361061006f575f3560e01c8063c0f9c7a41161004d578063c0f9c7a4146100a3578063c669e827146100d0578063e2fd8995146100e3575f80fd5b80634978904814610073578063633189b61461008857806364a3eee114610090575b5f80fd5b610086610081366004610f2d565b610103565b005b61008661026f565b61008661009e366004611105565b610354565b6100b66100b13660046113df565b6104b2565b604080519283526020830191909152015b60405180910390f35b6100866100de366004611105565b6104c6565b6100f66100f1366004611419565b61058b565b6040516100c791906114a3565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f6e6f00000000000000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b5f5473ffffffffffffffffffffffffffffffffffffffff16818015610269575f5b81811015610267575f6101f9308787858181106101c8576101c86114f3565b90506020020160208101906101dd9190611520565b73ffffffffffffffffffffffffffffffffffffffff16906105a2565b9050801561025e575f61024b8583898987818110610219576102196114f3565b905060200201602081019061022e9190611520565b73ffffffffffffffffffffffffffffffffffffffff1691906105b7565b90508061025c5761025c60016106de565b505b506001016101a9565b505b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146102ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f6e6f000000000000000000000000000000000000000000000000000000000000604482015260640161017f565b5f5473ffffffffffffffffffffffffffffffffffffffff164780156103505760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083905f818181858888f1935050505015801561034e573d5f803e3d5ffd5b505b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146103d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f6e6f000000000000000000000000000000000000000000000000000000000000604482015260640161017f565b81515f5b81811015610269575f61043e328584815181106103f7576103f76114f3565b6020026020010151878581518110610411576104116114f3565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166105b79092919063ffffffff16565b9050806104a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161017f9060208082526004908201527f6e6f706500000000000000000000000000000000000000000000000000000000604082015260600190565b506001016103d8565b5f806104bd836106ec565b91509150915091565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f6e6f000000000000000000000000000000000000000000000000000000000000604482015260640161017f565b81515f5b818110156102695761058232848381518110610568576105686114f3565b6020026020010151868481518110610411576104116114f3565b5060010161054a565b6060610598848484610a3e565b90505b9392505050565b5f6105ae5f8484610a68565b90505b92915050565b60405173ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390525f918291829190871690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790525161066c919061153b565b5f604051808303815f865af19150503d805f81146106a5576040519150601f19603f3d011682016040523d82523d5f602084013e6106aa565b606091505b50915091508180156106d45750805115806106d45750808060200190518101906106d49190611556565b9695505050505050565b6040518181526004601c8201fd5b608081015160a08201516102a08301515f92839290917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe9830161074a578080602001905181019061073d9190611571565b509196509450610a369050565b60018314806107595750600883145b806107645750601183145b8061076f5750601c83145b8061077a5750602b83145b806107855750602c83145b806107905750602283145b8061079b5750602683145b806107a65750602e83145b806107b15750602483145b156107d457808060200190518101906107ca91906115a4565b9095509350610a36565b8215806107e15750600b83145b806107ec5750601383145b806107f75750601983145b806108025750602083145b8061080d5750602f83145b806108185750600283145b806108235750600683145b15610849578080602001905181019061083c9190611571565b9097509550610a36915050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83016109a65760c0860151600860ff90911611156108e7575f805f8380602001905181019061089991906116c9565b505050509250925092508083815181106108b5576108b56114f3565b60200260200101518183815181106108cf576108cf6114f3565b60200260200101518098508199505050505050610a36565b5f6108f183610bf3565b90506005816008811115610907576109076117a4565b036109405761091d8760c0015160ff1660061490565b156109375761092b82610c06565b90975095506109a09050565b61092b82610c7c565b5f805f8480602001905181019061095791906117d1565b505050925092509250808381518110610972576109726114f3565b602002602001015181838151811061098c5761098c6114f3565b6020026020010151809950819a5050505050505b50610a36565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb83016109e1578080602001905181019061073d9190611571565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe38301610a1c578080602001905181019061073d9190611898565b80806020019051810190610a3091906115a4565b90955093505b505050915091565b6080820151606090600514610a5d57610a5682610d35565b905061059b565b610598848484610e1e565b60405173ffffffffffffffffffffffffffffffffffffffff821660248201525f906060908290604401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f70a082310000000000000000000000000000000000000000000000000000000017905290505f869003610b7d578473ffffffffffffffffffffffffffffffffffffffff1681604051610b36919061153b565b5f60405180830381855afa9150503d805f8114610b6e576040519150601f19603f3d011682016040523d82523d5f602084013e610b73565b606091505b509250610be69050565b8473ffffffffffffffffffffffffffffffffffffffff168682604051610ba3919061153b565b5f604051808303818686fa925050503d805f8114610bdc576040519150601f19603f3d011682016040523d82523d5f602084013e610be1565b606091505b509250505b5060200151949350505050565b5f8160088111156105b1576105b16117a4565b5f805f805f8086806020019051810190610c2091906118e6565b50505050505050509250925092505f80828581518110610c4257610c426114f3565b6020026020010151838581518110610c5c57610c5c6114f3565b60209081029190910101515f9950909750955050505050505b9193909250565b5f805f805f805f87806020019051810190610c9791906119e9565b505095505050935093509350805f03610cee575f828581518110610cbd57610cbd6114f3565b6020026020010151838581518110610cd757610cd76114f3565b602002602001015196509650965050505050610c75565b818481518110610d0057610d006114f3565b6020026020010151828481518110610d1a57610d1a6114f3565b60209081029190910101515f9a919950975095505050505050565b60605f805f805f805f88806020019051810190610d529190611a9a565b945094509450945094508381610d689190611b03565b610d7584620f4240611b03565b610d7f9190611b1a565b83610d8d87620f4240611b03565b610d979190611b03565b610da19190611b2d565b9650610dad8482611b03565b610dba84620f4240611b03565b610dc49190611b1a565b82610dcf8684611b03565b610dd99190611b03565b610de39190611b2d565b955050505050508181604051602001610e06929190918252602082015260400190565b60405160208183030381529060405292505050919050565b60605f610e2e8460c00151610f0f565b9150505f805f805f87806020019051810190610e4a9190611a9a565b945094509450945094505f8482610e619190611b03565b610e6e85620f4240611b03565b610e789190611b1a565b84610e8688620f4240611b03565b610e909190611b03565b610e9a9190611b2d565b90505f610ea78684611b03565b610eb486620f4240611b03565b610ebe9190611b1a565b84610ec98886611b03565b610ed39190611b03565b610edd9190611b2d565b6040805160208101949094528381019190915280518084038201815260609093019052509a9950505050505050505050565b5f8060648310610f265760016104bd606485611b65565b505f929050565b5f8060208385031215610f3e575f80fd5b823567ffffffffffffffff80821115610f55575f80fd5b818501915085601f830112610f68575f80fd5b813581811115610f76575f80fd5b8660208260051b8501011115610f8a575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040516102e0810167ffffffffffffffff81118282101715610fed57610fed610f9c565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561103a5761103a610f9c565b604052919050565b5f67ffffffffffffffff82111561105b5761105b610f9c565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114611086575f80fd5b50565b803561109481611065565b919050565b5f82601f8301126110a8575f80fd5b813560206110bd6110b883611042565b610ff3565b8083825260208201915060208460051b8701019350868411156110de575f80fd5b602086015b848110156110fa57803583529183019183016110e3565b509695505050505050565b5f8060408385031215611116575f80fd5b823567ffffffffffffffff8082111561112d575f80fd5b818501915085601f830112611140575f80fd5b813560206111506110b883611042565b82815260059290921b8401810191818101908984111561116e575f80fd5b948201945b8386101561119557853561118681611065565b82529482019490820190611173565b965050860135925050808211156111aa575f80fd5b506111b785828601611099565b9150509250929050565b8015158114611086575f80fd5b8035611094816111c1565b5f67ffffffffffffffff8211156111f2576111f2610f9c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261122d575f80fd5b813561123b6110b8826111d9565b81815284602083860101111561124f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6102e0828403121561127c575f80fd5b611284610fc9565b905061128f826111ce565b815261129d602083016111ce565b602082015260408281013590820152606080830135908201526080808301359082015260a0808301359082015260c0808301359082015260e08083013590820152610100808301359082015261012080830135908201526101408083013590820152610160808301359082015261018080830135908201526101a080830135908201526101c080830135908201526101e08083013590820152610200808301359082015261022061134f818401611089565b90820152610240611361838201611089565b90820152610260611373838201611089565b908201526102808281013567ffffffffffffffff80821115611393575f80fd5b61139f8683870161121e565b838501526102a09250828501359150808211156113ba575f80fd5b506113c78582860161121e565b8284015250506102c080830135818301525092915050565b5f602082840312156113ef575f80fd5b813567ffffffffffffffff811115611405575f80fd5b6114118482850161126b565b949350505050565b5f805f6060848603121561142b575f80fd5b83359250602084013567ffffffffffffffff80821115611449575f80fd5b6114558783880161126b565b9350604086013591508082111561146a575f80fd5b506114778682870161121e565b9150509250925092565b5f5b8381101561149b578181015183820152602001611483565b50505f910152565b602081525f82518060208401526114c1816040850160208701611481565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215611530575f80fd5b813561059b81611065565b5f825161154c818460208701611481565b9190910192915050565b5f60208284031215611566575f80fd5b815161059b816111c1565b5f805f8060808587031215611584575f80fd5b505082516020840151604085015160609095015191969095509092509050565b5f80604083850312156115b5575f80fd5b505080516020909101519092909150565b5f82601f8301126115d5575f80fd5b815160206115e56110b883611042565b8083825260208201915060208460051b870101935086841115611606575f80fd5b602086015b848110156110fa578051835291830191830161160b565b5f82601f830112611631575f80fd5b815161163f6110b8826111d9565b818152846020838601011115611653575f80fd5b611411826020830160208701611481565b5f82601f830112611673575f80fd5b815160206116836110b883611042565b8083825260208201915060208460051b8701019350868411156116a4575f80fd5b602086015b848110156110fa5780516116bc81611065565b83529183019183016116a9565b5f805f805f805f60e0888a0312156116df575f80fd5b8751965060208801519550604088015167ffffffffffffffff80821115611704575f80fd5b6117108b838c016115c6565b965060608a0151915080821115611725575f80fd5b6117318b838c016115c6565b955060808a0151915080821115611746575f80fd5b6117528b838c016115c6565b945060a08a0151915080821115611767575f80fd5b6117738b838c01611622565b935060c08a0151915080821115611788575f80fd5b506117958a828b01611664565b91505092959891949750929550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f805f805f8060c087890312156117e6575f80fd5b8651955060208701519450604087015167ffffffffffffffff8082111561180b575f80fd5b6118178a838b016115c6565b9550606089015191508082111561182c575f80fd5b6118388a838b016115c6565b9450608089015191508082111561184d575f80fd5b6118598a838b01611664565b935060a089015191508082111561186e575f80fd5b5061187b89828a016115c6565b9150509295509295509295565b805160ff81168114611094575f80fd5b5f805f80608085870312156118ab575f80fd5b84519350602085015192506118c260408601611888565b91506118d060608601611888565b905092959194509250565b805161109481611065565b5f805f805f805f805f805f6101608c8e031215611901575f80fd5b8b519a5060208c0151995060408c015167ffffffffffffffff811115611925575f80fd5b6119318e828f016115c6565b99505060608c015167ffffffffffffffff81111561194d575f80fd5b6119598e828f016115c6565b98505060808c015167ffffffffffffffff811115611975575f80fd5b6119818e828f016115c6565b97505060a08c015167ffffffffffffffff81111561199d575f80fd5b6119a98e828f01611664565b96505060c08c0151945060e08c015193506101008c015192506101208c015191506119d76101408d016118db565b90509295989b509295989b9093969950565b5f805f805f805f80610100898b031215611a01575f80fd5b8851975060208901519650604089015167ffffffffffffffff80821115611a26575f80fd5b611a328c838d016115c6565b975060608b0151915080821115611a47575f80fd5b611a538c838d016115c6565b965060808b0151915080821115611a68575f80fd5b50611a758b828c01611664565b94505060a0890151925060c0890151915060e089015190509295985092959890939650565b5f805f805f60a08688031215611aae575f80fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176105b1576105b1611ad6565b808201808211156105b1576105b1611ad6565b5f82611b60577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b818103818111156105b1576105b1611ad656fea2646970667358221220f5b3562db099c7950031b7268b4097e294681bb9beeda6f18794e8a51b32d91c64736f6c63430008170033