0x608060405234801561001057600080fd5b50612b7c806100206000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c806370a08231116101455780638da5cb5b116100bd578063a87430ba1161008c578063c0c53b8b11610071578063c0c53b8b14610539578063c321ea3a1461054c578063f2fde38b1461055f57600080fd5b8063a87430ba146104db578063b6b55f251461052657600080fd5b80638da5cb5b1461049b57806393e59dc1146104ac57806395d89b41146104c05780639ab24eb0146104c857600080fd5b80637bb0a8a711610114578063854cff2f116100f9578063854cff2f1461044b5780638af8c76a1461045e5780638d7761ba1461048857600080fd5b80637bb0a8a7146104305780638456cb591461044357600080fd5b806370a08231146103f9578063715018a61461040c578063763265de146104145780637b1ba2501461042757600080fd5b8063402914f5116101d85780634e615a25116101a75780635c975abb1161018c5780635c975abb146103d3578063658b05ab146103de5780636e0d3235146103f157600080fd5b80634e615a25146103c15780634e71d92d146103cb57600080fd5b8063402914f514610334578063415fb1a0146103475780634209fff11461035a57806347ccca021461039657600080fd5b806323548b8b1161022f5780632e1a7d4d116102145780632e1a7d4d1461030a578063313ce5671461031d5780633f4ba83a1461032c57600080fd5b806323548b8b146102ee578063282a1129146102f757600080fd5b806306fdde03146102615780630b102d1a1461027f578063150b7a021461029457806318160ddd146102d8575b600080fd5b610269610572565b60405161027691906128e5565b60405180910390f35b61029261028d36600461292d565b610604565b005b6102a76102a236600461294a565b6106ca565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610276565b6102e06108d8565b604051908152602001610276565b6102e060fe5481565b6102926103053660046129e9565b6108e8565b6102926103183660046129e9565b610994565b60405160128152602001610276565b610292610b6b565b6102e061034236600461292d565b610bcf565b6102926103553660046129e9565b610c25565b61038661036836600461292d565b6001600160a01b031660009081526101026020526040902054151590565b6040519015158152602001610276565b60fd546103a9906001600160a01b031681565b6040516001600160a01b039091168152602001610276565b6102e06101005481565b610292610cd2565b60975460ff16610386565b60fb546103a9906001600160a01b031681565b610292610ddd565b6102e061040736600461292d565b610e84565b610292610ea2565b6102926104223660046129e9565b610f06565b6102e060ff5481565b60fc546103a9906001600160a01b031681565b610292610fb2565b61029261045936600461292d565b611014565b6102e061046c36600461292d565b6001600160a01b03166000908152610102602052604090205490565b61029261049636600461292d565b6110d6565b6033546001600160a01b03166103a9565b610101546103a9906001600160a01b031681565b610269611197565b6102e06104d636600461292d565b6111a6565b61050b6104e936600461292d565b6101026020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610276565b6102926105343660046129e9565b611228565b610292610547366004612a02565b6113a3565b6102e061055a36600461292d565b6115c1565b61029261056d36600461292d565b61163d565b606060cc805461058190612a4d565b80601f01602080910402602001604051908101604052809291908181526020018280546105ad90612a4d565b80156105fa5780601f106105cf576101008083540402835291602001916105fa565b820191906000526020600020905b8154815290600101906020018083116105dd57829003601f168201915b5050505050905090565b6033546001600160a01b031633146106635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166106a85760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b60fd80546001600160a01b0319166001600160a01b0392909216919091179055565b60006002606554141561071f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065a565b600260655560975460ff161561076a5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b60fd546001600160a01b031633146107c45760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c79206f68204e46542063616e2062652072656365697665640000000000604482015260640161065a565b6001600160a01b0385166000908152610102602052604090205461082a5760405162461bcd60e51b815260206004820152601160248201527f7573657220686173206e6f207374616b65000000000000000000000000000000604482015260640161065a565b6001600160a01b0385166000908152610102602052604090206002015415610855576108558561171f565b610860846001612a98565b6001600160a01b0386166000818152610102602052604080822060020193909355915186927f509de8640671d7778d0d1dd326a08f58a657a278f69945f1d6c840d9aaa9e87c91a3507f150b7a0200000000000000000000000000000000000000000000000000000000600160655595945050505050565b60006108e360cb5490565b905090565b6033546001600160a01b031633146109425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b8061098f5760405162461bcd60e51b815260206004820152601e60248201527f67656e65726174696f6e20726174652063616e6e6f74206265207a65726f0000604482015260640161065a565b60ff55565b600260655414156109e75760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065a565b600260655560975460ff1615610a325760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b60008111610aa85760405162461bcd60e51b815260206004820152602160248201527f616d6f756e7420746f2077697468647261772063616e6e6f74206265207a657260448201527f6f00000000000000000000000000000000000000000000000000000000000000606482015260840161065a565b3360009081526101026020526040902054811115610b085760405162461bcd60e51b815260206004820152601260248201527f6e6f7420656e6f7567682062616c616e63650000000000000000000000000000604482015260640161065a565b336000908152610102602052604081204260018201558054839290610b2e908490612ab0565b9091555060009050610b3f33610e84565b9050610b4b3382611877565b60fb54610b62906001600160a01b03163384611a1d565b50506001606555565b6033546001600160a01b03163314610bc55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b610bcd611ac6565b565b60006001600160a01b038216610c165760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b610c1f82611b62565b92915050565b6033546001600160a01b03163314610c7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b80610ccc5760405162461bcd60e51b815260206004820152601f60248201527f696e76566f74655468726573686f6c642063616e6e6f74206265207a65726f00604482015260640161065a565b61010055565b60026065541415610d255760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065a565b600260655560975460ff1615610d705760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b3360009081526101026020526040902054610dcd5760405162461bcd60e51b815260206004820152601160248201527f7573657220686173206e6f207374616b65000000000000000000000000000000604482015260640161065a565b610dd633611c16565b6001606555565b60026065541415610e305760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065a565b600260655560975460ff1615610e7b5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b610dd63361171f565b6001600160a01b038116600090815260c96020526040812054610c1f565b6033546001600160a01b03163314610efc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b610bcd6000611c8d565b6033546001600160a01b03163314610f605760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b80610fad5760405162461bcd60e51b815260206004820152601660248201527f6d6178206361702063616e6e6f74206265207a65726f00000000000000000000604482015260640161065a565b60fe55565b6033546001600160a01b0316331461100c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b610bcd611cdf565b6033546001600160a01b0316331461106e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b6001600160a01b0381166110b35760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b61010180546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b031633146111305760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b6001600160a01b0381166111755760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b60fc80546001600160a01b0319166001600160a01b0392909216919091179055565b606060cd805461058190612a4d565b6000806111b283610e84565b60fe546001600160a01b038516600090815261010260205260409020549192506111db91612ac7565b610100546111e99083612ac7565b11801561120e57506001600160a01b0383166000908152610102602052604090205415155b156112195792915050565b50600092915050565b50919050565b6002606554141561127b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065a565b600260655560975460ff16156112c65760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b600081116113165760405162461bcd60e51b815260206004820181905260248201527f616d6f756e7420746f206465706f7369742063616e6e6f74206265207a65726f604482015260640161065a565b61131f33611d5a565b3360009081526101026020526040902054156113695761133e33611c16565b33600090815261010260205260408120805483929061135e908490612a98565b909155506113839050565b336000908152610102602052604090204260018201558190555b60fb5461139b906001600160a01b0316333084611e89565b506001606555565b600054610100900460ff16806113bc575060005460ff16155b61141f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff16158015611441576000805461ffff19166101011790555b6001600160a01b0383166114865760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b6001600160a01b0384166114cb5760405162461bcd60e51b815260206004820152600c60248201526b7a65726f206164647265737360a01b604482015260640161065a565b61153f6040518060400160405280601081526020017f566f74652d457363726f776564204f68000000000000000000000000000000008152506040518060400160405280600481526020017f76654f4800000000000000000000000000000000000000000000000000000000815250611eda565b611547611fa0565b61154f612062565b611557612119565b65038973d73e3860ff55606460fe5560146101005560fc80546001600160a01b038086166001600160a01b03199283161790925560fb805487841690831617905560fd80549285169290911691909117905580156115bb576000805461ff00191690555b50505050565b6001600160a01b038116600090815261010260205260408120600201548061162b5760405162461bcd60e51b815260206004820152600b60248201527f6e6f74207374616b696e67000000000000000000000000000000000000000000604482015260640161065a565b611636600182612ab0565b9392505050565b6033546001600160a01b031633146116975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161065a565b6001600160a01b0381166117135760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065a565b61171c81611c8d565b50565b6001600160a01b03811660009081526101026020526040902060020154806117895760405162461bcd60e51b815260206004820152601060248201527f4e6f204e4654206973207374616b656400000000000000000000000000000000604482015260640161065a565b6000611796600183612ab0565b60fd546040517fb88d4fde0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03868116602483015260448201849052608060648301526000608483015292935091169063b88d4fde9060a401600060405180830381600087803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050506001600160a01b03841660008181526101026020526040808220600201829055518493507f907f42c5e4fa415ada95eb1fe1c3be76694b6facbd23560f0733f10d2d28ab849190a3505050565b6001600160a01b0382166118f35760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161065a565b6001600160a01b038216600090815260c96020526040902054818110156119825760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f6365000000000000000000000000000000000000000000000000000000000000606482015260840161065a565b6001600160a01b038316600090815260c960205260408120838303905560cb80548492906119b1908490612ab0565b90915550506040518281526001600160a01b038416907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59060200160405180910390a26001600160a01b038316600090815260c96020526040902054611a189084906121d5565b505050565b6040516001600160a01b038316602482015260448101829052611a189084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612258565b60975460ff16611b185760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161065a565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03811660009081526101026020526040812060018101548290611b8c9042612ab0565b90506000611bab836000015460ff5484611ba69190612ac7565b61233d565b90506000611bb886610e84565b9050600060fe548560000154611bce9190612ac7565b905080821015611c095780611be38484612a98565b1115611bfe57611bf38282612ab0565b979650505050505050565b509095945050505050565b5060009695505050505050565b6000611c2182611b62565b6001600160a01b0383166000908152610102602052604090204260019091015590508015611c895760405181906001600160a01b038416907fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a90600090a3611c898282612371565b5050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60975460ff1615611d255760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161065a565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611b453390565b6001600160a01b038116321461171c57610101546001600160a01b031615801590611e175750610101546040517fc23697a80000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301529091169063c23697a89060240160206040518083038186803b158015611ddf57600080fd5b505afa158015611df3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e179190612ae6565b61171c5760405162461bcd60e51b815260206004820152602560248201527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c60448201527f6c6f776564000000000000000000000000000000000000000000000000000000606482015260840161065a565b6040516001600160a01b03808516602483015283166044820152606481018290526115bb9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611a62565b600054610100900460ff1680611ef3575060005460ff16155b611f565760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff16158015611f78576000805461ffff19166101011790555b611f8061246d565b611f8a838361251e565b8015611a18576000805461ff0019169055505050565b600054610100900460ff1680611fb9575060005460ff16155b61201c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff1615801561203e576000805461ffff19166101011790555b61204661246d565b61204e6125fa565b801561171c576000805461ff001916905550565b600054610100900460ff168061207b575060005460ff16155b6120de5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff16158015612100576000805461ffff19166101011790555b6001606555801561171c576000805461ff001916905550565b600054610100900460ff1680612132575060005460ff16155b6121955760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff161580156121b7576000805461ffff19166101011790555b6097805460ff19169055801561171c576000805461ff001916905550565b60fc546040517f4f00a93e0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526024820184905290911690634f00a93e90604401600060405180830381600087803b15801561223c57600080fd5b505af1158015612250573d6000803e3d6000fd5b505050505050565b60006122ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166126a19092919063ffffffff16565b805190915015611a1857808060200190518101906122cb9190612ae6565b611a185760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161065a565b6000670de0b6b3a7640000612353600282612b08565b61235d8486612ac7565b6123679190612a98565b6116369190612b08565b6001600160a01b0382166123c75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161065a565b8060cb60008282546123d99190612a98565b90915550506001600160a01b038216600090815260c9602052604081208054839290612406908490612a98565b90915550506040518181526001600160a01b038316907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a26001600160a01b038216600090815260c96020526040902054611c899083906121d5565b600054610100900460ff1680612486575060005460ff16155b6124e95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff1615801561204e576000805461ffff1916610101179055801561171c576000805461ff001916905550565b600054610100900460ff1680612537575060005460ff16155b61259a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff161580156125bc576000805461ffff19166101011790555b82516125cf9060cc906020860190612820565b5081516125e39060cd906020850190612820565b508015611a18576000805461ff0019169055505050565b600054610100900460ff1680612613575060005460ff16155b6126765760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161065a565b600054610100900460ff16158015612698576000805461ffff19166101011790555b61204e33611c8d565b60606126b084846000856126b8565b949350505050565b6060824710156127305760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161065a565b843b61277e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161065a565b600080866001600160a01b0316858760405161279a9190612b2a565b60006040518083038185875af1925050503d80600081146127d7576040519150601f19603f3d011682016040523d82523d6000602084013e6127dc565b606091505b5091509150611bf3828286606083156127f6575081611636565b8251156128065782518084602001fd5b8160405162461bcd60e51b815260040161065a91906128e5565b82805461282c90612a4d565b90600052602060002090601f01602090048101928261284e5760008555612894565b82601f1061286757805160ff1916838001178555612894565b82800160010185558215612894579182015b82811115612894578251825591602001919060010190612879565b506128a09291506128a4565b5090565b5b808211156128a057600081556001016128a5565b60005b838110156128d45781810151838201526020016128bc565b838111156115bb5750506000910152565b60208152600082518060208401526129048160408501602087016128b9565b601f01601f19169190910160400192915050565b6001600160a01b038116811461171c57600080fd5b60006020828403121561293f57600080fd5b813561163681612918565b60008060008060006080868803121561296257600080fd5b853561296d81612918565b9450602086013561297d81612918565b935060408601359250606086013567ffffffffffffffff808211156129a157600080fd5b818801915088601f8301126129b557600080fd5b8135818111156129c457600080fd5b8960208285010111156129d657600080fd5b9699959850939650602001949392505050565b6000602082840312156129fb57600080fd5b5035919050565b600080600060608486031215612a1757600080fd5b8335612a2281612918565b92506020840135612a3281612918565b91506040840135612a4281612918565b809150509250925092565b600181811c90821680612a6157607f821691505b6020821081141561122257634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115612aab57612aab612a82565b500190565b600082821015612ac257612ac2612a82565b500390565b6000816000190483118215151615612ae157612ae1612a82565b500290565b600060208284031215612af857600080fd5b8151801515811461163657600080fd5b600082612b2557634e487b7160e01b600052601260045260246000fd5b500490565b60008251612b3c8184602087016128b9565b919091019291505056fea2646970667358221220579e59db7cfe046cd6429f6ec72bfe866fb1628401d89cf4d2dc002981b9f5bd64736f6c63430008090033