0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120908061007e6000396000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c8063715018a6116100d8578063b6a5d7de1161008c578063f2fde38b11610066578063f2fde38b14610322578063f5619fda14610335578063fe9fbb801461035057600080fd5b8063b6a5d7de146102e8578063b70e6be6146102fb578063eb8695ef1461030f57600080fd5b80637ca5b1dd116100bd5780637ca5b1dd146102a65780638da5cb5b146102b957806395410d2b146102d457600080fd5b8063715018a61461026a578063766718081461027257600080fd5b806327c97fa51161013a5780634ca49f51116101145780634ca49f5114610220578063620414e6146102335780636defbf801461024657600080fd5b806327c97fa5146101fa5780632b97be241461020d5780633a1b77b01461021557600080fd5b8063113764be1161016b578063113764be146101ca578063189179a3146101d257806319c9aa32146101e557600080fd5b806306a274221461018757806310b76ed8146101ad575b600080fd5b61019a610195366004611c30565b610373565b6040519081526020015b60405180910390f35b6101b561038a565b604080519283526020830191909152016101a4565b60025461019a565b6101b56101e0366004611c5f565b6103ea565b6101f86101f3366004611d2d565b6107e2565b005b6101f8610208366004611d48565b6109d5565b60035461019a565b6002546003546101b5565b6101f861022e366004611d71565b610a2e565b61019a610241366004611c30565b610df7565b60005461025a90600160a01b900460ff1681565b60405190151581526020016101a4565b6101f8610f07565b60015461028d90600160401b900467ffffffffffffffff1681565b60405167ffffffffffffffff90911681526020016101a4565b6101f86102b4366004611c5f565b610f1b565b6000546040516001600160a01b0390911681526020016101a4565b60005461025a90600160a81b900460ff1681565b6101f86102f6366004611d48565b6114b9565b60015461028d9067ffffffffffffffff1681565b6101f861031d366004611dfa565b611515565b6101f8610330366004611d48565b611585565b60005461028d90600160b01b900467ffffffffffffffff1681565b61025a61035e366004611d48565b60056020526000908152604090205460ff1681565b60006103846102416107e084611e48565b92915050565b60015460009081906103a89067ffffffffffffffff166107e0611e5c565b60015467ffffffffffffffff91821693506103ce91600160401b909104166107e0611e5c565b6103da906107df611e88565b67ffffffffffffffff1690509091565b600080605083516103fb9190611eb0565b1561044d5760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e677468000000000000000000000060448201526064015b60405180910390fd5b6050835161045b9190611e48565b905060018111801561046e57506107e081105b6104ba5760405162461bcd60e51b815260206004820152601960248201527f496e76616c6964206e756d626572206f662068656164657273000000000000006044820152606401610444565b6104c383611615565b63ffffffff1691506000806104d9858280611649565b6040805180820182526000808252602080830182905260015467ffffffffffffffff600160401b90910416808352600482529184902084518086019095525463ffffffff8116855264010000000090046001600160e01b031690840152939550919350909190825b815163ffffffff1688101561059f5761055b600184611ec4565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820152909350919050610541565b815163ffffffff166106195760405162461bcd60e51b815260206004820152602b60248201527f43616e6e6f742076616c696461746520636861696e73206265666f726520726560448201527f6c61792067656e657369730000000000000000000000000000000000000000006064820152608401610444565b81602001516001600160e01b031685146106e35780602001516001600160e01b03168503610649579050826106e3565b610654600184611ec4565b60008181526004602090815260409182902082518084019093525463ffffffff8116835264010000000090046001600160e01b031690820181905291945092915085146106e35760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610444565b60015b878110156107d65760006107058b6106ff846050611ed7565b8a611649565b60208601519098509091506001600160e01b031687146107c257600061073661072f846050611ed7565b8d90611721565b845163ffffffff9182169250161580159061075d575083602001516001600160e01b031688145b801561076f5750835163ffffffff1681145b6107bb5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c69642074617267657420696e2068656164657220636861696e00006044820152606401610444565b5091925084915b9650806107ce81611eee565b9150506106e6565b50505050505050915091565b600054600160a01b900460ff1661083b5760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610444565b610843611742565b6107e08167ffffffffffffffff161061089e5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610444565b60008167ffffffffffffffff16116108f85760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610444565b60005467ffffffffffffffff600160b01b90910481169082160361095e5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820756e6368616e676564000000000000000000006044820152606401610444565b600080547fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff16600160b01b67ffffffffffffffff8416908102919091179091556040519081527f3e9f904d8cf11753c79b67c8259c582056d4a7d8af120f81257a59eeb8824b96906020015b60405180910390a150565b6109dd611742565b6001600160a01b038116600081815260056020908152604091829020805460ff1916905590519182527f7498b96beeabea5ad3139f1a2861a03e480034254e36b10aae2e6e42ad7b4b6891016109ca565b610a36611742565b600054600160a01b900460ff1615610a905760405162461bcd60e51b815260206004820152601960248201527f47656e6573697320616c726561647920706572666f726d6564000000000000006044820152606401610444565b60508314610ae05760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642067656e6573697320686561646572206c656e6774680000006044820152606401610444565b610aec6107e083611eb0565b15610b5f5760405162461bcd60e51b815260206004820152602560248201527f496e76616c696420686569676874206f662072656c61792067656e657369732060448201527f626c6f636b0000000000000000000000000000000000000000000000000000006064820152608401610444565b6107e08167ffffffffffffffff1610610bba5760405162461bcd60e51b815260206004820152601660248201527f50726f6f66206c656e67746820657863657373697665000000000000000000006044820152606401610444565b60008167ffffffffffffffff1611610c145760405162461bcd60e51b815260206004820152601c60248201527f50726f6f66206c656e677468206d6179206e6f74206265207a65726f000000006044820152606401610444565b610c206107e083611e48565b600180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001667ffffffffffffffff92909216918217600160401b92909202919091179055604080516020601f8601819004810282018101909252848152600091610ca69190879087908190840183828082843760009201919091525061179c92505050565b90506000610ce986868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061161592505050565b60408051808201825263ffffffff9283168082526001600160e01b03808716602080850191825260015467ffffffffffffffff9081166000908152600490925295812094519151909216640100000000029516949094179091558254918616600160b01b027fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff909216919091179091559050610d84826117a9565b600255600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790556040517f2381d16925551c2fb1a5edfcf4fce2f6d085e1f85f4b88340c09c9d191f9d4e990610de79086815260200190565b60405180910390a1505050505050565b60015460009067ffffffffffffffff16821015610e565760405162461bcd60e51b815260206004820152601d60248201527f45706f6368206973206265666f72652072656c61792067656e657369730000006044820152606401610444565b600154600160401b900467ffffffffffffffff16821115610ede5760405162461bcd60e51b8152602060048201526024808201527f45706f6368206973206e6f742070726f76656e20746f207468652072656c617960448201527f20796574000000000000000000000000000000000000000000000000000000006064820152608401610444565b6000828152600460205260409020546103849064010000000090046001600160e01b03166117a9565b610f0f611742565b610f1960006117d1565b565b600054600160a01b900460ff16610f745760405162461bcd60e51b815260206004820152601a60248201527f52656c6179206973206e6f7420726561647920666f72207573650000000000006044820152606401610444565b600054600160a81b900460ff1615610fe5573360009081526005602052604090205460ff16610fe55760405162461bcd60e51b815260206004820152601660248201527f5375626d697474657220756e617574686f72697a6564000000000000000000006044820152606401610444565b60005461100490600160b01b900467ffffffffffffffff166002611e5c565b61100f906050611e5c565b67ffffffffffffffff168151146110685760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420686561646572206c656e67746800000000000000000000006044820152606401610444565b600154600160401b900467ffffffffffffffff166000908152600460205260408120805490916401000000009091046001600160e01b031690805b600054600160b01b900467ffffffffffffffff16811015611164576000806110d6876110d0856050611ed7565b86611649565b9150915084811461114f5760405162461bcd60e51b815260206004820152602660248201527f496e76616c69642074617267657420696e207072652d7265746172676574206860448201527f65616465727300000000000000000000000000000000000000000000000000006064820152608401610444565b5091508061115c81611eee565b9150506110a3565b50600080546111a69061118a90600190600160b01b900467ffffffffffffffff16611f07565b611195906050611e5c565b869067ffffffffffffffff16611721565b63ffffffff1690504281106111fd5760405162461bcd60e51b815260206004820152601e60248201527f45706f63682063616e6e6f7420656e6420696e207468652066757475726500006044820152606401610444565b835460009061121490859063ffffffff1684611839565b9050600080611250600060169054906101000a900467ffffffffffffffff16605061123f9190611e5c565b899067ffffffffffffffff16611721565b60005463ffffffff919091169150600160b01b900467ffffffffffffffff165b60005461128f90600160b01b900467ffffffffffffffff166002611e5c565b67ffffffffffffffff168110156113a1576000806112b28b6106ff856050611ed7565b91509150846000036113175780945080861681146113125760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642074617267657420696e206e65772065706f636800000000006044820152606401610444565b61138c565b84811461138c5760405162461bcd60e51b815260206004820152602760248201527f556e657870656374656420746172676574206368616e6765206166746572207260448201527f65746172676574000000000000000000000000000000000000000000000000006064820152608401610444565b5095508061139981611eee565b915050611270565b50600160089054906101000a900467ffffffffffffffff1660016113c59190611e88565b6001805467ffffffffffffffff928316600160401b9081027fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff909216919091179182905560408051808201825263ffffffff80871682526001600160e01b0380891660208085019182529590960490961660009081526004909452918320905193519094166401000000000292169190911790915560025490611467846117a9565b6003839055600281905560408051848152602081018390529192507fa282ee798b132f9dc11e06cd4d8e767e562be8709602ca14fea7ab3392acbdab910160405180910390a150505050505050505050565b6114c1611742565b6001600160a01b038116600081815260056020908152604091829020805460ff1916600117905590519182527fd53649b492f738bb59d6825099b5955073efda0bf9e3a7ad20da22e110122e2991016109ca565b61151d611742565b60008054821515600160a81b027fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff9091161790556040517fd813b248d49c8bf08be2b6947126da6763df310beed7bea97756456c5727419a906109ca90831515815260200190565b61158d611742565b6001600160a01b0381166116095760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610444565b611612816117d1565b50565b6000610384611623836118cd565b60d881901c63ff00ff001662ff00ff60e89290921c9190911617601081811b91901c1790565b60008082156116a95761165d8585856118da565b6116a95760405162461bcd60e51b815260206004820152600d60248201527f496e76616c696420636861696e000000000000000000000000000000000000006044820152606401610444565b6116b38585611905565b90506116c1858560506119a7565b91506116cd82826119d1565b6117195760405162461bcd60e51b815260206004820152600c60248201527f496e76616c696420776f726b00000000000000000000000000000000000000006044820152606401610444565b935093915050565b600061173b611623611734846044611f28565b8590611b2a565b9392505050565b6000546001600160a01b03163314610f195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610444565b6000610384826000611905565b60006103847bffff000000000000000000000000000000000000000000000000000083611b39565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806118468385611b45565b9050611856621275006004611b39565b81101561186e5761186b621275006004611b39565b90505b61187c621275006004611ba1565b81111561189457611891621275006004611ba1565b90505b60006118ad826118a78862010000611b39565b90611ba1565b90506118c3620100006118a78362127500611b39565b9695505050505050565b6000610384826044611b2a565b6000806118e78585611c17565b90508281146118fa57600091505061173b565b506001949350505050565b600080611916611734846048611f28565b60e81c905060008461192985604b611f28565b8151811061193957611939611f3b565b016020015160f81c9050600061196d83600060108262ffffff16901c8261ff001660108462ffffff16901b17179050919050565b62ffffff1690506000611981600384611f51565b60ff1690506119928161010061204e565b61199c9083611ed7565b979650505050505050565b6000602060008385602001870160025afa50602060006020600060025afa50506000519392505050565b6000826119e057506000610384565b81611b228460008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b600882901c7eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff161790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b601082901c7dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff161790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b602082901c7bffffffff00000000ffffffff00000000ffffffff00000000ffffffff1617905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b604082901c77ffffffffffffffff0000000000000000ffffffffffffffff16179050608081901b608082901c179050919050565b109392505050565b600061173b8383016020015190565b600061173b8284611e48565b600082821115611b975760405162461bcd60e51b815260206004820152601d60248201527f556e646572666c6f7720647572696e67207375627472616374696f6e2e0000006044820152606401610444565b61173b8284611ec4565b600082600003611bb357506000610384565b611bbd8284611ed7565b905081611bca8483611e48565b146103845760405162461bcd60e51b815260206004820152601f60248201527f4f766572666c6f7720647572696e67206d756c7469706c69636174696f6e2e006044820152606401610444565b600061173b611c27836004611f28565b84016020015190565b600060208284031215611c4257600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611c7157600080fd5b813567ffffffffffffffff80821115611c8957600080fd5b818401915084601f830112611c9d57600080fd5b813581811115611caf57611caf611c49565b604051601f8201601f19908116603f01168101908382118183101715611cd757611cd7611c49565b81604052828152876020848701011115611cf057600080fd5b826020860160208301376000928101602001929092525095945050505050565b803567ffffffffffffffff81168114611d2857600080fd5b919050565b600060208284031215611d3f57600080fd5b61173b82611d10565b600060208284031215611d5a57600080fd5b81356001600160a01b038116811461173b57600080fd5b60008060008060608587031215611d8757600080fd5b843567ffffffffffffffff80821115611d9f57600080fd5b818701915087601f830112611db357600080fd5b813581811115611dc257600080fd5b886020828501011115611dd457600080fd5b602092830196509450508501359150611def60408601611d10565b905092959194509250565b600060208284031215611e0c57600080fd5b8135801515811461173b57600080fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082611e5757611e57611e1c565b500490565b67ffffffffffffffff818116838216028082169190828114611e8057611e80611e32565b505092915050565b67ffffffffffffffff818116838216019080821115611ea957611ea9611e32565b5092915050565b600082611ebf57611ebf611e1c565b500690565b8181038181111561038457610384611e32565b808202811582820484141761038457610384611e32565b600060018201611f0057611f00611e32565b5060010190565b67ffffffffffffffff828116828216039080821115611ea957611ea9611e32565b8082018082111561038457610384611e32565b634e487b7160e01b600052603260045260246000fd5b60ff828116828216039081111561038457610384611e32565b600181815b80851115611fa5578160001904821115611f8b57611f8b611e32565b80851615611f9857918102915b93841c9390800290611f6f565b509250929050565b600082611fbc57506001610384565b81611fc957506000610384565b8160018114611fdf5760028114611fe957612005565b6001915050610384565b60ff841115611ffa57611ffa611e32565b50506001821b610384565b5060208310610133831016604e8410600b8410161715612028575081810a610384565b6120328383611f6a565b806000190482111561204657612046611e32565b029392505050565b600061173b8383611fad56fea2646970667358221220dfe2cb222f0d292abaec9ca2b42be00ff67f4145592c9e4caf517cc2d7b4dd9564736f6c63430008110033