60806040523480156200001157600080fd5b5060405162002bfa38038062002bfa83398101604081905262000034916200012f565b60408051602081019091526000815282906200005081620000ad565b506003805460ff191690556001600160a01b0381166200008a57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200009581620000bf565b506004620000a48282620002b4565b50505062000380565b6002620000bb8282620002b4565b5050565b600380546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200014357600080fd5b82516001600160a01b03811681146200015b57600080fd5b602084810151919350906001600160401b03808211156200017b57600080fd5b818601915086601f8301126200019057600080fd5b815181811115620001a557620001a562000119565b604051601f8201601f19908116603f01168101908382118183101715620001d057620001d062000119565b816040528281528986848701011115620001e957600080fd5b600093505b828410156200020d5784840186015181850187015292850192620001ee565b60008684830101528096505050505050509250929050565b600181811c908216806200023a57607f821691505b6020821081036200025b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002af57600081815260208120601f850160051c810160208610156200028a5750805b601f850160051c820191505b81811015620002ab5782815560010162000296565b5050505b505050565b81516001600160401b03811115620002d057620002d062000119565b620002e881620002e1845462000225565b8462000261565b602080601f831160018114620003205760008415620003075750858301515b600019600386901b1c1916600185901b178555620002ab565b600085815260208120601f198616915b82811015620003515788860151825594840194600190910190840162000330565b5085821015620003705787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61286a80620003906000396000f3fe608060405234801561001057600080fd5b50600436106101815760003560e01c80635135bec1116100d85780638da5cb5b1161008c578063e985e9c511610066578063e985e9c51461034a578063f242432a14610393578063f2fde38b146103a657600080fd5b80638da5cb5b146102d1578063a22cb46514610314578063e30405c01461032757600080fd5b80636adc79e0116100bd5780636adc79e01461029e578063715018a6146102c15780638456cb59146102c957600080fd5b80635135bec1146102805780635c975abb1461029357600080fd5b80631f7fdffa1161013a5780633d5f39d9116101145780633d5f39d9146102455780633f4ba83a146102585780634e1273f41461026057600080fd5b80631f7fdffa1461020c5780632e87871d1461021f5780632eb2c2d61461023257600080fd5b806302fe53051161016b57806302fe5305146101cf57806306fdde03146101e45780630e89341c146101f957600080fd5b8062fdd58e1461018657806301ffc9a7146101ac575b600080fd5b610199610194366004611d21565b6103b9565b6040519081526020015b60405180910390f35b6101bf6101ba366004611d79565b6103ee565b60405190151581526020016101a3565b6101e26101dd366004611e91565b6104d1565b005b6101ec6104e5565b6040516101a39190611f50565b6101ec610207366004611f63565b610573565b6101e261021a36600461202b565b6105b4565b6101e261022d36600461210d565b6105ce565b6101e2610240366004612160565b61081b565b6101e261025336600461220a565b6108e1565b6101e2610938565b61027361026e366004612225565b61094a565b6040516101a39190612320565b6101e261028e366004612333565b610a38565b60035460ff166101bf565b6101bf6102ac36600461220a565b60056020526000908152604090205460ff1681565b6101e2610a91565b6101e2610aa3565b600354610100900473ffffffffffffffffffffffffffffffffffffffff1660405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a3565b6101e261032236600461239b565b610ab3565b6101bf610335366004611f63565b60066020526000908152604090205460ff1681565b6101bf6103583660046123d7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101e26103a136600461240a565b610ac2565b6101e26103b436600461220a565b610b80565b60008181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061048157507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806103e857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316146103e8565b6104d9610be1565b6104e281610c3a565b50565b600480546104f29061246f565b80601f016020809104026020016040519081016040528092919081815260200182805461051e9061246f565b801561056b5780601f106105405761010080835404028352916020019161056b565b820191906000526020600020905b81548152906001019060200180831161054e57829003601f168201915b505050505081565b6060600061058083610c46565b90508061058c84610cda565b60405160200161059d9291906124c2565b604051602081830303815290604052915050919050565b6105bc610be1565b6105c884848484610d98565b50505050565b6105d6610df6565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b166020820152603481018590526054810182905260009060740160405160208183030381529060405280519060200120905060006106a861066c837f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e3392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205490915060ff161515600114610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f496e636f7272656374207369676e65720000000000000000000000000000000060448201526064015b60405180910390fd5b60008281526006602052604090205460ff1615156001036107c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4475706c69636174652072657175657374000000000000000000000000000000604482015260640161073b565b6107dd3387600160405180602001604052806000815250610e5d565b50600090815260066020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550505050565b3373ffffffffffffffffffffffffffffffffffffffff86168114801590610875575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b156108cc576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301528716602482015260440161073b565b6108d98686868686610ee0565b505050505050565b6108e9610be1565b73ffffffffffffffffffffffffffffffffffffffff16600090815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b610940610be1565b610948610f8d565b565b6060815183511461099457815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161073b565b6000835167ffffffffffffffff8111156109b0576109b0611d9d565b6040519080825280602002602001820160405280156109d9578160200160208202803683370190505b50905060005b8451811015610a3057602080820286010151610a03906020808402870101516103b9565b828281518110610a1557610a156124f1565b6020908102919091010152610a298161254f565b90506109df565b509392505050565b610a40610be1565b610a48610df6565b610a8a85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610e5d92505050565b5050505050565b610a99610be1565b610948600061100a565b610aab610be1565b610948611088565b610abe3383836110e3565b5050565b3373ffffffffffffffffffffffffffffffffffffffff86168114801590610b1c575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b15610b73576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301528716602482015260440161073b565b6108d986868686866111cb565b610b88610be1565b73ffffffffffffffffffffffffffffffffffffffff8116610bd8576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b6104e28161100a565b60035473ffffffffffffffffffffffffffffffffffffffff610100909104163314610948576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161073b565b6002610abe82826125d2565b606060028054610c559061246f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c819061246f565b8015610cce5780601f10610ca357610100808354040283529160200191610cce565b820191906000526020600020905b815481529060010190602001808311610cb157829003601f168201915b50505050509050919050565b60606000610ce7836112a6565b600101905060008167ffffffffffffffff811115610d0757610d07611d9d565b6040519080825280601f01601f191660200182016040528015610d31576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610d3b57509392505050565b73ffffffffffffffffffffffffffffffffffffffff8416610de8576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b6105c8600085858585611388565b60035460ff1615610948576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600080610e4386866113e8565b925092509250610e538282611435565b5090949350505050565b73ffffffffffffffffffffffffffffffffffffffff8416610ead576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b604080516001808252602082018690528183019081526060820185905260808201909252906108d9600087848487611388565b73ffffffffffffffffffffffffffffffffffffffff8416610f30576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b73ffffffffffffffffffffffffffffffffffffffff8516610f80576040517f01a835140000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b610a8a8585858585611388565b610f95611539565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6003805473ffffffffffffffffffffffffffffffffffffffff8381166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff85161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611090610df6565b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610fe03390565b73ffffffffffffffffffffffffffffffffffffffff8216611133576040517fced3e1000000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff841661121b576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b73ffffffffffffffffffffffffffffffffffffffff851661126b576040517f01a835140000000000000000000000000000000000000000000000000000000081526000600482015260240161073b565b6040805160018082526020820186905281830190815260608201859052608082019092529061129d8787848487611388565b50505050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106112ef577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061131b576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061133957662386f26fc10000830492506010015b6305f5e1008310611351576305f5e100830492506008015b612710831061136557612710830492506004015b60648310611377576064830492506002015b600a83106103e85760010192915050565b61139485858585611575565b73ffffffffffffffffffffffffffffffffffffffff841615610a8a57825133906001036113da57602084810151908401516113d3838989858589611581565b50506108d9565b6108d9818787878787611773565b600080600083516041036114225760208401516040850151606086015160001a61141488828585611904565b95509550955050505061142e565b50508151600091506002905b9250925092565b6000826003811115611449576114496126ec565b03611452575050565b6001826003811115611466576114666126ec565b0361149d576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028260038111156114b1576114b16126ec565b036114eb576040517ffce698f70000000000000000000000000000000000000000000000000000000081526004810182905260240161073b565b60038260038111156114ff576114ff6126ec565b03610abe576040517fd78bce0c0000000000000000000000000000000000000000000000000000000081526004810182905260240161073b565b60035460ff16610948576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105c8848484846119fe565b73ffffffffffffffffffffffffffffffffffffffff84163b156108d9576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e61906115f8908990899088908890889060040161271b565b6020604051808303816000875af1925050508015611651575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261164e9181019061276b565b60015b6116e0573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b606091505b5080516000036116d8576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161073b565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461129d576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161073b565b73ffffffffffffffffffffffffffffffffffffffff84163b156108d9576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c81906117ea9089908990889088908890600401612788565b6020604051808303816000875af1925050508015611843575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526118409181019061276b565b60015b611871573d80801561167f576040519150601f19603f3d011682016040523d82523d6000602084013e611684565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461129d576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161073b565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084111561193f57506000915060039050826119f4565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611993573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119ea575060009250600191508290506119f4565b9250600091508190505b9450945094915050565b611a06610df6565b6105c8848484848051825114611a5557815181516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161073b565b3360005b8351811015611bcb5760208181028581018201519085019091015173ffffffffffffffffffffffffffffffffffffffff881615611b595760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205481811015611b25576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16600482015260248101829052604481018390526064810184905260840161073b565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff871615611bb85760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054839290611bb29084906127f3565b90915550505b505080611bc49061254f565b9050611a59565b508251600103611c7357602083015160009060208401519091508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611c64929190918252602082015260400190565b60405180910390a45050610a8a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611ce9929190612806565b60405180910390a45050505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d1c57600080fd5b919050565b60008060408385031215611d3457600080fd5b611d3d83611cf8565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146104e257600080fd5b600060208284031215611d8b57600080fd5b8135611d9681611d4b565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611e1357611e13611d9d565b604052919050565b600067ffffffffffffffff831115611e3557611e35611d9d565b611e6660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601611dcc565b9050828152838383011115611e7a57600080fd5b828260208301376000602084830101529392505050565b600060208284031215611ea357600080fd5b813567ffffffffffffffff811115611eba57600080fd5b8201601f81018413611ecb57600080fd5b611eda84823560208401611e1b565b949350505050565b60005b83811015611efd578181015183820152602001611ee5565b50506000910152565b60008151808452611f1e816020860160208601611ee2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d966020830184611f06565b600060208284031215611f7557600080fd5b5035919050565b600067ffffffffffffffff821115611f9657611f96611d9d565b5060051b60200190565b600082601f830112611fb157600080fd5b81356020611fc6611fc183611f7c565b611dcc565b82815260059290921b84018101918181019086841115611fe557600080fd5b8286015b848110156120005780358352918301918301611fe9565b509695505050505050565b600082601f83011261201c57600080fd5b611d9683833560208501611e1b565b6000806000806080858703121561204157600080fd5b61204a85611cf8565b9350602085013567ffffffffffffffff8082111561206757600080fd5b61207388838901611fa0565b9450604087013591508082111561208957600080fd5b61209588838901611fa0565b935060608701359150808211156120ab57600080fd5b506120b88782880161200b565b91505092959194509250565b60008083601f8401126120d657600080fd5b50813567ffffffffffffffff8111156120ee57600080fd5b60208301915083602082850101111561210657600080fd5b9250929050565b6000806000806060858703121561212357600080fd5b84359350602085013567ffffffffffffffff81111561214157600080fd5b61214d878288016120c4565b9598909750949560400135949350505050565b600080600080600060a0868803121561217857600080fd5b61218186611cf8565b945061218f60208701611cf8565b9350604086013567ffffffffffffffff808211156121ac57600080fd5b6121b889838a01611fa0565b945060608801359150808211156121ce57600080fd5b6121da89838a01611fa0565b935060808801359150808211156121f057600080fd5b506121fd8882890161200b565b9150509295509295909350565b60006020828403121561221c57600080fd5b611d9682611cf8565b6000806040838503121561223857600080fd5b823567ffffffffffffffff8082111561225057600080fd5b818501915085601f83011261226457600080fd5b81356020612274611fc183611f7c565b82815260059290921b8401810191818101908984111561229357600080fd5b948201945b838610156122b8576122a986611cf8565b82529482019490820190612298565b965050860135925050808211156122ce57600080fd5b506122db85828601611fa0565b9150509250929050565b600081518084526020808501945080840160005b83811015612315578151875295820195908201906001016122f9565b509495945050505050565b602081526000611d9660208301846122e5565b60008060008060006080868803121561234b57600080fd5b61235486611cf8565b94506020860135935060408601359250606086013567ffffffffffffffff81111561237e57600080fd5b61238a888289016120c4565b969995985093965092949392505050565b600080604083850312156123ae57600080fd5b6123b783611cf8565b9150602083013580151581146123cc57600080fd5b809150509250929050565b600080604083850312156123ea57600080fd5b6123f383611cf8565b915061240160208401611cf8565b90509250929050565b600080600080600060a0868803121561242257600080fd5b61242b86611cf8565b945061243960208701611cf8565b93506040860135925060608601359150608086013567ffffffffffffffff81111561246357600080fd5b6121fd8882890161200b565b600181811c9082168061248357607f821691505b6020821081036124bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600083516124d4818460208801611ee2565b8351908301906124e8818360208801611ee2565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361258057612580612520565b5060010190565b601f8211156125cd57600081815260208120601f850160051c810160208610156125ae5750805b601f850160051c820191505b818110156108d9578281556001016125ba565b505050565b815167ffffffffffffffff8111156125ec576125ec611d9d565b612600816125fa845461246f565b84612587565b602080601f831160018114612653576000841561261d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556108d9565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156126a057888601518255948401946001909101908401612681565b50858210156126dc57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261276060a0830184611f06565b979650505050505050565b60006020828403121561277d57600080fd5b8151611d9681611d4b565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526127c160a08301866122e5565b82810360608401526127d381866122e5565b905082810360808401526127e78185611f06565b98975050505050505050565b808201808211156103e8576103e8612520565b60408152600061281960408301856122e5565b828103602084015261282b81856122e5565b9594505050505056fea26469706673582212201c1bcca8a5ad9d70ec79b0a8f8430b50a6c23cd601c205f56a93531d70e04bea64736f6c63430008140033000000000000000000000000a287cf6c06280a5e75a0ea1fc131095fdd7794740000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000f4d6f7669654775657373546f6b656e0000000000000000000000000000000000