0x60806040523480156200001157600080fd5b506040516200287a3803806200287a833981016040819052620000349162000251565b8151829082906200004d906000906020850190620000de565b50805162000063906001906020840190620000de565b505050620000806200007a6200008860201b60201c565b6200008c565b5050620002f8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000ec90620002bb565b90600052602060002090601f0160209004810192826200011057600085556200015b565b82601f106200012b57805160ff19168380011785556200015b565b828001600101855582156200015b579182015b828111156200015b5782518255916020019190600101906200013e565b50620001699291506200016d565b5090565b5b808211156200016957600081556001016200016e565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620001ac57600080fd5b81516001600160401b0380821115620001c957620001c962000184565b604051601f8301601f19908116603f01168101908282118183101715620001f457620001f462000184565b816040528381526020925086838588010111156200021157600080fd5b600091505b8382101562000235578582018301518183018401529082019062000216565b83821115620002475760008385830101525b9695505050505050565b600080604083850312156200026557600080fd5b82516001600160401b03808211156200027d57600080fd5b6200028b868387016200019a565b93506020850151915080821115620002a257600080fd5b50620002b1858286016200019a565b9150509250929050565b600181811c90821680620002d057607f821691505b60208210811415620002f257634e487b7160e01b600052602260045260246000fd5b50919050565b61257280620003086000396000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c806395d89b41116100f9578063c87b56dd11610097578063e985e9c511610071578063e985e9c5146104c6578063f2fde38b14610502578063f77c479114610515578063f81e87751461052857600080fd5b8063c87b56dd14610475578063dd00125414610488578063e2a04b62146104b357600080fd5b8063b09afec1116100d3578063b09afec11461030b578063b4b5b48f146103c8578063b88d4fde1461044f578063bc19bce51461046257600080fd5b806395d89b41146102dd5780639a796aae146102e5578063a22cb465146102f857600080fd5b806323b872dd1161016657806370a082311161014057806370a082311461029e578063715018a6146102b15780638da5cb5b146102b957806392eefe9b146102ca57600080fd5b806323b872dd1461026557806342842e0e146102785780636352211e1461028b57600080fd5b8063081812fc11610197578063081812fc14610210578063095ea7b31461023b57806318160ddd1461024e57600080fd5b806301ffc9a7146101be57806306fdde03146101e657806307f03393146101fb575b600080fd5b6101d16101cc366004611e37565b61053b565b60405190151581526020015b60405180910390f35b6101ee610620565b6040516101dd9190611ed1565b61020e610209366004611f4b565b6106b2565b005b61022361021e366004611ff5565b6107e3565b6040516001600160a01b0390911681526020016101dd565b61020e61024936600461200e565b61080a565b61025760075481565b6040519081526020016101dd565b61020e610273366004612038565b610941565b61020e610286366004612038565b6109c8565b610223610299366004611ff5565b6109e3565b6102576102ac366004612074565b610a48565b61020e610ae2565b6006546001600160a01b0316610223565b61020e6102d8366004612074565b610af6565b6101ee610b38565b6102576102f3366004612143565b610b47565b61020e6103063660046121b2565b610d65565b61038a610319366004611ff5565b60408051606080820183526000808352602080840182905292840181905293845260098252928290208251938401835280546bffffffffffffffffffffffff80821686526c010000000000000000000000009091041691840191909152600101546001600160a01b03169082015290565b6040805182516bffffffffffffffffffffffff908116825260208085015190911690820152918101516001600160a01b0316908201526060016101dd565b61041b6103d6366004611ff5565b600960205260009081526040902080546001909101546bffffffffffffffffffffffff808316926c01000000000000000000000000900416906001600160a01b031683565b604080516bffffffffffffffffffffffff94851681529390921660208401526001600160a01b0316908201526060016101dd565b61020e61045d3660046121ee565b610d74565b61022361047036600461226a565b610e02565b6101ee610483366004611ff5565b610ef2565b61025761049636600461226a565b8051602081830181018051600a8252928201919093012091525481565b6101ee6104c1366004612074565b610efd565b6101d16104d436600461229f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61020e610510366004612074565b610f97565b600854610223906001600160a01b031681565b6101ee610536366004612074565b611027565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd0000000000000000000000000000000000000000000000000000000014806105ce57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061061a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60606000805461062f906122d2565b80601f016020809104026020016040519081016040528092919081815260200182805461065b906122d2565b80156106a85780601f1061067d576101008083540402835291602001916106a8565b820191906000526020600020905b81548152906001019060200180831161068b57829003601f168201915b5050505050905090565b6008546001600160a01b031633146106f6576040517f56be192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260096020908152604080832084518154848701516bffffffffffffffffffffffff9081166c01000000000000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921692169190911717815581850151600190910180546001600160a01b039092167fffffffffffffffffffffffff000000000000000000000000000000000000000090921682179055808452600b90925291829020915190917fa41e0452047546d9b0f775ebc42b65c631a9c861670c6b2479651f4d4a928977916107d791908690612326565b60405180910390a25050565b60006107ee826111c6565b506000908152600460205260409020546001600160a01b031690565b6000610815826109e3565b9050806001600160a01b0316836001600160a01b031614156108a45760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b336001600160a01b03821614806108c057506108c081336104d4565b6109325760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000606482015260840161089b565b61093c838361122a565b505050565b61094b33826112b0565b6109bd5760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161089b565b61093c83838361132e565b61093c83838360405180602001604052806000815250610d74565b6000818152600260205260408120546001600160a01b03168061061a5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161089b565b60006001600160a01b038216610ac65760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e65720000000000000000000000000000000000000000000000606482015260840161089b565b506001600160a01b031660009081526003602052604090205490565b610aea61158d565b610af460006115e7565b565b610afe61158d565b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60606001805461062f906122d2565b6008546000906001600160a01b03163314610b8e576040517f56be192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a83604051610b9e919061240d565b908152602001604051809103902054600014610be6576040517f557ebeac00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60078054906000610bf683612458565b9091555050600754610c088682611651565b604080516060810182526bffffffffffffffffffffffff428116825285811660208084019182526001600160a01b03808b16858701908152600088815260099093529186902094518554935185166c01000000000000000000000000027fffffffffffffffff0000000000000000000000000000000000000000000000009094169416939093179190911783555160019092018054929091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216919091179055518190600a90610cdc90879061240d565b9081526040805160209281900383019020929092556001600160a01b0388166000908152600b8252919091208551610d1692870190611d70565b50856001600160a01b03167fdcc2175a495289b48da3c0c903e6e8fd7bbf9400cc93d7d1b8be780fc5916c668583604051610d52929190612491565b60405180910390a290505b949350505050565b610d7033838361166b565b5050565b610d7e33836112b0565b610df05760405162461bcd60e51b815260206004820152602d60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206f7220617070726f76656400000000000000000000000000000000000000606482015260840161089b565b610dfc84848484611758565b50505050565b600080600a83604051610e15919061240d565b90815260200160405180910390205490508060001415610e61576040517f8a3d36da00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260096020908152604091829020825160608101845281546bffffffffffffffffffffffff8082168084526c01000000000000000000000000909204169382018490526001909201546001600160a01b031693810193909352610ec891906124b3565b6bffffffffffffffffffffffff16421115610ee7575060009392505050565b604001519392505050565b606061061a826117e1565b600b6020526000908152604090208054610f16906122d2565b80601f0160208091040260200160405190810160405280929190818152602001828054610f42906122d2565b8015610f8f5780601f10610f6457610100808354040283529160200191610f8f565b820191906000526020600020905b815481529060010190602001808311610f7257829003601f168201915b505050505081565b610f9f61158d565b6001600160a01b03811661101b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161089b565b611024816115e7565b50565b6001600160a01b0381166000908152600b602052604081208054606092919061104f906122d2565b80601f016020809104026020016040519081016040528092919081815260200182805461107b906122d2565b80156110c85780601f1061109d576101008083540402835291602001916110c8565b820191906000526020600020905b8154815290600101906020018083116110ab57829003601f168201915b5050505050905080516000141561110b576040517f6cfb958d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600a8260405161111d919061240d565b9081526040805191829003602090810183205460008181526009835283902060608501845280546bffffffffffffffffffffffff8082168088526c01000000000000000000000000909204169386018490526001909101546001600160a01b0316938501939093529350611190916124b3565b6bffffffffffffffffffffffff164211156111bd5750506040805160208101909152600081529392505050565b50909392505050565b6000818152600260205260409020546001600160a01b03166110245760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e2049440000000000000000604482015260640161089b565b600081815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384169081179091558190611277826109e3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806112bc836109e3565b9050806001600160a01b0316846001600160a01b0316148061130357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b80610d5d5750836001600160a01b031661131c846107e3565b6001600160a01b031614949350505050565b826001600160a01b0316611341826109e3565b6001600160a01b0316146113bd5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161089b565b6001600160a01b0382166114385760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015260840161089b565b826001600160a01b031661144b826109e3565b6001600160a01b0316146114c75760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e6572000000000000000000000000000000000000000000000000000000606482015260840161089b565b600081815260046020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091556001600160a01b038781168086526003855283862080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01905590871680865283862080546001019055868652600290945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6006546001600160a01b03163314610af45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161089b565b600680546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b610d708282604051806020016040528060008152506118a9565b816001600160a01b0316836001600160a01b031614156116cd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161089b565b6001600160a01b0383811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61176384848461132e565b61176f84848484611932565b610dfc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b606060006117ee83611aeb565b600101905060008167ffffffffffffffff81111561180e5761180e611ee4565b6040519080825280601f01601f191660200182016040528015611838576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461189c576118a1565b611842565b509392505050565b6118b38383611bcd565b6118c06000848484611932565b61093c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b60006001600160a01b0384163b15611ae3576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061198f9033908990889088906004016124e3565b6020604051808303816000875af19250505080156119e8575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526119e59181019061251f565b60015b611a98573d808015611a16576040519150601f19603f3d011682016040523d82523d6000602084013e611a1b565b606091505b508051611a905760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e7465720000000000000000000000000000606482015260840161089b565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610d5d565b506001610d5d565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611b34577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310611b60576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611b7e57662386f26fc10000830492506010015b6305f5e1008310611b96576305f5e100830492506008015b6127108310611baa57612710830492506004015b60648310611bbc576064830492506002015b600a831061061a5760010192915050565b6001600160a01b038216611c235760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161089b565b6000818152600260205260409020546001600160a01b031615611c885760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161089b565b6000818152600260205260409020546001600160a01b031615611ced5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161089b565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611d7c906122d2565b90600052602060002090601f016020900481019282611d9e5760008555611de4565b82601f10611db757805160ff1916838001178555611de4565b82800160010185558215611de4579182015b82811115611de4578251825591602001919060010190611dc9565b50611df0929150611df4565b5090565b5b80821115611df05760008155600101611df5565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461102457600080fd5b600060208284031215611e4957600080fd5b8135611e5481611e09565b9392505050565b60005b83811015611e76578181015183820152602001611e5e565b83811115610dfc5750506000910152565b60008151808452611e9f816020860160208601611e5b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e546020830184611e87565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b80356bffffffffffffffffffffffff81168114611f2f57600080fd5b919050565b80356001600160a01b0381168114611f2f57600080fd5b6000808284036080811215611f5f57600080fd5b8335925060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082011215611f9357600080fd5b506040516060810181811067ffffffffffffffff82111715611fb757611fb7611ee4565b604052611fc660208501611f13565b8152611fd460408501611f13565b6020820152611fe560608501611f34565b6040820152809150509250929050565b60006020828403121561200757600080fd5b5035919050565b6000806040838503121561202157600080fd5b61202a83611f34565b946020939093013593505050565b60008060006060848603121561204d57600080fd5b61205684611f34565b925061206460208501611f34565b9150604084013590509250925092565b60006020828403121561208657600080fd5b611e5482611f34565b600067ffffffffffffffff808411156120aa576120aa611ee4565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156120f0576120f0611ee4565b8160405280935085815286868601111561210957600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261213457600080fd5b611e548383356020850161208f565b6000806000806080858703121561215957600080fd5b61216285611f34565b935061217060208601611f34565b9250604085013567ffffffffffffffff81111561218c57600080fd5b61219887828801612123565b9250506121a760608601611f13565b905092959194509250565b600080604083850312156121c557600080fd5b6121ce83611f34565b9150602083013580151581146121e357600080fd5b809150509250929050565b6000806000806080858703121561220457600080fd5b61220d85611f34565b935061221b60208601611f34565b925060408501359150606085013567ffffffffffffffff81111561223e57600080fd5b8501601f8101871361224f57600080fd5b61225e8782356020840161208f565b91505092959194509250565b60006020828403121561227c57600080fd5b813567ffffffffffffffff81111561229357600080fd5b610d5d84828501612123565b600080604083850312156122b257600080fd5b6122bb83611f34565b91506122c960208401611f34565b90509250929050565b600181811c908216806122e657607f821691505b60208210811415612320577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60408152600080845481600182811c91508083168061234657607f831692505b602080841082141561237f577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b604088018490526060880182801561239e57600181146123cd576123f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008716825282820197506123f8565b60008c81526020902060005b878110156123f2578154848201529086019084016123d9565b83019850505b50509690960196909652509095945050505050565b6000825161241f818460208701611e5b565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561248a5761248a612429565b5060010190565b6040815260006124a46040830185611e87565b90508260208301529392505050565b60006bffffffffffffffffffffffff8083168185168083038211156124da576124da612429565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125156080830184611e87565b9695505050505050565b60006020828403121561253157600080fd5b8151611e5481611e0956fea2646970667358221220924170e37e66216f5a8666519cfb78422820c10ddca571e7c40292e60fde02a364736f6c634300080c003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b557365726e616d654e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004554e465400000000000000000000000000000000000000000000000000000000