0x608060405234801561000f575f80fd5b50604051612a0c380380612a0c83398101604081905261002e91610288565b806040518060400160405280601381526020017f4d6967726174696f6e2057686974656c69737400000000000000000000000000815250604051806040016040528060038152602001621355d360ea1b815250815f908161008f9190610385565b50600161009c8282610385565b5050506001600160a01b0381166100cd57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6100d681610129565b50600780546001600160a01b03808a166001600160a01b03199283161790925560088054928916929091169190911790556014600e556028600f5561011d8585858561017a565b50505050505050610444565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b61018261023e565b818310801561019057508082105b6101dc5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420706572696f6420636f6e66696775726174696f6e0000000060448201526064016100c4565b600a849055600b839055600c829055600d8190556040805185815260208101859052908101839052606081018290527f50442a40c0a9b69d93a0c7201194a8e01eaa69f23dfdfcf57f3c76af3c24aeda9060800160405180910390a150505050565b6006546001600160a01b0316331461026b5760405163118cdaa760e01b81523360048201526024016100c4565b565b80516001600160a01b0381168114610283575f80fd5b919050565b5f805f805f805f60e0888a03121561029e575f80fd5b6102a78861026d565b96506102b56020890161026d565b955060408801519450606088015193506080880151925060a088015191506102df60c0890161026d565b905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061031557607f821691505b60208210810361033357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561038057805f5260205f20601f840160051c8101602085101561035e5750805b601f840160051c820191505b8181101561037d575f815560010161036a565b50505b505050565b81516001600160401b0381111561039e5761039e6102ed565b6103b2816103ac8454610301565b84610339565b602080601f8311600181146103e5575f84156103ce5750858301515b5f19600386901b1c1916600185901b17855561043c565b5f85815260208120601f198616915b82811015610413578886015182559484019460019091019084016103f4565b508582101561043057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6125bb806104515f395ff3fe608060405234801561000f575f80fd5b50600436106102c2575f3560e01c80638ab1d6811161017c578063b09f1266116100dd578063e27847b611610093578063e43252d71161006e578063e43252d714610589578063e985e9c51461059c578063f2fde38b146105d7575f80fd5b8063e27847b614610541578063e2f124111461056d578063e41fa95314610580575f80fd5b8063c0b2b1bd116100c3578063c0b2b1bd14610513578063c87b56dd14610526578063d28d885214610539575f80fd5b8063b09f1266146104fd578063b88d4fde14610505575f80fd5b806395d89b4111610132578063a22cb46511610118578063a22cb465146104ce578063a6177139146104e1578063b0477670146104f4575f80fd5b806395d89b41146104a45780639b19251a146104ac575f80fd5b80638e13c72a116101625780638e13c72a1461047557806393982d151461048857806394df29c814610491575f80fd5b80638ab1d681146104515780638da5cb5b14610464575f80fd5b806342842e0e116102265780636e3e03a8116101dc578063715018a6116101c2578063715018a614610423578063822d4d721461042b5780638980f11f1461043e575f80fd5b80636e3e03a8146103f157806370a0823114610410575f80fd5b806362aa05b11161020c57806362aa05b1146103cc5780636352211e146103d557806368a8f4ee146103e8575f80fd5b806342842e0e146103a6578063454b0608146103b9575f80fd5b80630e913a6c1161027b57806317d70f7c1161026157806317d70f7c1461036b5780631e2418181461037457806323b872dd14610393575f80fd5b80630e913a6c1461035a5780630f7e29cb14610362575f80fd5b8063081812fc116102ab578063081812fc1461030357806308bd412b1461032e578063095ea7b314610345575f80fd5b806301ffc9a7146102c657806306fdde03146102ee575b5f80fd5b6102d96102d4366004611f73565b6105ea565b60405190151581526020015b60405180910390f35b6102f66106ce565b6040516102e59190611ff9565b61031661031136600461200b565b61075d565b6040516001600160a01b0390911681526020016102e5565b61033760105481565b6040519081526020016102e5565b610358610353366004612038565b610784565b005b6102d9610793565b610337600a5481565b61033760095481565b610337610382366004612060565b60136020525f908152604090205481565b6103586103a1366004612079565b6107ab565b6103586103b4366004612079565b610838565b6103586103c736600461200b565b610857565b610337600d5481565b6103166103e336600461200b565b610d18565b610337600b5481565b6103376103ff366004612060565b60126020525f908152604090205481565b61033761041e366004612060565b610d22565b610358610d80565b61033761043936600461200b565b610d93565b61035861044c366004612038565b610e06565b61035861045f366004612060565b610e22565b6006546001600160a01b0316610316565b600854610316906001600160a01b031681565b610337600f5481565b61035861049f3660046120b2565b610ebd565b6102f6610f9b565b6102d96104ba366004612060565b60116020525f908152604090205460ff1681565b6103586104dc3660046120ee565b610faa565b6103586104ef366004612123565b610fb5565b610337600e5481565b6102f6611080565b6103586103a13660046121bf565b6103586105213660046122b2565b61110c565b6102f661053436600461200b565b61111f565b6102f6611190565b600a54600b54600c54600d546040805194855260208501939093529183015260608201526080016102e5565b600754610316906001600160a01b031681565b610337600c5481565b610358610597366004612060565b61119c565b6102d96105aa3660046122d2565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b6103586105e5366004612060565b6111e9565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061067c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806106c857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b60605f80546106dc90612303565b80601f016020809104026020016040519081016040528092919081815260200182805461070890612303565b80156107535780601f1061072a57610100808354040283529160200191610753565b820191905f5260205f20905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b5f6107678261123f565b505f828152600460205260409020546001600160a01b03166106c8565b61078f828233611290565b5050565b5f600a54421180156107a65750600d5442105b905090565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f57686974656c697374204e4654206973206e6f74207472616e7366657261626c60448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61085283838360405180602001604052805f8152506107ab565b505050565b335f9081526011602052604090205460ff166108cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e6f742077686974656c69737465640000000000000000000000000000000000604482015260640161082f565b600d5442111561093b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4d6967726174696f6e20656e6465640000000000000000000000000000000000604482015260640161082f565b6007546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa15801561099a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109be9190612354565b1015610a4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f496e73756666696369656e742062616c616e6365206f662055534120746f6b6560448201527f6e00000000000000000000000000000000000000000000000000000000000000606482015260840161082f565b6007546040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015282916001600160a01b03169063dd62ed3e90604401602060405180830381865afa158015610ab1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad59190612354565b1015610b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f496e73756666696369656e7420616c6c6f77616e6365206f662055534120746f60448201527f6b656e0000000000000000000000000000000000000000000000000000000000606482015260840161082f565b600754610b7b906001600160a01b031633308461129d565b5f610b8582610d93565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925082916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610be9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0d9190612354565b1015610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f496e73756666696369656e74206d6967726174696f6e20746f6b656e2062616c60448201527f616e636500000000000000000000000000000000000000000000000000000000606482015260840161082f565b600854610cb1906001600160a01b0316338361131f565b335f90815260136020526040812083905560108054849290610cd4908490612398565b9091555050604080518381526020810183905233917fd083678824038160bef3975359ab29f19c3f0e9bcf9d7ead540a492d4d678b63910160405180910390a25050565b5f6106c88261123f565b5f6001600160a01b038216610d65576040517f89c62b640000000000000000000000000000000000000000000000000000000081525f600482015260240161082f565b506001600160a01b03165f9081526003602052604090205490565b610d88611350565b610d915f611396565b565b5f600a54421015610da557505f919050565b600b544211610db2575090565b600c544211610de0576064600e546064610dcc91906123ab565b610dd690846123be565b6106c891906123d5565b600d544211610dfa576064600f546064610dcc91906123ab565b505f919050565b919050565b610e0e611350565b61078f6001600160a01b038316338361131f565b610e2a611350565b6001600160a01b0381165f90815260116020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556012909152902054610e7b906113ff565b6040515f81526001600160a01b038216907ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d906020015b60405180910390a250565b610ec5611350565b8183108015610ed357508082105b610f39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c696420706572696f6420636f6e66696775726174696f6e00000000604482015260640161082f565b600a849055600b839055600c829055600d8190556040805185815260208101859052908101839052606081018290527f50442a40c0a9b69d93a0c7201194a8e01eaa69f23dfdfcf57f3c76af3c24aeda9060800160405180910390a150505050565b6060600180546106dc90612303565b61078f338383611450565b610fbd611350565b5f5b81811015610ffe57610ff6838383818110610fdc57610fdc61240d565b9050602002016020810190610ff19190612060565b611525565b600101610fbf565b507f242e48c3937feafd1d0e6bd4cf16a941a0946558fd953d1abe3cf123095e24f282828067ffffffffffffffff81111561103b5761103b612192565b604051908082528060200260200182016040528015611064578160200160208202803683370190505b506040516110749392919061243a565b60405180910390a15050565b6001805461108d90612303565b80601f01602080910402602001604051908101604052809291908181526020018280546110b990612303565b80156111045780601f106110db57610100808354040283529160200191611104565b820191905f5260205f20905b8154815290600101906020018083116110e757829003601f168201915b505050505081565b611114611350565b600e91909155600f55565b606061112a8261123f565b505f61114060408051602081019091525f815290565b90505f81511161115e5760405180602001604052805f815250611189565b80611168846115a2565b6040516020016111799291906124c7565b6040516020818303038152906040525b9392505050565b5f805461108d90612303565b6111a4611350565b6111ad81611525565b604051600181526001600160a01b038216907ff93f9a76c1bf3444d22400a00cb9fe990e6abe9dbb333fda48859cfee864543d90602001610eb2565b6111f1611350565b6001600160a01b038116611233576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f600482015260240161082f565b61123c81611396565b50565b5f818152600260205260408120546001600160a01b0316806106c8576040517f7e2732890000000000000000000000000000000000000000000000000000000081526004810184905260240161082f565b610852838383600161165e565b6040516001600160a01b0384811660248301528381166044830152606482018390526113199186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506117b1565b50505050565b6040516001600160a01b0383811660248301526044820183905261085291859182169063a9059cbb906064016112d2565b6006546001600160a01b03163314610d91576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161082f565b600680546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f61140b5f835f61182b565b90506001600160a01b03811661078f576040517f7e2732890000000000000000000000000000000000000000000000000000000081526004810183905260240161082f565b6001600160a01b03821661149b576040517f5b08ba180000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015260240161082f565b6001600160a01b038381165f8181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0381165f90815260116020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556009805491611573836124f5565b919050555061158481600954611954565b6009546001600160a01b039091165f90815260126020526040902055565b60605f6115ae8361196d565b60010190505f8167ffffffffffffffff8111156115cd576115cd612192565b6040519080825280601f01601f1916602001820160405280156115f7576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a850494508461160157509392505050565b808061167257506001600160a01b03821615155b1561176a575f6116818461123f565b90506001600160a01b038316158015906116ad5750826001600160a01b0316816001600160a01b031614155b80156116de57506001600160a01b038082165f9081526005602090815260408083209387168352929052205460ff16155b15611720576040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161082f565b81156117685783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f6117c56001600160a01b03841683611a4e565b905080515f141580156117e95750808060200190518101906117e7919061252c565b155b15610852576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260240161082f565b5f828152600260205260408120546001600160a01b039081169083161561185757611857818486611a5b565b6001600160a01b038116156118b0576118725f855f8061165e565b6001600160a01b0381165f90815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b6001600160a01b038516156118de576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b61078f828260405180602001604052805f815250611af1565b5f807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106119b5577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef810000000083106119e1576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106119ff57662386f26fc10000830492506010015b6305f5e1008310611a17576305f5e100830492506008015b6127108310611a2b57612710830492506004015b60648310611a3d576064830492506002015b600a83106106c85760010192915050565b606061118983835f611b07565b611a66838383611bb9565b610852576001600160a01b038316611aad576040517f7e2732890000000000000000000000000000000000000000000000000000000081526004810182905260240161082f565b6040517f177e802f0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024810182905260440161082f565b611afb8383611c3c565b6108525f848484611ccf565b606081471015611b45576040517fcd78605900000000000000000000000000000000000000000000000000000000815230600482015260240161082f565b5f80856001600160a01b03168486604051611b609190612547565b5f6040518083038185875af1925050503d805f8114611b9a576040519150601f19603f3d011682016040523d82523d5f602084013e611b9f565b606091505b5091509150611baf868383611e8f565b9695505050505050565b5f6001600160a01b03831615801590611c345750826001600160a01b0316846001600160a01b03161480611c1157506001600160a01b038085165f9081526005602090815260408083209387168352929052205460ff165b80611c3457505f828152600460205260409020546001600160a01b038481169116145b949350505050565b6001600160a01b038216611c7e576040517f64a0ae920000000000000000000000000000000000000000000000000000000081525f600482015260240161082f565b5f611c8a83835f61182b565b90506001600160a01b03811615610852576040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081525f600482015260240161082f565b6001600160a01b0383163b15611319576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0384169063150b7a0290611d2a903390889087908790600401612562565b6020604051808303815f875af1925050508015611d82575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611d7f91810190612593565b60015b611e02573d808015611daf576040519150601f19603f3d011682016040523d82523d5f602084013e611db4565b606091505b5080515f03611dfa576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161082f565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014611e88576040517f64a0ae920000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161082f565b5050505050565b606082611ea457611e9f82611f04565b611189565b8151158015611ebb57506001600160a01b0384163b155b15611efd576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b038516600482015260240161082f565b5080611189565b805115611f145780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461123c575f80fd5b5f60208284031215611f83575f80fd5b813561118981611f46565b5f5b83811015611fa8578181015183820152602001611f90565b50505f910152565b5f8151808452611fc7816020860160208601611f8e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6111896020830184611fb0565b5f6020828403121561201b575f80fd5b5035919050565b80356001600160a01b0381168114610e01575f80fd5b5f8060408385031215612049575f80fd5b61205283612022565b946020939093013593505050565b5f60208284031215612070575f80fd5b61118982612022565b5f805f6060848603121561208b575f80fd5b61209484612022565b92506120a260208501612022565b9150604084013590509250925092565b5f805f80608085870312156120c5575f80fd5b5050823594602084013594506040840135936060013592509050565b801515811461123c575f80fd5b5f80604083850312156120ff575f80fd5b61210883612022565b91506020830135612118816120e1565b809150509250929050565b5f8060208385031215612134575f80fd5b823567ffffffffffffffff8082111561214b575f80fd5b818501915085601f83011261215e575f80fd5b81358181111561216c575f80fd5b8660208260051b8501011115612180575f80fd5b60209290920196919550909350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f805f80608085870312156121d2575f80fd5b6121db85612022565b93506121e960208601612022565b925060408501359150606085013567ffffffffffffffff8082111561220c575f80fd5b818701915087601f83011261221f575f80fd5b81358181111561223157612231612192565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561227757612277612192565b816040528281528a602084870101111561228f575f80fd5b826020860160208301375f60208483010152809550505050505092959194509250565b5f80604083850312156122c3575f80fd5b50508035926020909101359150565b5f80604083850312156122e3575f80fd5b6122ec83612022565b91506122fa60208401612022565b90509250929050565b600181811c9082168061231757607f821691505b60208210810361234e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b5f60208284031215612364575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156106c8576106c861236b565b818103818111156106c8576106c861236b565b80820281158282048414176106c8576106c861236b565b5f82612408577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b604080825281018390525f8460608301825b8681101561247a576001600160a01b0361246584612022565b1682526020928301929091019060010161244c565b506020915083810360208501528085518083526020830191506020870192505f5b818110156124b957835115158352928401929184019160010161249b565b509098975050505050505050565b5f83516124d8818460208801611f8e565b8351908301906124ec818360208801611f8e565b01949350505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036125255761252561236b565b5060010190565b5f6020828403121561253c575f80fd5b8151611189816120e1565b5f8251612558818460208701611f8e565b9190910192915050565b5f6001600160a01b03808716835280861660208401525083604083015260806060830152611baf6080830184611fb0565b5f602082840312156125a3575f80fd5b815161118981611f4656fea164736f6c6343000819000a0000000000000000000000004ffe9cc172527df1e40d0b2efe1e9f05884a13da00000000000000000000000083d346664e40c09d71f06a2b6b337a789f1fec2c00000000000000000000000000000000000000000000000000000000674a58d3000000000000000000000000000000000000000000000000000000006753935300000000000000000000000000000000000000000000000000000000675ccdd30000000000000000000000000000000000000000000000000000000067660853000000000000000000000000d73b3e17a661749d0c54c7550229baaf3ef619db