0x60e060405234801561001057600080fd5b506040516120db3803806120db8339818101604052608081101561003357600080fd5b5080516020820151604083015160609093015191929091836001600160a01b0381166100a6576040805162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b038316908117825560408051928352602083019190915280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a1506001600160601b0319606084811b821660805283901b1660a0526001600160e81b031960e882901b1660c0526001600160a01b03928316935091169062ffffff16611f326101a960003980610470528061089e5280610afb5280610b4d52806115065280611558525080610446528061080052806109d95280610a3f5280610b2352806114e552806115375280611618528061164d5250806108595280610c2a5250611f326000f3fe608060405234801561001057600080fd5b50600436106100ff5760003560e01c80636a3b312a116100975780638da5cb5b116100665780638da5cb5b1461035a5780638f5dab9a1461036257806390a3ad8a146103c8578063a6fe34c614610403576100ff565b80636a3b312a146102895780636f60a6dd146102eb57806379ba50971461030b5780637c66194914610313576100ff565b80633fc8cef3116100d35780633fc8cef31461021557806353a47bb71461021d57806357fa59eb146102255780635b54918214610281576100ff565b806213b4fc1461010457806301276acf14610155578063100293631461019b5780631627540c146101e2575b600080fd5b6101436004803603606081101561011a57600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135169060400135610442565b60408051918252519081900360200190f35b6101726004803603602081101561016b57600080fd5b50356104b4565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101e0600480360360608110156101b157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135821691604090910135166104dc565b005b6101e0600480360360208110156101f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661077d565b6101726107fe565b610172610822565b6101436004803603608081101561023b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916fffffffffffffffffffffffffffffffff60208201351691604082013516906060013560020b61083e565b610172610857565b6102c86004803603604081101561029f57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013563ffffffff1661087b565b604051808360020b81526020018260020b81526020019250505060405180910390f35b6102f361089c565b6040805162ffffff9092168252519081900360200190f35b6101e06108c0565b6101436004803603608081101561032957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359160408201351690606001356109d5565b610172610aa8565b610143600480360360a081101561037857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916fffffffffffffffffffffffffffffffff60208201351691604082013516906060810135600290810b9160800135900b610ac4565b610172600480360360408110156103de57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610aef565b6101436004803603606081101561041957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060208101359060400135610b1f565b60007f00000000000000000000000000000000000000000000000000000000000000008161049961049483877f0000000000000000000000000000000000000000000000000000000000000000610b80565b610bfd565b90506104a88287878488610c57565b925050505b9392505050565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6104e4610d00565b60006104f284846000610b80565b905073ffffffffffffffffffffffffffffffffffffffff8216156106a4578173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561055657600080fd5b505afa15801561056a573d6000803e3d6000fd5b505050506040513d602081101561058057600080fd5b5051815173ffffffffffffffffffffffffffffffffffffffff908116911614801561063957508173ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156105ec57600080fd5b505afa158015610600573d6000803e3d6000fd5b505050506040513d602081101561061657600080fd5b5051602082015173ffffffffffffffffffffffffffffffffffffffff9081169116145b6106a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f546f6b656e73206f7220706f6f6c206e6f7420636f7272656374000000000000604482015290519081900360640190fd5b81600260006106b284610d72565b815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff167f76d683f3326e6913c1fff58cb28067086c5aac10adc538d52aa74a3db0d24d8760405160405180910390a450505050565b610785610d00565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229181900360200190a150565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b600061084c82858786610dcf565b90505b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061088784610f78565b915061089384846110f9565b90509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015473ffffffffffffffffffffffffffffffffffffffff163314610930576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180611e996035913960400191505060405180910390fd5b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015280517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9281900390910190a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610a3d57610a36848484610442565b905061084f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a9c57610a36858584610b1f565b610a3685858585611490565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b6000610ae586866fffffffffffffffffffffffffffffffff16868686611605565b9695505050505050565b60006104ad61049484847f0000000000000000000000000000000000000000000000000000000000000000610b80565b60007f000000000000000000000000000000000000000000000000000000000000000081610b7161049487847f0000000000000000000000000000000000000000000000000000000000000000610b80565b90506104a88686848488610c57565b610b88611e78565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161115610bc0579192915b506040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815292909316602083015262ffffff169181019190915290565b6000610c088261167d565b905073ffffffffffffffffffffffffffffffffffffffff8116610c5257610c4f7f0000000000000000000000000000000000000000000000000000000000000000836116b9565b90505b919050565b600080610c6384610f78565b60020b90506000610c7c85610c77866117ef565b6110f9565b60020b905060008673ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff161015610ccd57818312610cc45781610cc6565b825b9050610cdf565b818313610cda5781610cdc565b825b90505b610cf381610cec8a611802565b8b8a610dcf565b9998505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180611ece602f913960400191505060405180910390fd5b565b8051602091820151604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b8116828701529290931b90911660348301528051602881840301815260489092019052805191012090565b600080610ddb86611821565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff821611610ea95773ffffffffffffffffffffffffffffffffffffffff80821680029084811690861610610e6b57610e667801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683611bb4565b610ea1565b610ea181876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000611bb4565b925050610f6f565b6000610ed573ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000611bb4565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1610610f3d57610f38700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683611bb4565b610f6b565b610f6b81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000611bb4565b9250505b50949350505050565b6000806000808473ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d60e0811015610fee57600080fd5b50602081015160408083015160609093015181517f252c09d700000000000000000000000000000000000000000000000000000000815261ffff851660048201529151929650929450919250600091829173ffffffffffffffffffffffffffffffffffffffff89169163252c09d7916024808301926080929190829003018186803b15801561107c57600080fd5b505afa158015611090573d6000803e3d6000fd5b505050506040513d60808110156110a657600080fd5b50805160209091015190925090506110bd82611c81565b156110ca578495506110ef565b6000806110da8960018888611c91565b915091506110ea84848484611dd8565b975050505b5050505050919050565b600063ffffffff821661116d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f4250000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080516002808252606082018352600092602083019080368337019050509050828160008151811061119c57fe5b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106111c557fe5b63ffffffff9092166020928302919091018201526040517f883bdbfd0000000000000000000000000000000000000000000000000000000081526004810182815283516024830152835160009373ffffffffffffffffffffffffffffffffffffffff89169363883bdbfd938793909283926044019185820191028083838b5b8381101561125c578181015183820152602001611244565b505050509050019250505060006040518083038186803b15801561127f57600080fd5b505afa158015611293573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160409081528110156112da57600080fd5b81019080805160405193929190846401000000008211156112fa57600080fd5b90830190602082018581111561130f57600080fd5b825186602082028301116401000000008211171561132c57600080fd5b82525081516020918201928201910280838360005b83811015611359578181015183820152602001611341565b505050509050016040526020018051604051939291908464010000000082111561138257600080fd5b90830190602082018581111561139757600080fd5b82518660208202830111640100000000821117156113b457600080fd5b82525081516020918201928201910280838360005b838110156113e15781810151838201526020016113c9565b5050505090500160405250505050905060008160008151811061140057fe5b60200260200101518260018151811061141557fe5b60200260200101510390508463ffffffff168160060b8161143257fe5b05935060008160060b12801561145c57508463ffffffff168160060b8161145557fe5b0760060b15155b15611487577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909301925b50505092915050565b6000806114a76114a287866000610b80565b61167d565b905073ffffffffffffffffffffffffffffffffffffffff8116156114da576114d28686868487610c57565b91505061084f565b600061152a610494887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610b80565b9050600061157c610494877f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610b80565b9050600061158983610f78565b9050600061159683610f78565b905060006115a78b8b8b8686611605565b905060006115b4896117ef565b905060006115c287836110f9565b905060006115d087846110f9565b905060006115e18f8f8f8686611605565b90508085106115f057806115f2565b845b9f9e505050505050505050505050505050565b60008061163c8461161588611802565b897f0000000000000000000000000000000000000000000000000000000000000000610dcf565b90506116728361164b83611802565b7f000000000000000000000000000000000000000000000000000000000000000088610dcf565b979650505050505050565b60006002600061168c84610d72565b815260208101919091526040016000205473ffffffffffffffffffffffffffffffffffffffff1692915050565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16106116fb57600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b8063ffffffff81168114610c5257600080fd5b806fffffffffffffffffffffffffffffffff81168114610c5257600080fd5b60008060008360020b12611838578260020b611840565b8260020b6000035b9050620d89e88111156118b457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600160248201527f5400000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000600182166118d5577001000000000000000000000000000000006118e7565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff169050600282161561191b576ffff97272373d413259a46990580e213a0260801c5b600482161561193a576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611959576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611978576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615611997576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156119b6576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156119d5576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156119f5576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611a15576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611a35576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611a55576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611a75576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615611a95576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615611ab5576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615611ad5576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611af6576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611b16576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611b35576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611b52576b048a170391f7dc42444e8fa20260801c5b60008460020b1315611b8b57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81611b8757fe5b0490505b640100000000810615611b9f576001611ba2565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870986860292508281109083900303905080611c085760008411611bfd57600080fd5b5082900490506104ad565b808411611c1457600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b4263ffffffff9081169116141590565b60008060005b80158015611cac57508361ffff168661ffff16105b15611d62576000611cbe878787611e52565b90508773ffffffffffffffffffffffffffffffffffffffff1663252c09d7826040518263ffffffff1660e01b8152600401808261ffff16815260200191505060806040518083038186803b158015611d1557600080fd5b505afa158015611d29573d6000803e3d6000fd5b505050506040513d6080811015611d3f57600080fd5b50805160208201516060909201516001909901989095509093509150611c979050565b80611dce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f4243000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5094509492505050565b600082850382850363ffffffff8216600682900b81611df357fe5b05925060008160060b128015611e1d57508163ffffffff168160060b81611e1657fe5b0760060b15155b15611e48577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201915b5050949350505050565b60008361ffff168361ffff161015611e6f575082810382016104ad565b508282036104ad565b60408051606081018252600080825260208201819052918101919091529056fe596f75206d757374206265206e6f6d696e61746564206265666f726520796f752063616e20616363657074206f776e6572736869704f6e6c792074686520636f6e7472616374206f776e6572206d617920706572666f726d207468697320616374696f6ea26469706673582212205d3a6636c62dfeff0bb6365e368792819476518a2b8f5b2f157dc04741275f4d64736f6c63430007060033000000000000000000000000eb3107117fead7de89cd14d463d340a2e69177690000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb8