608060405234801561000f575f80fd5b506040516128df3803806128df83398181016040528101906100319190610365565b336040518060400160405280600a81526020017f582e54656368204e4654000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f584e530000000000000000000000000000000000000000000000000000000000815250815f90816100ac91906105b9565b5080600190816100bc91906105b9565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361012f575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161012691906106c7565b60405180910390fd5b61013e8161015560201b60201c565b50806008908161014e91906105b9565b50506106e0565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61027782610231565b810181811067ffffffffffffffff8211171561029657610295610241565b5b80604052505050565b5f6102a8610218565b90506102b4828261026e565b919050565b5f67ffffffffffffffff8211156102d3576102d2610241565b5b6102dc82610231565b9050602081019050919050565b8281835e5f83830152505050565b5f610309610304846102b9565b61029f565b9050828152602081018484840111156103255761032461022d565b5b6103308482856102e9565b509392505050565b5f82601f83011261034c5761034b610229565b5b815161035c8482602086016102f7565b91505092915050565b5f6020828403121561037a57610379610221565b5b5f82015167ffffffffffffffff81111561039757610396610225565b5b6103a384828501610338565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103fa57607f821691505b60208210810361040d5761040c6103b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261046f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610434565b6104798683610434565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6104bd6104b86104b384610491565b61049a565b610491565b9050919050565b5f819050919050565b6104d6836104a3565b6104ea6104e2826104c4565b848454610440565b825550505050565b5f90565b6104fe6104f2565b6105098184846104cd565b505050565b5b8181101561052c576105215f826104f6565b60018101905061050f565b5050565b601f8211156105715761054281610413565b61054b84610425565b8101602085101561055a578190505b61056e61056685610425565b83018261050e565b50505b505050565b5f82821c905092915050565b5f6105915f1984600802610576565b1980831691505092915050565b5f6105a98383610582565b9150826002028217905092915050565b6105c2826103ac565b67ffffffffffffffff8111156105db576105da610241565b5b6105e582546103e3565b6105f0828285610530565b5f60209050601f831160018114610621575f841561060f578287015190505b610619858261059e565b865550610680565b601f19841661062f86610413565b5f5b8281101561065657848901518255600182019150602085019450602081019050610631565b86831015610673578489015161066f601f891682610582565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106b182610688565b9050919050565b6106c1816106a7565b82525050565b5f6020820190506106da5f8301846106b8565b92915050565b6121f2806106ed5f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c806370a08231116100ab578063b88d4fde1161006f578063b88d4fde146102ef578063c87b56dd1461030b578063d547cfb71461033b578063e985e9c514610359578063f2fde38b146103895761011f565b806370a082311461025d578063715018a61461028d5780638da5cb5b1461029757806395d89b41146102b5578063a22cb465146102d35761011f565b806323b872dd116100f257806323b872dd146101bd57806342842e0e146101d957806355f804b3146101f55780636352211e146102115780636a627842146102415761011f565b806301ffc9a71461012357806306fdde0314610153578063081812fc14610171578063095ea7b3146101a1575b5f80fd5b61013d60048036038101906101389190611762565b6103a5565b60405161014a91906117a7565b60405180910390f35b61015b610486565b6040516101689190611830565b60405180910390f35b61018b60048036038101906101869190611883565b610515565b60405161019891906118ed565b60405180910390f35b6101bb60048036038101906101b69190611930565b610530565b005b6101d760048036038101906101d2919061196e565b610546565b005b6101f360048036038101906101ee919061196e565b610645565b005b61020f600480360381019061020a9190611aea565b610664565b005b61022b60048036038101906102269190611883565b61067f565b60405161023891906118ed565b60405180910390f35b61025b60048036038101906102569190611b31565b610690565b005b61027760048036038101906102729190611b31565b6106b7565b6040516102849190611b6b565b60405180910390f35b61029561076d565b005b61029f610780565b6040516102ac91906118ed565b60405180910390f35b6102bd6107a8565b6040516102ca9190611830565b60405180910390f35b6102ed60048036038101906102e89190611bae565b610838565b005b61030960048036038101906103049190611c8a565b61084e565b005b61032560048036038101906103209190611883565b610873565b6040516103329190611830565b60405180910390f35b610343610905565b6040516103509190611830565b60405180910390f35b610373600480360381019061036e9190611d0a565b610991565b60405161038091906117a7565b60405180910390f35b6103a3600480360381019061039e9190611b31565b610a1f565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061046f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061047f575061047e82610aa3565b5b9050919050565b60605f805461049490611d75565b80601f01602080910402602001604051908101604052809291908181526020018280546104c090611d75565b801561050b5780601f106104e25761010080835404028352916020019161050b565b820191905f5260205f20905b8154815290600101906020018083116104ee57829003601f168201915b5050505050905090565b5f61051f82610b0c565b5061052982610b92565b9050919050565b610542828261053d610bcb565b610bd2565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105b6575f6040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016105ad91906118ed565b60405180910390fd5b5f6105c983836105c4610bcb565b610be4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461063f578382826040517f64283d7b00000000000000000000000000000000000000000000000000000000815260040161063693929190611da5565b60405180910390fd5b50505050565b61065f83838360405180602001604052805f81525061084e565b505050565b61066c610def565b806008908161067b9190611f77565b5050565b5f61068982610b0c565b9050919050565b5f60075f8154809291906106a390612073565b9190505590506106b38282610e76565b5050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610728575f6040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161071f91906118ed565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610775610def565b61077e5f610e93565b565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546107b790611d75565b80601f01602080910402602001604051908101604052809291908181526020018280546107e390611d75565b801561082e5780601f106108055761010080835404028352916020019161082e565b820191905f5260205f20905b81548152906001019060200180831161081157829003601f168201915b5050505050905090565b61084a610843610bcb565b8383610f56565b5050565b610859848484610546565b61086d610864610bcb565b858585856110bf565b50505050565b60606008805461088290611d75565b80601f01602080910402602001604051908101604052809291908181526020018280546108ae90611d75565b80156108f95780601f106108d0576101008083540402835291602001916108f9565b820191905f5260205f20905b8154815290600101906020018083116108dc57829003601f168201915b50505050509050919050565b6008805461091290611d75565b80601f016020809104026020016040519081016040528092919081815260200182805461093e90611d75565b80156109895780601f1061096057610100808354040283529160200191610989565b820191905f5260205f20905b81548152906001019060200180831161096c57829003601f168201915b505050505081565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b610a27610def565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a97575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a8e91906118ed565b60405180910390fd5b610aa081610e93565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f80610b178361126b565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b8957826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610b809190611b6b565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b610bdf83838360016112a4565b505050565b5f80610bef8461126b565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610c3057610c2f818486611463565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cbb57610c6f5f855f806112a4565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610d3a57600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b610df7610bcb565b73ffffffffffffffffffffffffffffffffffffffff16610e15610780565b73ffffffffffffffffffffffffffffffffffffffff1614610e7457610e38610bcb565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e6b91906118ed565b60405180910390fd5b565b610e8f828260405180602001604052805f815250611526565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fc657816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610fbd91906118ed565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110b291906117a7565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115611264578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b815260040161111d949392919061210c565b6020604051808303815f875af192505050801561115857506040513d601f19601f82011682018060405250810190611155919061216a565b60015b6111d9573d805f8114611186576040519150601f19603f3d011682016040523d82523d5f602084013e61118b565b606091505b505f8151036111d157836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016111c891906118ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461126257836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161125991906118ed565b60405180910390fd5b505b5050505050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806112dc57505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561140e575f6112eb84610b0c565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561135557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561136857506113668184610991565b155b156113aa57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016113a191906118ed565b60405180910390fd5b811561140c57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b61146e838383611549565b611521575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036114e257806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016114d99190611b6b565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401611518929190612195565b60405180910390fd5b505050565b6115308383611609565b61154461153b610bcb565b5f8585856110bf565b505050565b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561160057508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115c157506115c08484610991565b5b806115ff57508273ffffffffffffffffffffffffffffffffffffffff166115e783610b92565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611679575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161167091906118ed565b60405180910390fd5b5f61168583835f610be4565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116f7575f6040517f73c6ac6e0000000000000000000000000000000000000000000000000000000081526004016116ee91906118ed565b60405180910390fd5b505050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6117418161170d565b811461174b575f80fd5b50565b5f8135905061175c81611738565b92915050565b5f6020828403121561177757611776611705565b5b5f6117848482850161174e565b91505092915050565b5f8115159050919050565b6117a18161178d565b82525050565b5f6020820190506117ba5f830184611798565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611802826117c0565b61180c81856117ca565b935061181c8185602086016117da565b611825816117e8565b840191505092915050565b5f6020820190508181035f83015261184881846117f8565b905092915050565b5f819050919050565b61186281611850565b811461186c575f80fd5b50565b5f8135905061187d81611859565b92915050565b5f6020828403121561189857611897611705565b5b5f6118a58482850161186f565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118d7826118ae565b9050919050565b6118e7816118cd565b82525050565b5f6020820190506119005f8301846118de565b92915050565b61190f816118cd565b8114611919575f80fd5b50565b5f8135905061192a81611906565b92915050565b5f806040838503121561194657611945611705565b5b5f6119538582860161191c565b92505060206119648582860161186f565b9150509250929050565b5f805f6060848603121561198557611984611705565b5b5f6119928682870161191c565b93505060206119a38682870161191c565b92505060406119b48682870161186f565b9150509250925092565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6119fc826117e8565b810181811067ffffffffffffffff82111715611a1b57611a1a6119c6565b5b80604052505050565b5f611a2d6116fc565b9050611a3982826119f3565b919050565b5f67ffffffffffffffff821115611a5857611a576119c6565b5b611a61826117e8565b9050602081019050919050565b828183375f83830152505050565b5f611a8e611a8984611a3e565b611a24565b905082815260208101848484011115611aaa57611aa96119c2565b5b611ab5848285611a6e565b509392505050565b5f82601f830112611ad157611ad06119be565b5b8135611ae1848260208601611a7c565b91505092915050565b5f60208284031215611aff57611afe611705565b5b5f82013567ffffffffffffffff811115611b1c57611b1b611709565b5b611b2884828501611abd565b91505092915050565b5f60208284031215611b4657611b45611705565b5b5f611b538482850161191c565b91505092915050565b611b6581611850565b82525050565b5f602082019050611b7e5f830184611b5c565b92915050565b611b8d8161178d565b8114611b97575f80fd5b50565b5f81359050611ba881611b84565b92915050565b5f8060408385031215611bc457611bc3611705565b5b5f611bd18582860161191c565b9250506020611be285828601611b9a565b9150509250929050565b5f67ffffffffffffffff821115611c0657611c056119c6565b5b611c0f826117e8565b9050602081019050919050565b5f611c2e611c2984611bec565b611a24565b905082815260208101848484011115611c4a57611c496119c2565b5b611c55848285611a6e565b509392505050565b5f82601f830112611c7157611c706119be565b5b8135611c81848260208601611c1c565b91505092915050565b5f805f8060808587031215611ca257611ca1611705565b5b5f611caf8782880161191c565b9450506020611cc08782880161191c565b9350506040611cd18782880161186f565b925050606085013567ffffffffffffffff811115611cf257611cf1611709565b5b611cfe87828801611c5d565b91505092959194509250565b5f8060408385031215611d2057611d1f611705565b5b5f611d2d8582860161191c565b9250506020611d3e8582860161191c565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611d8c57607f821691505b602082108103611d9f57611d9e611d48565b5b50919050565b5f606082019050611db85f8301866118de565b611dc56020830185611b5c565b611dd260408301846118de565b949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611e367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611dfb565b611e408683611dfb565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611e7b611e76611e7184611850565b611e58565b611850565b9050919050565b5f819050919050565b611e9483611e61565b611ea8611ea082611e82565b848454611e07565b825550505050565b5f90565b611ebc611eb0565b611ec7818484611e8b565b505050565b5b81811015611eea57611edf5f82611eb4565b600181019050611ecd565b5050565b601f821115611f2f57611f0081611dda565b611f0984611dec565b81016020851015611f18578190505b611f2c611f2485611dec565b830182611ecc565b50505b505050565b5f82821c905092915050565b5f611f4f5f1984600802611f34565b1980831691505092915050565b5f611f678383611f40565b9150826002028217905092915050565b611f80826117c0565b67ffffffffffffffff811115611f9957611f986119c6565b5b611fa38254611d75565b611fae828285611eee565b5f60209050601f831160018114611fdf575f8415611fcd578287015190505b611fd78582611f5c565b86555061203e565b601f198416611fed86611dda565b5f5b8281101561201457848901518255600182019150602085019450602081019050611fef565b86831015612031578489015161202d601f891682611f40565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61207d82611850565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036120af576120ae612046565b5b600182019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f6120de826120ba565b6120e881856120c4565b93506120f88185602086016117da565b612101816117e8565b840191505092915050565b5f60808201905061211f5f8301876118de565b61212c60208301866118de565b6121396040830185611b5c565b818103606083015261214b81846120d4565b905095945050505050565b5f8151905061216481611738565b92915050565b5f6020828403121561217f5761217e611705565b5b5f61218c84828501612156565b91505092915050565b5f6040820190506121a85f8301856118de565b6121b56020830184611b5c565b939250505056fea26469706673582212200e4eeaf5390da1baa91108eafa171c92714ef381c3448cdba86eee8bee53e99764736f6c6343000819003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d5878787942796a4c59797368594242545341676536754a617571344a33697a73534d78786e43514471476e570000000000000000000000