0x608060405234801561001057600080fd5b50611fb5806100206000396000f3fe6080604052600436106101b75760003560e01c80636981c7ae116100ec578063907064251161008a578063bc124cfd11610064578063bc124cfd146105bb578063d547741f14610630578063dbd5733714610650578063ebb19c1a1461067057600080fd5b8063907064251461057057806391d1485414610586578063a217fddf146105a657600080fd5b8063797669c9116100c6578063797669c9146104d757806381fd01ea146104f95780638bb6b7f91461052e5780638e8a41311461054e57600080fd5b80636981c7ae1461043e5780636d048d531461045e5780637420b62b146104a457600080fd5b8063364456361161015957806341f2231a1161013357806341f2231a146103c0578063465d98a3146103d35780634df86126146104085780635ff22c421461041e57600080fd5b8063364456361461034857806336568abe14610368578063407e906e1461038857600080fd5b80631c4b995a116101955780631c4b995a1461027e578063248a9ca31461029e57806329f839b2146102dc5780632f2ff15d1461032857600080fd5b806301ffc9a7146101bc578063079957a9146101f1578063086dc12614610213575b600080fd5b3480156101c857600080fd5b506101dc6101d7366004611831565b610690565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061021161020c366004611872565b6106c7565b005b34801561021f57600080fd5b5061025961022e3660046118ba565b6098602052600090815260409020805460018201546002909201546001600160401b03909116919083565b604080516001600160401b0390941684526020840192909252908201526060016101e8565b34801561028a57600080fd5b506102116102993660046118d7565b610824565b3480156102aa57600080fd5b506102ce6102b936600461191c565b60009081526065602052604090206001015490565b6040519081526020016101e8565b3480156102e857600080fd5b506102fc6102f73660046118ba565b6109b0565b6040805160ff90951685526001600160401b0390931660208501529183015260608201526080016101e8565b34801561033457600080fd5b50610211610343366004611935565b610a3f565b34801561035457600080fd5b506102116103633660046118ba565b610a69565b34801561037457600080fd5b50610211610383366004611935565b610b09565b34801561039457600080fd5b506097546103a8906001600160a01b031681565b6040516001600160a01b0390911681526020016101e8565b6102ce6103ce366004611ab6565b610b87565b3480156103df57600080fd5b506097546103f590600160a81b900461ffff1681565b60405161ffff90911681526020016101e8565b34801561041457600080fd5b506103f5610e1081565b34801561042a57600080fd5b506102116104393660046118ba565b610c01565b34801561044a57600080fd5b506102116104593660046118ba565b610d24565b34801561046a57600080fd5b506102596104793660046118ba565b6099602052600090815260409020805460018201546002909201546001600160401b03909116919083565b3480156104b057600080fd5b506097546104c590600160a01b900460ff1681565b60405160ff90911681526020016101e8565b3480156104e357600080fd5b506102ce600080516020611f6083398151915281565b34801561050557600080fd5b50610519610514366004611b82565b610dc4565b604080519283526020830191909152016101e8565b34801561053a57600080fd5b506102116105493660046118ba565b610e36565b34801561055a57600080fd5b506097546103f590600160b81b900461ffff1681565b34801561057c57600080fd5b506103f561271081565b34801561059257600080fd5b506101dc6105a1366004611935565b610f0c565b3480156105b257600080fd5b506102ce600081565b3480156105c757600080fd5b506102fc6105d63660046118ba565b6001600160a01b0316600090815260996020908152604091829020825160608101845281546001600160401b031680825260018301549382018490526002909201549301839052609754600160a01b900460ff1693909290565b34801561063c57600080fd5b5061021161064b366004611935565b610f37565b34801561065c57600080fd5b506102ce61066b3660046118ba565b610f5c565b34801561067c57600080fd5b5061051961068b366004611b82565b6110bf565b60006001600160e01b03198216637965db0b60e01b14806106c157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106df600080516020611f6083398151915233610f0c565b6107305760405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f7420746865206d6f64657261746f72000000000060448201526064015b60405180910390fd5b61271061ffff83161180159061074c575061271061ffff821611155b6107af5760405162461bcd60e51b815260206004820152602e60248201527f50726963654f7261636c653a20696e76616c696420766f6c6174696c6974794360448201526d185c119a5e195914195c98d95b9d60921b6064820152608401610727565b6097805463ffffffff60a81b1916600160a81b61ffff85811691820261ffff60b81b191692909217600160b81b928516928302179092556040805192835260208301919091527fa18107df959276081c91eb5bcbe7740c3275f675562a139014114e0631a6c057910160405180910390a15050565b600054610100900460ff16158080156108445750600054600160ff909116105b8061085e5750303b15801561085e575060005460ff166001145b6108c15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610727565b6000805460ff1916600117905580156108e4576000805461ff0019166101001790555b6108ec6110f7565b6108f7600033611164565b61090f600080516020611f6083398151915233611164565b60978054600560a11b6001600160a81b03199091166001600160a01b038716171763ffffffff60a81b1916600160a81b61ffff8681169190910261ffff60b81b191691909117600160b81b9185169190910217905580156109aa576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60008060008060006109c186610f5c565b6001600160a01b0387166000908152609860209081526040808320815160608101835281546001600160401b03168152600182015493810193909352600201549082015291925090610a1490834261116e565b60975481516020830151604090930151600160a01b90920460ff169a90995091975095509350505050565b600082815260656020526040902060010154610a5a8161123e565b610a64838361124b565b505050565b610a74600033610f0c565b610aba5760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329020b236b4b760491b6044820152606401610727565b610ad2600080516020611f6083398151915282610f37565b6040516001600160a01b038216907fdc3a020aa9b5d9ec19456015b2bde778bc71d4bc9fec08e7cac73277118d7b5a90600090a250565b6001600160a01b0381163314610b795760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610727565b610b8382826112d1565b5050565b6097546040516302aa6b6f60e21b81526000916001600160a01b031690630aa9adbc903490610bbc9087908790600401611bfe565b6000604051808303818588803b158015610bd557600080fd5b505af1158015610be9573d6000803e3d6000fd5b5050505050610bf784610f5c565b90505b9392505050565b610c19600080516020611f6083398151915233610f0c565b610c655760405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f7420746865206d6f64657261746f7200000000006044820152606401610727565b6001600160a01b038116610cd05760405162461bcd60e51b815260206004820152602c60248201527f50726963654f7261636c653a20696e76616c696420707269636550726f76696460448201526b32b920b3b3b932b3b0ba37b960a11b6064820152608401610727565b609780546001600160a01b0319166001600160a01b0383169081179091556040519081527fd8cf8d9f8e25964c91608d69743cfdb894b37188cb10ad230331f7173a9ba5699060200160405180910390a150565b610d2f600033610f0c565b610d755760405162461bcd60e51b815260206004820152601760248201527621b0b63632b91034b9903737ba103a34329020b236b4b760491b6044820152606401610727565b610d8d600080516020611f6083398151915282610a3f565b6040516001600160a01b038216907f0439bb17363a86265339c2c56989c7c25e658d9318e89e7af33c003386edf72690600090a250565b6001600160a01b0382166000908152609960209081526040808320815160608101835281546001600160401b031681526001820154938101849052600290910154918101919091528291610e1b9086908690611338565b9250610e2c85858360400151611338565b9150509250929050565b6000610e4182610f5c565b90506000610e508383426113c7565b604080516060808201835283516001600160401b0390811683526020808601805182860190815287870180518789019081526001600160a01b038d166000818152609987528a90209851895467ffffffffffffffff191690881617895592516001890155516002909701969096558751915195518751929094168252918101949094529383015292935090917f881930378ac39d083586bf123dd6cf3d806e7547f7555574f016aa65a6357fb4910160405180910390a2505050565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600082815260656020526040902060010154610f528161123e565b610a6483836112d1565b60975460405163a33540f160e01b81526001600160a01b038381166004830152600092839283929091169063a33540f190602401602060405180830381865afa158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190611c96565b6040516341976e0960e01b81526001600160a01b03868116600483015291909116906341976e09906024016040805180830381865afa158015611018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103c9190611cc4565b609754919350915060ff600160a01b9091048116908216101561108b57609754611071908290600160a01b900460ff16611cfd565b61107c90600a611dfa565b6110869083611e09565b6110b7565b6097546110a290600160a01b900460ff1682611cfd565b6110ad90600a611dfa565b6110b79083611e20565b949350505050565b6000806000806110ce866109b0565b9350935050506110df868684611338565b93506110ec868683611338565b925050509250929050565b600054610100900460ff166111625760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610727565b565b610b83828261124b565b61119b604051806060016040528060006001600160401b0316815260200160008152602001600081525090565b83516001600160401b03166000036111d8576040518060600160405280836001600160401b03168152602001848152602001848152509050610bfa565b83516000906111e79084611e42565b6001600160401b031690506040518060600160405280846001600160401b0316815260200161121d86886020015185600161149d565b815260200161123386886040015185600061149d565b905295945050505050565b611248813361162b565b50565b6112558282610f0c565b610b835760008281526065602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561128d3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6112db8282610f0c565b15610b835760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600080846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d9190611e69565b90506113aa81600a611dfa565b6113b48486611e09565b6113be9190611e20565b95945050505050565b6113f4604051806060016040528060006001600160401b0316815260200160008152602001600081525090565b6001600160a01b038416600090815260986020908152604091829020825160608101845281546001600160401b03168152600182015492810192909252600201549181019190915261144790848461116e565b6001600160a01b03949094166000908152609860209081526040918290208651815467ffffffffffffffff19166001600160401b0390911617815590860151600182015590850151600290910155509192915050565b600080826114ea5760975461271090610e109086906114c790600160b81b900461ffff1689611e09565b6114d19190611e09565b6114db9190611e20565b6114e59190611e20565b61152a565b60975461271090610e1090869061150c90600160a81b900461ffff1689611e09565b6115169190611e09565b6115209190611e20565b61152a9190611e20565b90506000836115785760975461271090610e1090879061155590600160a81b900461ffff168a611e09565b61155f9190611e09565b6115699190611e20565b6115739190611e20565b6115b8565b60975461271090610e1090879061159a90600160b81b900461ffff168a611e09565b6115a49190611e09565b6115ae9190611e20565b6115b89190611e20565b905060008688116115d2576115cd8888611e84565b6115dc565b6115dc8789611e84565b905086881015611605578181106115fc576115f78288611e84565b6115fe565b875b9350611620565b82811061161b576116168388611e97565b61161d565b875b93505b505050949350505050565b6116358282610f0c565b610b835761164281611684565b61164d836020611696565b60405160200161165e929190611eaa565b60408051601f198184030181529082905262461bcd60e51b825261072791600401611f1f565b60606106c16001600160a01b03831660145b606060006116a5836002611e09565b6116b0906002611e97565b6001600160401b038111156116c7576116c7611965565b6040519080825280601f01601f1916602001820160405280156116f1576020820181803683370190505b509050600360fc1b8160008151811061170c5761170c611f32565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061173b5761173b611f32565b60200101906001600160f81b031916908160001a905350600061175f846002611e09565b61176a906001611e97565b90505b60018111156117e2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061179e5761179e611f32565b1a60f81b8282815181106117b4576117b4611f32565b60200101906001600160f81b031916908160001a90535060049490941c936117db81611f48565b905061176d565b508315610bfa5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610727565b60006020828403121561184357600080fd5b81356001600160e01b031981168114610bfa57600080fd5b803561ffff8116811461186d57600080fd5b919050565b6000806040838503121561188557600080fd5b61188e8361185b565b915061189c6020840161185b565b90509250929050565b6001600160a01b038116811461124857600080fd5b6000602082840312156118cc57600080fd5b8135610bfa816118a5565b6000806000606084860312156118ec57600080fd5b83356118f7816118a5565b92506119056020850161185b565b91506119136040850161185b565b90509250925092565b60006020828403121561192e57600080fd5b5035919050565b6000806040838503121561194857600080fd5b82359150602083013561195a816118a5565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156119a3576119a3611965565b604052919050565b60006001600160401b038211156119c4576119c4611965565b5060051b60200190565b6000601f83818401126119e057600080fd5b823560206119f56119f0836119ab565b61197b565b82815260059290921b85018101918181019087841115611a1457600080fd5b8287015b84811015611aaa5780356001600160401b0380821115611a385760008081fd5b818a0191508a603f830112611a4d5760008081fd5b85820135604082821115611a6357611a63611965565b611a74828b01601f1916890161197b565b92508183528c81838601011115611a8b5760008081fd5b8181850189850137506000908201870152845250918301918301611a18565b50979650505050505050565b600080600060608486031215611acb57600080fd5b8335611ad6816118a5565b92506020848101356001600160401b0380821115611af357600080fd5b818701915087601f830112611b0757600080fd5b8135611b156119f0826119ab565b81815260059190911b8301840190848101908a831115611b3457600080fd5b938501935b82851015611b5257843582529385019390850190611b39565b965050506040870135925080831115611b6a57600080fd5b5050611b78868287016119ce565b9150509250925092565b60008060408385031215611b9557600080fd5b8235611ba0816118a5565b946020939093013593505050565b60005b83811015611bc9578181015183820152602001611bb1565b50506000910152565b60008151808452611bea816020860160208601611bae565b601f01601f19169290920160200192915050565b604080825283519082018190526000906020906060840190828701845b82811015611c3757815184529284019290840190600101611c1b565b50505083810382850152845180825282820190600581901b8301840187850160005b83811015611c8757601f19868403018552611c75838351611bd2565b94870194925090860190600101611c59565b50909998505050505050505050565b600060208284031215611ca857600080fd5b8151610bfa816118a5565b805160ff8116811461186d57600080fd5b60008060408385031215611cd757600080fd5b8251915061189c60208401611cb3565b634e487b7160e01b600052601160045260246000fd5b60ff82811682821603908111156106c1576106c1611ce7565b600181815b80851115611d51578160001904821115611d3757611d37611ce7565b80851615611d4457918102915b93841c9390800290611d1b565b509250929050565b600082611d68575060016106c1565b81611d75575060006106c1565b8160018114611d8b5760028114611d9557611db1565b60019150506106c1565b60ff841115611da657611da6611ce7565b50506001821b6106c1565b5060208310610133831016604e8410600b8410161715611dd4575081810a6106c1565b611dde8383611d16565b8060001904821115611df257611df2611ce7565b029392505050565b6000610bfa60ff841683611d59565b80820281158282048414176106c1576106c1611ce7565b600082611e3d57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160401b03828116828216039080821115611e6257611e62611ce7565b5092915050565b600060208284031215611e7b57600080fd5b610bfa82611cb3565b818103818111156106c1576106c1611ce7565b808201808211156106c1576106c1611ce7565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611ee2816017850160208801611bae565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611f13816028840160208801611bae565b01602801949350505050565b602081526000610bfa6020830184611bd2565b634e487b7160e01b600052603260045260246000fd5b600081611f5757611f57611ce7565b50600019019056fe71f3d55856e4058ed06ee057d79ada615f65cdf5f9ee88181b914225088f834fa2646970667358221220ca0a99fe19769143bf18abff8a7c9c178bab1bc144db163b4235d0240d15e53164736f6c63430008130033