60806040523480156200001157600080fd5b5060405162002c3838038062002c3883398101604081905262000034916200010d565b6040805160208101909152600081526200004e816200008c565b506200005a336200009e565b600780546001600160a01b039384166001600160a01b03199182161790915560058054929093169116179055620002b6565b60026200009a8282620001ea565b5050565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200010857600080fd5b919050565b600080604083850312156200012157600080fd5b6200012c83620000f0565b91506200013c60208401620000f0565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200017057607f821691505b6020821081036200019157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001e557600081815260208120601f850160051c81016020861015620001c05750805b601f850160051c820191505b81811015620001e157828155600101620001cc565b5050505b505050565b81516001600160401b0381111562000206576200020662000145565b6200021e816200021784546200015b565b8462000197565b602080601f8311600181146200025657600084156200023d5750858301515b600019600386901b1c1916600185901b178555620001e1565b600085815260208120601f198616915b82811015620002875788860151825594840194600190910190840162000266565b5085821015620002a65787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61297280620002c66000396000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c8063715018a6116100de578063ca76394711610097578063efe1a3ca11610071578063efe1a3ca146103bf578063f242432a146103d2578063f2fde38b146103e5578063f5298aca146103f857600080fd5b8063ca7639471461034e578063cc33c87514610361578063e985e9c51461038357600080fd5b8063715018a6146102d25780638da5cb5b146102da5780639ab475b5146102f55780639dd373b914610308578063a22cb4651461031b578063bd85b0391461032e57600080fd5b80634e1273f4116101305780634e1273f4146102445780634f558e791461026457806357f7789e14610286578063677ab70b146102995780636b20c454146102ac5780636c19e783146102bf57600080fd5b8062fdd58e1461017757806301ffc9a71461019d5780630e89341c146101c05780632eb2c2d6146101e0578063351c1709146101f557806349a9493c14610231575b600080fd5b61018a610185366004611cc1565b61040b565b6040519081526020015b60405180910390f35b6101b06101ab366004611d01565b6104a4565b6040519015158152602001610194565b6101d36101ce366004611d1e565b6104f4565b6040516101949190611d7d565b6101f36101ee366004611ed9565b610599565b005b6101b0610203366004611cc1565b60009081526006602090815260408083206001600160a01b0394909416835260029093019052205460ff1690565b6101f361023f366004611f92565b6105e5565b610257610252366004611fbe565b610610565b60405161019491906120c3565b6101b0610272366004611d1e565b600090815260036020526040902054151590565b6101f3610294366004612117565b610739565b6101f36102a7366004611d1e565b610763565b6101f36102ba366004612162565b61078a565b6101f36102cd3660046121d5565b6107d2565b6101f36107fc565b6004546040516001600160a01b039091168152602001610194565b6101f36103033660046121f0565b610810565b6101f36103163660046121d5565b610a51565b6101f3610329366004612242565b610a7b565b61018a61033c366004611d1e565b60009081526003602052604090205490565b6101b061035c36600461226c565b610a8a565b61037461036f366004611d1e565b610b19565b604051610194939291906122d3565b6101b06103913660046122fd565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101f36103cd366004612327565b610bc8565b6101f36103e0366004612349565b610be2565b6101f36103f33660046121d5565b610c27565b6101f36104063660046123ad565b610c9d565b60006001600160a01b03831661047b5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b14806104d557506001600160e01b031982166303a24d0760e21b145b8061049e57506301ffc9a760e01b6001600160e01b031983161461049e565b6000818152600660205260409020600301805460609190610514906123e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610540906123e0565b801561058d5780601f106105625761010080835404028352916020019161058d565b820191906000526020600020905b81548152906001019060200180831161057057829003601f168201915b50505050509050919050565b6001600160a01b0385163314806105b557506105b58533610391565b6105d15760405162461bcd60e51b81526004016104729061241a565b6105de8585858585610ce0565b5050505050565b6105ed610e8a565b600091825260066020526040909120600101805460ff1916911515919091179055565b606081518351146106755760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610472565b600083516001600160401b0381111561069057610690611d90565b6040519080825280602002602001820160405280156106b9578160200160208202803683370190505b50905060005b8451811015610731576107048582815181106106dd576106dd612469565b60200260200101518583815181106106f7576106f7612469565b602002602001015161040b565b82828151811061071657610716612469565b602090810291909101015261072a81612495565b90506106bf565b509392505050565b610741610e8a565b600083815260066020526040902060030161075d8284836124f4565b50505050565b61076b610e8a565b6107873382600160405180602001604052806000815250610ee4565b50565b6001600160a01b0383163314806107a657506107a68333610391565b6107c25760405162461bcd60e51b81526004016104729061241a565b6107cd838383611007565b505050565b6107da610e8a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b610804610e8a565b61080e60006111a3565b565b60008481526006602052604090206001015460ff166108655760405162461bcd60e51b8152602060048201526011602482015270135a5b9d0e88135a5b9d081c185d5cd959607a1b6044820152606401610472565b60008481526006602052604090205461088690670de0b6b3a76400006125b3565b600554604051631ba23e4760e21b81523360048201526001600160a01b0390911690636e88f91c90602401602060405180830381865afa1580156108ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f291906125ca565b101561094e5760405162461bcd60e51b815260206004820152602560248201527f4d696e743a205374616b696e6720726571756972656d656e74206e6f742072656044820152641858da195960da1b6064820152608401610472565b61095b3385858585610a8a565b6109a75760405162461bcd60e51b815260206004820152601760248201527f4d696e743a205369676e617475726520696e76616c69640000000000000000006044820152606401610472565b600084815260066020908152604080832033845260020190915290205460ff1615610a0c5760405162461bcd60e51b8152602060048201526015602482015274135a5b9d0e88105b1c9958591e4818db185a5b5959605a1b6044820152606401610472565b60008481526006602090815260408083203380855260029091018352818420805460ff19166001908117909155825193840190925292825261075d9291879190610ee4565b610a59610e8a565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b610a863383836111f5565b5050565b604080516001600160a01b03871660208083019190915230828401526060820187905260808083018790528351808403909101815260a09092019092528051910120600090610b0f9084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506112d592505050565b9695505050505050565b600660205260009081526040902080546001820154600383018054929360ff90921692610b45906123e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b71906123e0565b8015610bbe5780601f10610b9357610100808354040283529160200191610bbe565b820191906000526020600020905b815481529060010190602001808311610ba157829003601f168201915b5050505050905083565b610bd0610e8a565b60009182526006602052604090912055565b6001600160a01b038516331480610bfe5750610bfe8533610391565b610c1a5760405162461bcd60e51b81526004016104729061241a565b6105de85858585856112ff565b610c2f610e8a565b6001600160a01b038116610c945760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610472565b610787816111a3565b6001600160a01b038316331480610cb95750610cb98333610391565b610cd55760405162461bcd60e51b81526004016104729061241a565b6107cd838383611437565b8151835114610d015760405162461bcd60e51b8152600401610472906125e3565b6001600160a01b038416610d275760405162461bcd60e51b81526004016104729061262b565b33610d3681878787878761154f565b60005b8451811015610e1c576000858281518110610d5657610d56612469565b602002602001015190506000858381518110610d7457610d74612469565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610dc45760405162461bcd60e51b815260040161047290612670565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610e019084906126ba565b9250508190555050505080610e1590612495565b9050610d39565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610e6c9291906126cd565b60405180910390a4610e8281878787878761155d565b505050505050565b6004546001600160a01b0316331461080e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610472565b6001600160a01b038416610f445760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610472565b336000610f50856116b8565b90506000610f5d856116b8565b9050610f6e8360008985858961154f565b6000868152602081815260408083206001600160a01b038b16845290915281208054879290610f9e9084906126ba565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ffe83600089898989611703565b50505050505050565b6001600160a01b03831661102d5760405162461bcd60e51b8152600401610472906126f2565b805182511461104e5760405162461bcd60e51b8152600401610472906125e3565b60003390506110718185600086866040518060200160405280600081525061154f565b60005b835181101561113657600084828151811061109157611091612469565b6020026020010151905060008483815181106110af576110af612469565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156110ff5760405162461bcd60e51b815260040161047290612735565b6000928352602083815260408085206001600160a01b038b168652909152909220910390558061112e81612495565b915050611074565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516111879291906126cd565b60405180910390a460408051602081019091526000905261075d565b600480546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036112685760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610472565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6007546000906001600160a01b03166112ee84846117be565b6001600160a01b0316149392505050565b6001600160a01b0384166113255760405162461bcd60e51b81526004016104729061262b565b336000611331856116b8565b9050600061133e856116b8565b905061134e83898985858961154f565b6000868152602081815260408083206001600160a01b038c1684529091529020548581101561138f5760405162461bcd60e51b815260040161047290612670565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906113cc9084906126ba565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461142c848a8a8a8a8a611703565b505050505050505050565b6001600160a01b03831661145d5760405162461bcd60e51b8152600401610472906126f2565b336000611469846116b8565b90506000611476846116b8565b90506114968387600085856040518060200160405280600081525061154f565b6000858152602081815260408083206001600160a01b038a168452909152902054848110156114d75760405162461bcd60e51b815260040161047290612735565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610ffe565b610e82868686868686611828565b6001600160a01b0384163b15610e825760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906115a19089908990889088908890600401612779565b6020604051808303816000875af19250505080156115dc575060408051601f3d908101601f191682019092526115d9918101906127d7565b60015b611688576115e86127f4565b806308c379a00361162157506115fc612810565b806116075750611623565b8060405162461bcd60e51b81526004016104729190611d7d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610472565b6001600160e01b0319811663bc197c8160e01b14610ffe5760405162461bcd60e51b815260040161047290612899565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106116f2576116f2612469565b602090810291909101015292915050565b6001600160a01b0384163b15610e825760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061174790899089908890889088906004016128e1565b6020604051808303816000875af1925050508015611782575060408051601f3d908101601f1916820190925261177f918101906127d7565b60015b61178e576115e86127f4565b6001600160e01b0319811663f23a6e6160e01b14610ffe5760405162461bcd60e51b815260040161047290612899565b60006118218261181b856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906119a1565b9392505050565b6001600160a01b0385166118af5760005b83518110156118ad5782818151811061185457611854612469565b60200260200101516003600086848151811061187257611872612469565b60200260200101518152602001908152602001600020600082825461189791906126ba565b909155506118a6905081612495565b9050611839565b505b6001600160a01b038416610e825760005b8351811015610ffe5760008482815181106118dd576118dd612469565b6020026020010151905060008483815181106118fb576118fb612469565b602002602001015190506000600360008481526020019081526020016000205490508181101561197e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a206275726e20616d6f756e74206578636565647320746f74604482015267616c537570706c7960c01b6064820152608401610472565b6000928352600360205260409092209103905561199a81612495565b90506118c0565b60008060006119b085856119bd565b9150915061073181611a02565b60008082516041036119f35760208301516040840151606085015160001a6119e787828585611bb8565b945094505050506119fb565b506000905060025b9250929050565b6000816004811115611a1657611a16612926565b03611a1e5750565b6001816004811115611a3257611a32612926565b03611a7f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610472565b6002816004811115611a9357611a93612926565b03611ae05760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610472565b6003816004811115611af457611af4612926565b03611b4c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610472565b6004816004811115611b6057611b60612926565b036107875760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610472565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611bef5750600090506003611c9c565b8460ff16601b14158015611c0757508460ff16601c14155b15611c185750600090506004611c9c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c6c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c9557600060019250925050611c9c565b9150600090505b94509492505050565b80356001600160a01b0381168114611cbc57600080fd5b919050565b60008060408385031215611cd457600080fd5b611cdd83611ca5565b946020939093013593505050565b6001600160e01b03198116811461078757600080fd5b600060208284031215611d1357600080fd5b813561182181611ceb565b600060208284031215611d3057600080fd5b5035919050565b6000815180845260005b81811015611d5d57602081850181015186830182015201611d41565b506000602082860101526020601f19601f83011685010191505092915050565b6020815260006118216020830184611d37565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715611dcb57611dcb611d90565b6040525050565b60006001600160401b03821115611deb57611deb611d90565b5060051b60200190565b600082601f830112611e0657600080fd5b81356020611e1382611dd2565b604051611e208282611da6565b83815260059390931b8501820192828101915086841115611e4057600080fd5b8286015b84811015611e5b5780358352918301918301611e44565b509695505050505050565b600082601f830112611e7757600080fd5b81356001600160401b03811115611e9057611e90611d90565b604051611ea7601f8301601f191660200182611da6565b818152846020838601011115611ebc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a08688031215611ef157600080fd5b611efa86611ca5565b9450611f0860208701611ca5565b935060408601356001600160401b0380821115611f2457600080fd5b611f3089838a01611df5565b94506060880135915080821115611f4657600080fd5b611f5289838a01611df5565b93506080880135915080821115611f6857600080fd5b50611f7588828901611e66565b9150509295509295909350565b80358015158114611cbc57600080fd5b60008060408385031215611fa557600080fd5b82359150611fb560208401611f82565b90509250929050565b60008060408385031215611fd157600080fd5b82356001600160401b0380821115611fe857600080fd5b818501915085601f830112611ffc57600080fd5b8135602061200982611dd2565b6040516120168282611da6565b83815260059390931b850182019282810191508984111561203657600080fd5b948201945b8386101561205b5761204c86611ca5565b8252948201949082019061203b565b9650508601359250508082111561207157600080fd5b5061207e85828601611df5565b9150509250929050565b600081518084526020808501945080840160005b838110156120b85781518752958201959082019060010161209c565b509495945050505050565b6020815260006118216020830184612088565b60008083601f8401126120e857600080fd5b5081356001600160401b038111156120ff57600080fd5b6020830191508360208285010111156119fb57600080fd5b60008060006040848603121561212c57600080fd5b8335925060208401356001600160401b0381111561214957600080fd5b612155868287016120d6565b9497909650939450505050565b60008060006060848603121561217757600080fd5b61218084611ca5565b925060208401356001600160401b038082111561219c57600080fd5b6121a887838801611df5565b935060408601359150808211156121be57600080fd5b506121cb86828701611df5565b9150509250925092565b6000602082840312156121e757600080fd5b61182182611ca5565b6000806000806060858703121561220657600080fd5b843593506020850135925060408501356001600160401b0381111561222a57600080fd5b612236878288016120d6565b95989497509550505050565b6000806040838503121561225557600080fd5b61225e83611ca5565b9150611fb560208401611f82565b60008060008060006080868803121561228457600080fd5b61228d86611ca5565b9450602086013593506040860135925060608601356001600160401b038111156122b657600080fd5b6122c2888289016120d6565b969995985093965092949392505050565b83815282151560208201526060604082015260006122f46060830184611d37565b95945050505050565b6000806040838503121561231057600080fd5b61231983611ca5565b9150611fb560208401611ca5565b6000806040838503121561233a57600080fd5b50508035926020909101359150565b600080600080600060a0868803121561236157600080fd5b61236a86611ca5565b945061237860208701611ca5565b9350604086013592506060860135915060808601356001600160401b038111156123a157600080fd5b611f7588828901611e66565b6000806000606084860312156123c257600080fd5b6123cb84611ca5565b95602085013595506040909401359392505050565b600181811c908216806123f457607f821691505b60208210810361241457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016124a7576124a761247f565b5060010190565b601f8211156107cd57600081815260208120601f850160051c810160208610156124d55750805b601f850160051c820191505b81811015610e82578281556001016124e1565b6001600160401b0383111561250b5761250b611d90565b61251f8361251983546123e0565b836124ae565b6000601f841160018114612553576000851561253b5750838201355b600019600387901b1c1916600186901b1783556105de565b600083815260209020601f19861690835b828110156125845786850135825560209485019460019092019101612564565b50868210156125a15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b808202811582820484141761049e5761049e61247f565b6000602082840312156125dc57600080fd5b5051919050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b8082018082111561049e5761049e61247f565b6040815260006126e06040830185612088565b82810360208401526122f48185612088565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906127a590830186612088565b82810360608401526127b78186612088565b905082810360808401526127cb8185611d37565b98975050505050505050565b6000602082840312156127e957600080fd5b815161182181611ceb565b600060033d111561280d5760046000803e5060005160e01c5b90565b600060443d101561281e5790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561284d57505050505090565b82850191508151818111156128655750505050505090565b843d870101602082850101111561287f5750505050505090565b61288e60208286010187611da6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061291b90830184611d37565b979650505050505050565b634e487b7160e01b600052602160045260246000fdfea264697066735822122009d151d9bb8552f71d00ceabf0e371a750b9da7bf117cc2a0c479f23808b82fe64736f6c634300081100330000000000000000000000006c5f7d9278f14277f472d3b6c0bcf88dac0c34b70000000000000000000000001aaa17934511e49b33f6feeca3f334e8eeba8e32