0x60806040526040518060400160405280600581526020017f76616c7565000000000000000000000000000000000000000000000000000000815250600590816100489190610361565b50620f424060085560646009556040518060400160405280600381526020017f616e790000000000000000000000000000000000000000000000000000000000815250600a90816100999190610361565b503480156100a657600080fd5b5060405161248738038061248783398181016040528101906100c89190610579565b818181600390816100d99190610361565b5080600490816100e99190610361565b50505060066001816001815401808255809150500390600052602060002090505050506105f1565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061019257607f821691505b6020821081036101a5576101a461014b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261020d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826101d0565b61021786836101d0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061025e6102596102548461022f565b610239565b61022f565b9050919050565b6000819050919050565b61027883610243565b61028c61028482610265565b8484546101dd565b825550505050565b600090565b6102a1610294565b6102ac81848461026f565b505050565b5b818110156102d0576102c5600082610299565b6001810190506102b2565b5050565b601f821115610315576102e6816101ab565b6102ef846101c0565b810160208510156102fe578190505b61031261030a856101c0565b8301826102b1565b50505b505050565b600082821c905092915050565b60006103386000198460080261031a565b1980831691505092915050565b60006103518383610327565b9150826002028217905092915050565b61036a82610111565b67ffffffffffffffff8111156103835761038261011c565b5b61038d825461017a565b6103988282856102d4565b600060209050601f8311600181146103cb57600084156103b9578287015190505b6103c38582610345565b86555061042b565b601f1984166103d9866101ab565b60005b82811015610401578489015182556001820191506020850194506020810190506103dc565b8683101561041e578489015161041a601f891682610327565b8355505b6001600288020188555050505b505050505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61046b82610451565b810181811067ffffffffffffffff8211171561048a5761048961011c565b5b80604052505050565b600061049d610433565b90506104a98282610462565b919050565b600067ffffffffffffffff8211156104c9576104c861011c565b5b6104d282610451565b9050602081019050919050565b60005b838110156104fd5780820151818401526020810190506104e2565b60008484015250505050565b600061051c610517846104ae565b610493565b9050828152602081018484840111156105385761053761044c565b5b6105438482856104df565b509392505050565b600082601f8301126105605761055f610447565b5b8151610570848260208601610509565b91505092915050565b600080604083850312156105905761058f61043d565b5b600083015167ffffffffffffffff8111156105ae576105ad610442565b5b6105ba8582860161054b565b925050602083015167ffffffffffffffff8111156105db576105da610442565b5b6105e78582860161054b565b9150509250929050565b611e87806106006000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063830953ab11610097578063976b311311610066578063976b3113146102b1578063a9059cbb146102e1578063d5abeb0114610311578063dd62ed3e1461032f57610100565b8063830953ab146102295780638615d85514610247578063943e82161461027757806395d89b411461029357610100565b8063313ce567116100d3578063313ce567146101a15780634e71d92d146101bf578063624601b6146101c957806370a08231146101f957610100565b806306fdde0314610105578063095ea7b31461012357806318160ddd1461015357806323b872dd14610171575b600080fd5b61010d61035f565b60405161011a9190611423565b60405180910390f35b61013d600480360381019061013891906114e3565b6103f1565b60405161014a919061153e565b60405180910390f35b61015b610414565b6040516101689190611568565b60405180910390f35b61018b60048036038101906101869190611583565b61041e565b604051610198919061153e565b60405180910390f35b6101a961044d565b6040516101b691906115f2565b60405180910390f35b6101c7610456565b005b6101e360048036038101906101de919061160d565b610590565b6040516101f0919061153e565b60405180910390f35b610213600480360381019061020e919061160d565b6105b0565b6040516102209190611568565b60405180910390f35b6102316105f8565b60405161023e9190611568565b60405180910390f35b610261600480360381019061025c919061169f565b6105fe565b60405161026e9190611568565b60405180910390f35b610291600480360381019061028c9190611724565b6106df565b005b61029b61092a565b6040516102a89190611423565b60405180910390f35b6102cb60048036038101906102c69190611764565b6109bc565b6040516102d89190611983565b60405180910390f35b6102fb60048036038101906102f691906114e3565b610b03565b604051610308919061153e565b60405180910390f35b610319610b26565b6040516103269190611568565b60405180910390f35b610349600480360381019061034491906119a5565b610b2c565b6040516103569190611568565b60405180910390f35b60606003805461036e90611a14565b80601f016020809104026020016040519081016040528092919081815260200182805461039a90611a14565b80156103e75780601f106103bc576101008083540402835291602001916103e7565b820191906000526020600020905b8154815290600101906020018083116103ca57829003601f168201915b5050505050905090565b6000806103fc610bb3565b9050610409818585610bbb565b600191505092915050565b6000600254905090565b600080610429610bb3565b9050610436858285610bcd565b610441858585610c61565b60019150509392505050565b60006012905090565b600854600954610464610414565b61046e9190611a74565b11156104a6576040517fcbe2483100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561052a576040517f0b1327a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61053633600954610d55565b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b60076020528060005260406000206000915054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60095481565b60008061060a336105b0565b03610641576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610649610414565b821115610682576040517f0d92730000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600181600181540180825580915050039060005260206000209060090201905084848260020191826106b9929190611c8e565b5082816003018190555060016006805490506106d59190611d5e565b9150509392505050565b6000600683815481106106f5576106f4611d92565b5b906000526020600020906009020190508060080160019054906101000a900460ff161561074e576040517f66b6cb4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107643382600001610dd790919063ffffffff16565b1561079b576040517f7c9a1cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006107a6336105b0565b9050600081036107e2576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028111156107f6576107f5611dc1565b5b83600281111561080957610808611dc1565b5b0361082e57808260060160008282546108229190611a74565b92505081905550610897565b6001600281111561084257610841611dc1565b5b83600281111561085557610854611dc1565b5b0361087a578082600501600082825461086e9190611a74565b92505081905550610896565b8082600701600082825461088e9190611a74565b925050819055505b5b6108ad3383600001610e0790919063ffffffff16565b50808260040160008282546108c29190611a74565b9250508190555081600301548260040154106109245760018260080160016101000a81548160ff0219169083151502179055508160060154826005015411156109235760018260080160006101000a81548160ff0219169083151502179055505b5b50505050565b60606004805461093990611a14565b80601f016020809104026020016040519081016040528092919081815260200182805461096590611a14565b80156109b25780601f10610987576101008083540402835291602001916109b2565b820191906000526020600020905b81548152906001019060200180831161099557829003601f168201915b5050505050905090565b6109c4611343565b6000600683815481106109da576109d9611d92565b5b90600052602060002090600902019050604051806101200160405280610a0283600001610e37565b8152602001826002018054610a1690611a14565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4290611a14565b8015610a8f5780601f10610a6457610100808354040283529160200191610a8f565b820191906000526020600020905b815481529060010190602001808311610a7257829003601f168201915b5050505050815260200182600301548152602001826004015481526020018260050154815260200182600601548152602001826007015481526020018260080160009054906101000a900460ff16151581526020018260080160019054906101000a900460ff161515815250915050919050565b600080610b0e610bb3565b9050610b1b818585610c61565b600191505092915050565b60085481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b610bc88383836001610e58565b505050565b6000610bd98484610b2c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c5b5781811015610c4b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610c4293929190611dff565b60405180910390fd5b610c5a84848484036000610e58565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610cd35760006040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610cca9190611e36565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d455760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d3c9190611e36565b60405180910390fd5b610d5083838361102f565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dc75760006040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610dbe9190611e36565b60405180910390fd5b610dd36000838361102f565b5050565b6000610dff836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611254565b905092915050565b6000610e2f836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611277565b905092915050565b60606000610e47836000016112e7565b905060608190508092505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610eca5760006040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ec19190611e36565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f3c5760006040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610f339190611e36565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015611029578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110209190611568565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110815780600260008282546110759190611a74565b92505081905550611154565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561110d578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161110493929190611dff565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361119d57806002600082825403925050819055506111ea565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112479190611568565b60405180910390a3505050565b600080836001016000848152602001908152602001600020541415905092915050565b60006112838383611254565b6112dc5782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506112e1565b600090505b92915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561133757602002820191906000526020600020905b815481526020019060010190808311611323575b50505050509050919050565b604051806101200160405280606081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b600081519050919050565b600082825260208201905092915050565b60005b838110156113cd5780820151818401526020810190506113b2565b60008484015250505050565b6000601f19601f8301169050919050565b60006113f582611393565b6113ff818561139e565b935061140f8185602086016113af565b611418816113d9565b840191505092915050565b6000602082019050818103600083015261143d81846113ea565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061147a8261144f565b9050919050565b61148a8161146f565b811461149557600080fd5b50565b6000813590506114a781611481565b92915050565b6000819050919050565b6114c0816114ad565b81146114cb57600080fd5b50565b6000813590506114dd816114b7565b92915050565b600080604083850312156114fa576114f9611445565b5b600061150885828601611498565b9250506020611519858286016114ce565b9150509250929050565b60008115159050919050565b61153881611523565b82525050565b6000602082019050611553600083018461152f565b92915050565b611562816114ad565b82525050565b600060208201905061157d6000830184611559565b92915050565b60008060006060848603121561159c5761159b611445565b5b60006115aa86828701611498565b93505060206115bb86828701611498565b92505060406115cc868287016114ce565b9150509250925092565b600060ff82169050919050565b6115ec816115d6565b82525050565b600060208201905061160760008301846115e3565b92915050565b60006020828403121561162357611622611445565b5b600061163184828501611498565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261165f5761165e61163a565b5b8235905067ffffffffffffffff81111561167c5761167b61163f565b5b60208301915083600182028301111561169857611697611644565b5b9250929050565b6000806000604084860312156116b8576116b7611445565b5b600084013567ffffffffffffffff8111156116d6576116d561144a565b5b6116e286828701611649565b935093505060206116f5868287016114ce565b9150509250925092565b6003811061170c57600080fd5b50565b60008135905061171e816116ff565b92915050565b6000806040838503121561173b5761173a611445565b5b6000611749858286016114ce565b925050602061175a8582860161170f565b9150509250929050565b60006020828403121561177a57611779611445565b5b6000611788848285016114ce565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6117c68161146f565b82525050565b60006117d883836117bd565b60208301905092915050565b6000602082019050919050565b60006117fc82611791565b611806818561179c565b9350611811836117ad565b8060005b8381101561184257815161182988826117cc565b9750611834836117e4565b925050600181019050611815565b5085935050505092915050565b600082825260208201905092915050565b600061186b82611393565b611875818561184f565b93506118858185602086016113af565b61188e816113d9565b840191505092915050565b6118a2816114ad565b82525050565b6118b181611523565b82525050565b60006101208301600083015184820360008601526118d582826117f1565b915050602083015184820360208601526118ef8282611860565b91505060408301516119046040860182611899565b5060608301516119176060860182611899565b50608083015161192a6080860182611899565b5060a083015161193d60a0860182611899565b5060c083015161195060c0860182611899565b5060e083015161196360e08601826118a8565b506101008301516119786101008601826118a8565b508091505092915050565b6000602082019050818103600083015261199d81846118b7565b905092915050565b600080604083850312156119bc576119bb611445565b5b60006119ca85828601611498565b92505060206119db85828601611498565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611a2c57607f821691505b602082108103611a3f57611a3e6119e5565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611a7f826114ad565b9150611a8a836114ad565b9250828201905080821115611aa257611aa1611a45565b5b92915050565b600082905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611b447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611b07565b611b4e8683611b07565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611b8b611b86611b81846114ad565b611b66565b6114ad565b9050919050565b6000819050919050565b611ba583611b70565b611bb9611bb182611b92565b848454611b14565b825550505050565b600090565b611bce611bc1565b611bd9818484611b9c565b505050565b5b81811015611bfd57611bf2600082611bc6565b600181019050611bdf565b5050565b601f821115611c4257611c1381611ae2565b611c1c84611af7565b81016020851015611c2b578190505b611c3f611c3785611af7565b830182611bde565b50505b505050565b600082821c905092915050565b6000611c6560001984600802611c47565b1980831691505092915050565b6000611c7e8383611c54565b9150826002028217905092915050565b611c988383611aa8565b67ffffffffffffffff811115611cb157611cb0611ab3565b5b611cbb8254611a14565b611cc6828285611c01565b6000601f831160018114611cf55760008415611ce3578287013590505b611ced8582611c72565b865550611d55565b601f198416611d0386611ae2565b60005b82811015611d2b57848901358255600182019150602085019450602081019050611d06565b86831015611d485784890135611d44601f891682611c54565b8355505b6001600288020188555050505b50505050505050565b6000611d69826114ad565b9150611d74836114ad565b9250828203905081811115611d8c57611d8b611a45565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b611df98161146f565b82525050565b6000606082019050611e146000830186611df0565b611e216020830185611559565b611e2e6040830184611559565b949350505050565b6000602082019050611e4b6000830184611df0565b9291505056fea264697066735822122035cc18c865a83b77d91c56bd290c0306f9e358142bde89ed1741c2b92e0dcd4664736f6c634300081a003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000771797071676f6f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000037179700000000000000000000000000000000000000000000000000000000000