0x608060405234801561001057600080fd5b506001601e55614f85806100256000396000f3fe6080604052600436106102675760003560e01c8063a5799f9311610144578063c9484bee116100b6578063ea03d6481161007a578063ea03d64814610816578063ea43e18314610836578063f0bf3a721461086a578063fbe3c2cd14610918578063fbe3cc4114610937578063ffc4992f1461095557600080fd5b8063c9484bee1461074f578063d49657661461077f578063d60b347f1461079d578063d8f372be146107d6578063db60b2b7146107e957600080fd5b8063ba31316a11610108578063ba31316a14610690578063c081720b146106a3578063c2b7a3e6146106b6578063c3f511c1146106ef578063c48fa1151461071c578063c68785191461072f57600080fd5b8063a5799f93146105ba578063ad66a5f1146105da578063af57be601461060b578063b172b22214610645578063b96c7e4d1461065a57600080fd5b80633a69f75b116101dd5780636d25f40a116101a15780636d25f40a1461050c578063739fc8d11461052a5780637ab7236d146105565780638129fc1c1461056e57806384acd1bb146105835780639a8a0592146105a157600080fd5b80633a69f75b1461042957806348efb3471461044757806354fd4d501461045a578063561bc6b21461047d578063683205b9146104c657600080fd5b8063253946451161022f578063253946451461033e5780632a92d5911461035e5780632c3c02a41461037e5780632e375b40146103be57806335c3a10f146103dc5780633754597e146103ef57600080fd5b80630a249a591461026c5780631640f85e1461028e57806316a04a9d146102c15780631e026b5e146102ec5780631ff1e2861461031e575b600080fd5b34801561027857600080fd5b5061028c610287366004613f4a565b610973565b005b34801561029a57600080fd5b506102ae6102a9366004613fa3565b610bbd565b6040519081526020015b60405180910390f35b6102d46102cf366004613ff7565b610c5d565b6040516001600160401b0390911681526020016102b8565b3480156102f857600080fd5b506010546001600160a01b03165b6040516001600160a01b0390911681526020016102b8565b34801561032a57600080fd5b50610306610339366004614088565b610ddb565b34801561034a57600080fd5b5061028c610359366004613f4a565b610e0a565b34801561036a57600080fd5b506102ae6103793660046140b4565b610fde565b34801561038a57600080fd5b506103ae6103993660046140ed565b60009081526004602052604090205460ff1690565b60405190151581526020016102b8565b3480156103ca57600080fd5b506011546001600160a01b0316610306565b6102d46103ea366004614106565b61100c565b6104026103fd3660046141a1565b6111d7565b604080516001600160a01b0390931683526001600160401b039091166020830152016102b8565b34801561043557600080fd5b506013546001600160a01b0316610306565b6104026104553660046141e7565b6115de565b34801561046657600080fd5b50600a5b60405161ffff90911681526020016102b8565b34801561048957600080fd5b506102ae6104983660046140b4565b6001600160a01b038216600090815260186020908152604080832061ffff8516845290915290205492915050565b3480156104d257600080fd5b506104ff6104e1366004614236565b6001600160a01b031660009081526019602052604090205460ff1690565b6040516102b89190614269565b34801561051857600080fd5b506012546001600160a01b0316610306565b34801561053657600080fd5b50600154600160201b900460ff1660405160ff90911681526020016102b8565b34801561056257600080fd5b50601c5460ff166103ae565b34801561057a57600080fd5b5061028c611a29565b34801561058f57600080fd5b506000546001600160a01b0316610306565b3480156105ad57600080fd5b5060015461ffff1661046a565b3480156105c657600080fd5b5061028c6105d5366004613f4a565b611c48565b3480156105e657600080fd5b506102ae6105f5366004614283565b61ffff166000908152600b602052604090205490565b34801561061757600080fd5b50610306610626366004614283565b61ffff166000908152600c60205260409020546001600160a01b031690565b34801561065157600080fd5b506002546102ae565b34801561066657600080fd5b506102ae610675366004614236565b6001600160a01b03166000908152600a602052604090205490565b6102d461069e3660046142a0565b612054565b6102d46106b1366004614312565b612172565b3480156106c257600080fd5b506103066106d1366004614236565b6001600160a01b039081166000908152600960205260409020541690565b3480156106fb57600080fd5b5061070f61070a366004613f4a565b6122b8565b6040516102b891906143c4565b6102d461072a3660046143d7565b6122c3565b34801561073b57600080fd5b5061028c61074a366004613f4a565b6123e8565b34801561075b57600080fd5b506103ae61076a3660046140ed565b60009081526005602052604090205460ff1690565b34801561078b57600080fd5b50600f546001600160a01b0316610306565b3480156107a957600080fd5b506103ae6107b8366004614236565b6001600160a01b031660009081526006602052604090205460ff1690565b6102d46107e4366004614414565b6123f5565b3480156107f557600080fd5b506108096108043660046140b4565b61253e565b6040516102b8919061449f565b34801561082257600080fd5b5061028c610831366004613f4a565b61256f565b34801561084257600080fd5b506103ae610851366004614283565b61ffff166000908152601d602052604090205460ff1690565b34801561087657600080fd5b506108d8604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260145461ffff16815260155460208201526016546001600160a01b031691810191909152601754606082015290565b6040516102b89190815161ffff168152602080830151908201526040808301516001600160a01b0316908201526060918201519181019190915260800190565b34801561092457600080fd5b5060015462010000900461ffff1661046a565b34801561094357600080fd5b50600e546001600160a01b0316610306565b34801561096157600080fd5b50600d546001600160a01b0316610306565b60008060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563da90312330866040518363ffffffff1660e01b81526004016109b19291906144ad565b600060405180830381865af41580156109ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109f6919081019061472d565b925092509250818190610a255760405162461bcd60e51b8152600401610a1c91906143c4565b60405180910390fd5b50610a34836101400151612618565b60e0830151604051635ca2486360e01b81526000917353bc81f5363c3abc53fa13c6e8f7b9a3a540811591635ca2486391610a71916004016143c4565b608060405180830381865af4158015610a8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab291906147f8565b9050610ac18160400151612633565b6000610ad56012546001600160a01b031690565b905060007353bc81f5363c3abc53fa13c6e8f7b9a3a5408115636f70005584606001516040518263ffffffff1660e01b8152600401610b1691815260200190565b602060405180830381865af4158015610b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b57919061481f565b601280546001600160a01b0319166001600160a01b0383161790559050806001600160a01b0316826001600160a01b03167f59c0befbe3daf1752c4da9f8726090e377176c1075a83792acf77257a7dc977e60405160405180910390a350505050505050565b60405163877d202960e01b81523060048201526001600160a01b03841660248201526044810183905261ffff821660648201526000907353bc81f5363c3abc53fa13c6e8f7b9a3a54081159063877d202990608401602060405180830381865af4158015610c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c53919061483c565b90505b9392505050565b6000610c67612681565b6000610c7889896000888b8b6126da565b905060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563649f6d6960038460400151856020015186600001518c8e60008a60800151336001600160a01b031660001b8e6040518b63ffffffff1660e01b8152600401610ce39a99989796959493929190614855565b600060405180830381865af4158015610d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d2891908101906148bd565b9050610d3c6000546001600160a01b031690565b6001600160a01b031663b19a437e348784610d6160015460ff600160201b9091041690565b6040518563ffffffff1660e01b8152600401610d7f939291906148f1565b60206040518083038185885af1158015610d9d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dc29190614923565b92505050610dd06001601e55565b979650505050505050565b61ffff821660009081526007602090815260408083208484529091529020546001600160a01b03165b92915050565b60008060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563da90312330866040518363ffffffff1660e01b8152600401610e489291906144ad565b600060405180830381865af4158015610e65573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e8d919081019061472d565b925092509250818190610eb35760405162461bcd60e51b8152600401610a1c91906143c4565b50610ec2836101400151612618565b60e083015160405163168d53fb60e01b81526000917353bc81f5363c3abc53fa13c6e8f7b9a3a54081159163168d53fb91610eff916004016143c4565b608060405180830381865af4158015610f1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4091906147f8565b9050610f4f8160400151612633565b6060810151604051636f70005560e01b8152610fd7917353bc81f5363c3abc53fa13c6e8f7b9a3a540811591636f70005591610f919160040190815260200190565b602060405180830381865af4158015610fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd2919061481f565b612a2d565b5050505050565b6001600160a01b0382166000908152601b6020908152604080832061ffff8516845290915290205492915050565b6000611016612681565b60008251116110605760405162461bcd60e51b81526020600482015260166024820152750d2dcecc2d8d2c840e0c2f2d8dec2c840d8cadccee8d60531b6044820152606401610a1c565b60006110708a8a88888c8c6126da565b905060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563649f6d6960058460400151856020015186600001518d8f89606001518a60800151336001600160a01b031660001b8e6040518b63ffffffff1660e01b81526004016110de9a99989796959493929190614855565b600060405180830381865af41580156110fb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261112391908101906148bd565b90506111376000546001600160a01b031690565b6001600160a01b031663b19a437e34878461115c60015460ff600160201b9091041690565b6040518563ffffffff1660e01b815260040161117a939291906148f1565b60206040518083038185885af1158015611198573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906111bd9190614923565b925050506111cb6001601e55565b98975050505050505050565b60008060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563966a36c730876040518363ffffffff1660e01b81526004016112159291906144ad565b61010060405180830381865af4158015611233573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611257919061493e565b90506112668160a00151612618565b6080810151604051639201de5560e01b8152600481019190915260009063c71f461560e01b907353bc81f5363c3abc53fa13c6e8f7b9a3a540811590639201de5590602401600060405180830381865af41580156112c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112f091908101906148bd565b6060840151604051639201de5560e01b815260048101919091527353bc81f5363c3abc53fa13c6e8f7b9a3a540811590639201de5590602401600060405180830381865af4158015611346573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261136e91908101906148bd565b60408086015160c08701516020880151885193516113939695943092916024016149eb565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b03199095169490941790935284830151855191519294506000936113f9939192910160f09290921b6001600160f01b0319168252600282015260220190565b604051602081830303815290604052805190602001209050611423600f546001600160a01b031690565b6001600160a01b031663998e32376114436010546001600160a01b031690565b84846040518463ffffffff1660e01b815260040161146393929190614a54565b6020604051808303816000875af1158015611482573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a6919061481f565b94506114bd83602001518460000151876000612bcd565b6000546001600160a01b03166001600160a01b031663b19a437e34887353bc81f5363c3abc53fa13c6e8f7b9a3a54081156304a0cc85886000015189602001516000806040518563ffffffff1660e01b815260040161151f9493929190614a88565b600060405180830381865af415801561153c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261156491908101906148bd565b600154600160201b900460ff166040518563ffffffff1660e01b815260040161158f939291906148f1565b60206040518083038185885af11580156115ad573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115d29190614923565b93505050509250929050565b60008060007353bc81f5363c3abc53fa13c6e8f7b9a3a5408115634316d13f30886040518363ffffffff1660e01b815260040161161c9291906144ad565b61010060405180830381865af415801561163a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061165e919061493e565b905061166d8160a00151612618565b602080820151825160405160009361169f9392910160f09290921b6001600160f01b0319168252600282015260220190565b60408051808303601f19018152828252805160209182012060e086015160c08701516001600160a01b0390911660248601523060448601526001600160401b0316606485015260848085018b90528351808603909101815260a4909401909252820180516001600160e01b03166205a07760e11b179052915086156117cf5761172e8360e0015133308a612c51565b6117cf8360e00151611748600f546001600160a01b031690565b6001600160a01b031663b8f138966117686011546001600160a01b031690565b85876040518463ffffffff1660e01b815260040161178893929190614a54565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c9919061481f565b89612cc2565b600f546001600160a01b03166001600160a01b031663998e32376117fb6011546001600160a01b031690565b83856040518463ffffffff1660e01b815260040161181b93929190614a54565b6020604051808303816000875af115801561183a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185e919061481f565b9450505061187a816020015182600001518360e0015186612bcd565b6000546001600160a01b03166001600160a01b031663b19a437e34867353bc81f5363c3abc53fa13c6e8f7b9a3a54081156304a0cc858660000151876020015160017353bc81f5363c3abc53fa13c6e8f7b9a3a54081156327105ab98f6118e48d60e00151612ddc565b6040516001600160e01b031960e085901b168152600481019290925260ff166024820152604401602060405180830381865af4158015611928573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194c919061483c565b6040518563ffffffff1660e01b815260040161196b9493929190614a88565b600060405180830381865af4158015611988573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119b091908101906148bd565b600154600160201b900460ff166040518563ffffffff1660e01b81526004016119db939291906148f1565b60206040518083038185885af11580156119f9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a1e9190614923565b915050935093915050565b6000611a5c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b9050611a80816001600160a01b031660009081526006602052604090205460ff1690565b15611ac35760405162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610a1c565b611aeb816001600160a01b03166000908152600660205260409020805460ff19166001179055565b601c805460ff191660011790557388a5c1041440c2633cda7b49aaee1ea944f955f1737370d6eb9d2b0836b36ddec4e83a2c069f2f1d157341391805a255b0242a6b1cf103b314a502620ff36000611b4b600e546001600160a01b031690565b9050611b5682612e77565b6040516351cff8d960e01b81526001600160a01b0384811660048301528516906351cff8d990602401600060405180830381600087803b158015611b9957600080fd5b505af1158015611bad573d6000803e3d6000fd5b50505050611bba81612e77565b6040516370a0823160e01b815230600482015273dac17f958d2ee523a2206206994597c13d831ec79060009082906370a0823190602401602060405180830381865afa158015611c0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c32919061483c565b9050611c3f828683612e99565b50505050505050565b60008060007353bc81f5363c3abc53fa13c6e8f7b9a3a540811563da90312330866040518363ffffffff1660e01b8152600401611c869291906144ad565b600060405180830381865af4158015611ca3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ccb919081019061472d565b925092509250818190611cf15760405162461bcd60e51b8152600401610a1c91906143c4565b50611d00836101400151612618565b60e08301516040516301f5325560e01b81526000917353bc81f5363c3abc53fa13c6e8f7b9a3a5408115916301f5325591611d3d916004016143c4565b60c060405180830381865af4158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e9190614ab5565b9050611d8d8160400151612633565b606081015161ffff166000908152600b602052604081205414611df25760405162461bcd60e51b815260206004820152601860248201527f636861696e20616c7265616479207265676973746572656400000000000000006044820152606401610a1c565b60a0810151604051636f70005560e01b81526000917353bc81f5363c3abc53fa13c6e8f7b9a3a540811591636f70005591611e339160040190815260200190565b602060405180830381865af4158015611e50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e74919061481f565b606083015161ffff166000908152600c60205260409020549091506001600160a01b03161580611edb5750806001600160a01b0316611ed0836060015161ffff166000908152600c60205260409020546001600160a01b031690565b6001600160a01b0316145b611f365760405162461bcd60e51b815260206004820152602660248201527f766572696669657220616464726573732063616e6e6f74206265206f766572776044820152653934ba3a32b760d11b6064820152608401610a1c565b80611f4460015461ffff1690565b61ffff16816001600160a01b0316639a8a05926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611faa9190614b46565b61ffff1614611ffb5760405162461bcd60e51b815260206004820152601960248201527f696e76616c696420766572696669657220636f6e7472616374000000000000006044820152606401610a1c565b61201f8360600151846080015161ffff9091166000908152600b6020526040902055565b606083015161ffff166000908152600c6020526040902080546001600160a01b0319166001600160a01b038416179055611c3f565b600061205e612681565b600061206e898987878b8b6126da565b60408082015160208301518351606085015160808601519451633c6ffa5160e21b8152600160048201526024810194909452604484019290925261ffff9081166064840152608483018b90528b1660a483015260c482015260e48101919091529091506000907353bc81f5363c3abc53fa13c6e8f7b9a3a54081159063f1bfe9449061010401600060405180830381865af4158015612111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261213991908101906148bd565b905061214d6000546001600160a01b031690565b6001600160a01b031663b19a437e348684610d6160015460ff600160201b9091041690565b600061217c612681565b6000807353bc81f5363c3abc53fa13c6e8f7b9a3a540811563b40237a830338a8a8a6040518663ffffffff1660e01b81526004016121be959493929190614b63565b600060405180830381865af41580156121db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122039190810190614ba3565b9150915061221081612ec9565b6000546001600160a01b03166001600160a01b031663b19a437e34868561224160015460ff600160201b9091041690565b6040518563ffffffff1660e01b815260040161225f939291906148f1565b60206040518083038185885af115801561227d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122a29190614923565b925050506122b06001601e55565b949350505050565b6060610e0482612ee4565b6040516314325c9560e01b81523060048201526001600160a01b038316602482015260009081907353bc81f5363c3abc53fa13c6e8f7b9a3a5408115906314325c9590604401600060405180830381865af4158015612326573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261234e91908101906148bd565b90506123626000546001600160a01b031690565b6001600160a01b031663b19a437e34858461238760015460ff600160201b9091041690565b6040518563ffffffff1660e01b81526004016123a5939291906148f1565b60206040518083038185885af11580156123c3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906122b09190614923565b6123f181612ee4565b5050565b60006123ff612681565b6000807353bc81f5363c3abc53fa13c6e8f7b9a3a5408115639874cea730338b8b8b8b6040518763ffffffff1660e01b815260040161244396959493929190614be9565b600060405180830381865af4158015612460573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124889190810190614ba3565b9150915061249581612ec9565b6000546001600160a01b03166001600160a01b031663b19a437e3486856124c660015460ff600160201b9091041690565b6040518563ffffffff1660e01b81526004016124e4939291906148f1565b60206040518083038185885af1158015612502573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906125279190614923565b925050506125356001601e55565b95945050505050565b6001600160a01b0382166000908152601a6020908152604080832061ffff8516845290915290205460ff1692915050565b60008060008060007353bc81f5363c3abc53fa13c6e8f7b9a3a5408115637a5668d330886040518363ffffffff1660e01b81526004016125b09291906144ad565b60a060405180830381865af41580156125cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125f19190614c36565b9450945094509450945061260481612618565b612610858585856136f2565b505050505050565b6000908152600460205260409020805460ff19166001179055565b60015461ffff82811691161461267e5760405162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a590818da185a5b881a5960821b6044820152606401610a1c565b50565b6002601e54036126d35760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1c565b6002601e55565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152601c5460ff161561274e5760405162461bcd60e51b81526020600482015260136024820152723a3930b739b332b91034b9903830bab9b2b21760691b6044820152606401610a1c565b61ffff83166000908152601d602052604090205460ff16156127c65760405162461bcd60e51b815260206004820152602b60248201527f7472616e7366657220746f2074686520726563697069656e7420636861696e2060448201526a34b990313637b1b5b2b21760a91b6064820152608401610a1c565b60405162df486960e11b81523060048201526001600160a01b038816602482015260448101879052606481018690526084810185905261ffff841660a482015260c4810183905260009081907353bc81f5363c3abc53fa13c6e8f7b9a3a5408115906301be90d29060e40160e060405180830381865af415801561284e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128729190614c98565b9194509250905061288589333085612c51565b600154835161ffff91821691160361293957604051635956405960e01b81523060048201526001600160a01b038a166024820152604481018290527353bc81f5363c3abc53fa13c6e8f7b9a3a540811590635956405990606401602060405180830381865af41580156128fc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612920919061483c565b60408401819052612934908a90879061377f565b612a21565b6001600160a01b038981166000908152600960205260409020541680156129c4576129658a8285612cc2565b604051630852cd8d60e31b8152600481018490526001600160a01b038216906342966c6890602401600060405180830381600087803b1580156129a757600080fd5b505af11580156129bb573d6000803e3d6000fd5b50505050612a1f565b604051630852cd8d60e31b8152600481018490526001600160a01b038b16906342966c6890602401600060405180830381600087803b158015612a0657600080fd5b505af1158015612a1a573d6000803e3d6000fd5b505050505b505b50509695505050505050565b6000612a607f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b90506000612a6d8261390b565b90506000612a7a8461390b565b90508161ffff168161ffff1611612ad35760405162461bcd60e51b815260206004820152601e60248201527f696e76616c696420696d706c656d656e746174696f6e2076657273696f6e00006044820152606401610a1c565b612adc846139a6565b60408051600481526024810182526020810180516001600160e01b031663204a7f0760e21b179052905160009182916001600160a01b03881691612b1f91614d32565b600060405180830381855af49150503d8060008114612b5a576040519150601f19603f3d011682016040523d82523d6000602084013e612b5f565b606091505b5091509150818190612b845760405162461bcd60e51b8152600401610a1c91906143c4565b50856001600160a01b0316856001600160a01b03167f2e4cc16c100f0b55e2df82ab0b1a7e294aa9cbd01b48fbaf622683fbc0507a4960405160405180910390a3505050505050565b61ffff939093166000818152600760209081526040808320868452825280832080546001600160a01b039687166001600160a01b03199182168117909255818552601884528285209585529483528184209690965594825260198152848220805460ff19166002179055600990529290922080549390911692909116919091179055565b6040516001600160a01b0380851660248301528316604482015260648101829052612cbc9085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526139e6565b50505050565b801580612d3c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a919061483c565b155b612da75760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610a1c565b6040516001600160a01b038316602482015260448101829052612dd790849063095ea7b360e01b90606401612c85565b505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b03851691612e1f91614d32565b600060405180830381855afa9150503d8060008114612e5a576040519150601f19603f3d011682016040523d82523d6000602084013e612e5f565b606091505b5091505080806020019051810190610c569190614d4e565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038316602482015260448101829052612dd790849063a9059cbb60e01b90606401612c85565b6000908152600560205260409020805460ff19166001179055565b60606000807353bc81f5363c3abc53fa13c6e8f7b9a3a5408115630783d6cb30866040518363ffffffff1660e01b8152600401612f229291906144ad565b600060405180830381865af4158015612f3f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f679190810190614d6b565b91509150612f79826101400151612ec9565b6080810151604051636f70005560e01b81526000917353bc81f5363c3abc53fa13c6e8f7b9a3a540811591636f70005591612fba9160040190815260200190565b602060405180830381865af4158015612fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffb919061481f565b9050600360ff16826000015160ff160361305857336001600160a01b038216146130585760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b6044820152606401610a1c565b600061306760015461ffff1690565b61ffff16836060015161ffff160361310d576040838101519051636f70005560e01b815260048101919091527353bc81f5363c3abc53fa13c6e8f7b9a3a540811590636f70005590602401602060405180830381865af41580156130cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130f3919061481f565b90506131088185606001518560200151613ab8565b613193565b600061312184606001518560400151610ddb565b60405163f99d0ddd60e01b81526001600160a01b03821660048201529091507353bc81f5363c3abc53fa13c6e8f7b9a3a54081159063f99d0ddd9060240160006040518083038186803b15801561317757600080fd5b505af415801561318b573d6000803e3d6000fd5b509293505050505b600061319e82612ddc565b6020850151604051637cb8a92b60e01b8152600481019190915260ff821660248201529091506000907353bc81f5363c3abc53fa13c6e8f7b9a3a540811590637cb8a92b90604401602060405180830381865af4158015613203573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613227919061483c565b60c0860151604051637cb8a92b60e01b8152600481019190915260ff841660248201529091506000907353bc81f5363c3abc53fa13c6e8f7b9a3a540811590637cb8a92b90604401602060405180830381865af415801561328c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b0919061483c565b60e0870151604051637cb8a92b60e01b8152600481019190915260ff851660248201529091506000907353bc81f5363c3abc53fa13c6e8f7b9a3a540811590637cb8a92b90604401602060405180830381865af4158015613315573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613339919061483c565b9050826133468284614e88565b111561339f5760405162461bcd60e51b815260206004820152602260248201527f66656520686967686572207468616e207472616e7366657272656420616d6f756044820152611b9d60f21b6064820152608401610a1c565b6000821180156133b857506001600160a01b0386163314155b156133d2576133cd8760600151863385613b22565b6133d7565b600091505b80156134855760006133f16012546001600160a01b031690565b90506001600160a01b0381161561347e576000816001600160a01b031663c415b95c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613442573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613466919061481f565b90506134788960600151888386613b22565b50613483565b600091505b505b60608701516134aa9086888461349b8789614e9b565b6134a59190614e9b565b613b22565b846001600160a01b03168760400151886060015161ffff167f656ff4727f1c8d1dcacb8fde9add51ac022beca8271a9e9805b4067f6800658f898787878e61010001518f610120015160405161350596959493929190614eae565b60405180910390a4865160ff16600514801561352a57506001600160a01b0386163b15155b801561353c5750600087610120015151115b156136df576135c888606001518861010001518784868861355d9190614e9b565b6135679190614e9b565b6040805160808101825261ffff909516808652602086018590526001600160a01b0390931690850181905260609094018190526014805461ffff1916909217909155601591909155601680546001600160a01b031916909217909155601755565b6000806135dd6013546001600160a01b031690565b6001600160a01b031662f1a301898b61012001516040518363ffffffff1660e01b815260040161360e9291906144ad565b6000604051808303816000875af115801561362d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526136559190810190614ee7565b9150915061369182826040518060400160405280601581526020017419985a5b1959081d1bc818d85b1b081d185c99d95d605a1b815250613bd5565b506136dc604080516080810182526000808252602082018190529181018290526060018190526014805461ffff191690556015819055601680546001600160a01b0319169055601755565b50505b50505060e0909401519695505050505050565b6001600160a01b03841660009081526019602090815260408083208054600160ff199182168117909255601a845282852061ffff8916865290935292208054859391921690838181111561374857613748614253565b02179055506001600160a01b039093166000908152601b6020908152604080832061ffff9095168352939052919091209190915550565b6001600160a01b0383166000908152600a60205260409020546001600160401b036137aa8383614e88565b11156138165760405162461bcd60e51b815260206004820152603560248201527f7472616e736665722065786365656473206d6178206f75747374616e64696e6760448201527408189c9a5919d959081d1bdad95b88185b5bdd5b9d605a1b6064820152608401610a1c565b613840846138248484614e88565b6001600160a01b039091166000908152600a6020526040902055565b600161384c858561253e565b600181111561385d5761385d614253565b03612cbc578161386d8585610fde565b10156138c65760405162461bcd60e51b815260206004820152602260248201527f696e73756666696369656e742072656d6f7465206c6f636b65642062616c616e604482015261636560f01b6064820152608401610a1c565b612cbc8484846138d68888610fde565b6138e09190614e9b565b6001600160a01b039092166000908152601b6020908152604080832061ffff90941683529290522055565b60408051600481526024810182526020810180516001600160e01b031663054fd4d560e41b179052905160009182916001600160a01b0385169161394e91614d32565b600060405180830381855afa9150503d8060008114613989576040519150601f19603f3d011682016040523d82523d6000602084013e61398e565b606091505b5091505080806020019051810190610c569190614b46565b6139af81613bee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6000613a3b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613c9c9092919063ffffffff16565b805190915015612dd75780806020019051810190613a599190614f34565b612dd75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a1c565b613ae68382613adc866001600160a01b03166000908152600a602052604090205490565b6138249190614e9b565b6001613af2848461253e565b6001811115613b0357613b03614253565b03612dd757612dd7838383613b188787610fde565b6138e09190614e88565b60015461ffff858116911614613bca576001600160a01b038381166000908152600960205260408120549091169081613b5b5784613b5d565b815b6040516340c10f1960e01b81526001600160a01b03868116600483015260248201869052919250908216906340c10f1990604401600060405180830381600087803b158015613bab57600080fd5b505af1158015613bbf573d6000803e3d6000fd5b505050505050612cbc565b612cbc838383612e99565b60608315613be4575081610c56565b610c568383613cab565b6001600160a01b0381163b613c5b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a1c565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610c538484600085613cd5565b815115613cbb5781518083602001fd5b8060405162461bcd60e51b8152600401610a1c91906143c4565b606082471015613d365760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a1c565b600080866001600160a01b03168587604051613d529190614d32565b60006040518083038185875af1925050503d8060008114613d8f576040519150601f19603f3d011682016040523d82523d6000602084013e613d94565b606091505b5091509150610dd08783838760608315613e0f578251600003613e08576001600160a01b0385163b613e085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a1c565b50816122b0565b6122b08383613cab565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613e5157613e51613e19565b60405290565b60405161016081016001600160401b0381118282101715613e5157613e51613e19565b60405161014081016001600160401b0381118282101715613e5157613e51613e19565b604051601f8201601f191681016001600160401b0381118282101715613ec557613ec5613e19565b604052919050565b60006001600160401b03821115613ee657613ee6613e19565b50601f01601f191660200190565b600082601f830112613f0557600080fd5b8135613f18613f1382613ecd565b613e9d565b818152846020838601011115613f2d57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215613f5c57600080fd5b81356001600160401b03811115613f7257600080fd5b6122b084828501613ef4565b6001600160a01b038116811461267e57600080fd5b61ffff8116811461267e57600080fd5b600080600060608486031215613fb857600080fd5b8335613fc381613f7e565b9250602084013591506040840135613fda81613f93565b809150509250925092565b63ffffffff8116811461267e57600080fd5b600080600080600080600060e0888a03121561401257600080fd5b873561401d81613f7e565b965060208801359550604088013561403481613f93565b9450606088013593506080880135925060a088013561405281613fe5565b915060c08801356001600160401b0381111561406d57600080fd5b6140798a828b01613ef4565b91505092959891949750929550565b6000806040838503121561409b57600080fd5b82356140a681613f93565b946020939093013593505050565b600080604083850312156140c757600080fd5b82356140d281613f7e565b915060208301356140e281613f93565b809150509250929050565b6000602082840312156140ff57600080fd5b5035919050565b600080600080600080600080610100898b03121561412357600080fd5b883561412e81613f7e565b975060208901359650604089013561414581613f93565b9550606089013594506080890135935060a0890135925060c089013561416a81613fe5565b915060e08901356001600160401b0381111561418557600080fd5b6141918b828c01613ef4565b9150509295985092959890939650565b600080604083850312156141b457600080fd5b82356001600160401b038111156141ca57600080fd5b6141d685828601613ef4565b92505060208301356140e281613fe5565b6000806000606084860312156141fc57600080fd5b83356001600160401b0381111561421257600080fd5b61421e86828701613ef4565b935050602084013591506040840135613fda81613fe5565b60006020828403121561424857600080fd5b8135610c5681613f7e565b634e487b7160e01b600052602160045260246000fd5b602081016003831061427d5761427d614253565b91905290565b60006020828403121561429557600080fd5b8135610c5681613f93565b600080600080600080600060e0888a0312156142bb57600080fd5b87356142c681613f7e565b96506020880135955060408801356142dd81613f93565b9450606088013593506080880135925060a0880135915060c088013561430281613fe5565b8091505092959891949750929550565b6000806000806080858703121561432857600080fd5b84356001600160401b0381111561433e57600080fd5b61434a87828801613ef4565b9450506020850135925060408501359150606085013561436981613fe5565b939692955090935050565b60005b8381101561438f578181015183820152602001614377565b50506000910152565b600081518084526143b0816020860160208601614374565b601f01601f19169290920160200192915050565b602081526000610c566020830184614398565b600080604083850312156143ea57600080fd5b82356143f581613f7e565b915060208301356140e281613fe5565b60ff8116811461267e57600080fd5b600080600080600060a0868803121561442c57600080fd5b85356001600160401b0381111561444257600080fd5b61444e88828901613ef4565b9550506020860135935060408601359250606086013561446d81614405565b9150608086013561447d81613fe5565b809150509295509295909350565b6002811061449b5761449b614253565b9052565b60208101610e04828461448b565b6001600160a01b0383168152604060208201819052600090610c5390830184614398565b80516144dc81614405565b919050565b80516144dc81613fe5565b80516144dc81613f93565b80516001600160401b03811681146144dc57600080fd5b600082601f83011261451f57600080fd5b815161452d613f1382613ecd565b81815284602083860101111561454257600080fd5b6122b0826020830160208701614374565b600082601f83011261456457600080fd5b815160206001600160401b0382111561457f5761457f613e19565b61458d818360051b01613e9d565b82815260079290921b840181019181810190868411156145ac57600080fd5b8286015b8481101561461157608081890312156145c95760008081fd5b6145d1613e2f565b8151815284820151858201526040808301516145ec81614405565b908201526060828101516145ff81614405565b908201528352918301916080016145b0565b509695505050505050565b6000610160828403121561462f57600080fd5b614637613e57565b9050614642826144d1565b8152614650602083016144e1565b6020820152614661604083016144e1565b6040820152614672606083016144ec565b60608201526080820151608082015261468d60a083016144f7565b60a082015261469e60c083016144d1565b60c082015260e08201516001600160401b03808211156146bd57600080fd5b6146c98583860161450e565b60e084015261010091506146de8285016144e1565b82840152610120915081840151818111156146f857600080fd5b61470486828701614553565b8385015250505061014080830151818301525092915050565b805180151581146144dc57600080fd5b60008060006060848603121561474257600080fd5b83516001600160401b038082111561475957600080fd5b6147658783880161461c565b94506147736020870161471d565b9350604086015191508082111561478957600080fd5b506147968682870161450e565b9150509250925092565b6000608082840312156147b257600080fd5b6147ba613e2f565b90508151815260208201516147ce81614405565b602082015260408201516147e181613f93565b806040830152506060820151606082015292915050565b60006080828403121561480a57600080fd5b610c5683836147a0565b80516144dc81613f7e565b60006020828403121561483157600080fd5b8151610c5681613f7e565b60006020828403121561484e57600080fd5b5051919050565b600061014060ff8d1683528b60208401528a604084015261ffff808b16606085015289608085015280891660a0850152508660c08401528560e084015284610100840152806101208401526148ac81840185614398565b9d9c50505050505050505050505050565b6000602082840312156148cf57600080fd5b81516001600160401b038111156148e557600080fd5b6122b08482850161450e565b63ffffffff841681526060602082015260006149106060830185614398565b905060ff83166040830152949350505050565b60006020828403121561493557600080fd5b610c56826144f7565b600061010080838503121561495257600080fd5b604051908101906001600160401b038211818310171561497457614974613e19565b81604052835181526020840151915061498c82613f93565b81602082015261499e604085016144d1565b6040820152606084015160608201526080840151608082015260a084015160a08201526149cd60c085016144f7565b60c08201526149de60e08501614814565b60e0820152949350505050565b60e0815260006149fe60e083018a614398565b8281036020840152614a10818a614398565b60ff98909816604084015250506001600160401b039490941660608501526001600160a01b0392909216608084015261ffff1660a083015260c09091015292915050565b6001600160a01b0384168152606060208201819052600090614a7890830185614398565b9050826040830152949350505050565b84815261ffff8416602082015260808101614aa6604083018561448b565b82606083015295945050505050565b600060c08284031215614ac757600080fd5b60405160c081018181106001600160401b0382111715614ae957614ae9613e19565b604052825181526020830151614afe81614405565b60208201526040830151614b1181613f93565b60408201526060830151614b2481613f93565b60608201526080838101519082015260a0928301519281019290925250919050565b600060208284031215614b5857600080fd5b8151610c5681613f93565b6001600160a01b0386811682528516602082015260a060408201819052600090614b8f90830186614398565b606083019490945250608001529392505050565b60008060408385031215614bb657600080fd5b82516001600160401b03811115614bcc57600080fd5b614bd88582860161450e565b925050602083015190509250929050565b6001600160a01b0387811682528616602082015260c060408201819052600090614c1590830187614398565b606083019590955250608081019290925260ff1660a0909101529392505050565b600080600080600060a08688031215614c4e57600080fd5b8551614c5981613f7e565b6020870151909550614c6a81613f93565b604087015190945060028110614c7f57600080fd5b6060870151608090970151959894975095949392505050565b600080600083850360e0811215614cae57600080fd5b60a0811215614cbc57600080fd5b5060405160a081018181106001600160401b0382111715614cdf57614cdf613e19565b6040528451614ced81613f93565b80825250602085015160208201526040850151604082015260608501516060820152608085015160808201528093505060a0840151915060c084015190509250925092565b60008251614d44818460208701614374565b9190910192915050565b600060208284031215614d6057600080fd5b8151610c5681614405565b60008060408385031215614d7e57600080fd5b82516001600160401b0380821115614d9557600080fd5b614da18683870161461c565b93506020850151915080821115614db757600080fd5b908401906101408287031215614dcc57600080fd5b614dd4613e7a565b614ddd836144d1565b81526020830151602082015260408301516040820152614dff606084016144ec565b606082015260808301516080820152614e1a60a084016144ec565b60a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015183811115614e5357600080fd5b614e5f8982870161450e565b8284015250508093505050509250929050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610e0457610e04614e72565b81810381811115610e0457610e04614e72565b60018060a01b038716815285602082015284604082015283606082015282608082015260c060a082015260006111cb60c0830184614398565b60008060408385031215614efa57600080fd5b614f038361471d565b915060208301516001600160401b03811115614f1e57600080fd5b614f2a8582860161450e565b9150509250929050565b600060208284031215614f4657600080fd5b610c568261471d56fea26469706673582212201ca7b6f883af10dd832cf7b8275213173b76a26096106f5304249807d30d672c64736f6c63430008160033