608060405234801561000f575f80fd5b50604051611d8a380380611d8a83398181016040528101906100319190610547565b806040518060400160405280600a81526020017f54657374546f6b656e32000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f545432000000000000000000000000000000000000000000000000000000000081525081600390816100ad91906107ac565b5080600490816100bd91906107ac565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610130575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610127919061088a565b60405180910390fd5b61013f8161018060201b60201c565b5061017a3361015261024360201b60201c565b600a61015e9190610a0b565b6509184e72a00061016f9190610a55565b61024b60201b60201c565b50610b26565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102bb575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102b2919061088a565b60405180910390fd5b6102cc5f83836102d060201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610320578060025f8282546103149190610a96565b925050819055506103ee565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156103a9578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016103a093929190610ad8565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610435578060025f828254039250508190555061047f565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104dc9190610b0d565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610516826104ed565b9050919050565b6105268161050c565b8114610530575f80fd5b50565b5f815190506105418161051d565b92915050565b5f6020828403121561055c5761055b6104e9565b5b5f61056984828501610533565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806105ed57607f821691505b602082108103610600576105ff6105a9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026106627fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610627565b61066c8683610627565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106b06106ab6106a684610684565b61068d565b610684565b9050919050565b5f819050919050565b6106c983610696565b6106dd6106d5826106b7565b848454610633565b825550505050565b5f90565b6106f16106e5565b6106fc8184846106c0565b505050565b5b8181101561071f576107145f826106e9565b600181019050610702565b5050565b601f8211156107645761073581610606565b61073e84610618565b8101602085101561074d578190505b61076161075985610618565b830182610701565b50505b505050565b5f82821c905092915050565b5f6107845f1984600802610769565b1980831691505092915050565b5f61079c8383610775565b9150826002028217905092915050565b6107b582610572565b67ffffffffffffffff8111156107ce576107cd61057c565b5b6107d882546105d6565b6107e3828285610723565b5f60209050601f831160018114610814575f8415610802578287015190505b61080c8582610791565b865550610873565b601f19841661082286610606565b5f5b8281101561084957848901518255600182019150602085019450602081019050610824565b868310156108665784890151610862601f891682610775565b8355505b6001600288020188555050505b505050505050565b6108848161050c565b82525050565b5f60208201905061089d5f83018461087b565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561092557808604811115610901576109006108a3565b5b60018516156109105780820291505b808102905061091e856108d0565b94506108e5565b94509492505050565b5f8261093d57600190506109f8565b8161094a575f90506109f8565b8160018114610960576002811461096a57610999565b60019150506109f8565b60ff84111561097c5761097b6108a3565b5b8360020a915084821115610993576109926108a3565b5b506109f8565b5060208310610133831016604e8410600b84101617156109ce5782820a9050838111156109c9576109c86108a3565b5b6109f8565b6109db84848460016108dc565b925090508184048111156109f2576109f16108a3565b5b81810290505b9392505050565b5f60ff82169050919050565b5f610a1582610684565b9150610a20836109ff565b9250610a4d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461092e565b905092915050565b5f610a5f82610684565b9150610a6a83610684565b9250828202610a7881610684565b91508282048414831517610a8f57610a8e6108a3565b5b5092915050565b5f610aa082610684565b9150610aab83610684565b9250828201905080821115610ac357610ac26108a3565b5b92915050565b610ad281610684565b82525050565b5f606082019050610aeb5f83018661087b565b610af86020830185610ac9565b610b056040830184610ac9565b949350505050565b5f602082019050610b205f830184610ac9565b92915050565b61125780610b335f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806370a082311161009557806395d89b411161006457806395d89b411461025d578063a9059cbb1461027b578063dd62ed3e146102ab578063f2fde38b146102db576100f3565b806370a08231146101e9578063715018a61461021957806379cc6790146102235780638da5cb5b1461023f576100f3565b806323b872dd116100d157806323b872dd14610163578063313ce5671461019357806340c10f19146101b157806342966c68146101cd576100f3565b806306fdde03146100f7578063095ea7b31461011557806318160ddd14610145575b5f80fd5b6100ff6102f7565b60405161010c9190610ea5565b60405180910390f35b61012f600480360381019061012a9190610f56565b610387565b60405161013c9190610fae565b60405180910390f35b61014d6103a9565b60405161015a9190610fd6565b60405180910390f35b61017d60048036038101906101789190610fef565b6103b2565b60405161018a9190610fae565b60405180910390f35b61019b6103e0565b6040516101a8919061105a565b60405180910390f35b6101cb60048036038101906101c69190610f56565b6103e8565b005b6101e760048036038101906101e29190611073565b6103fe565b005b61020360048036038101906101fe919061109e565b610412565b6040516102109190610fd6565b60405180910390f35b610221610457565b005b61023d60048036038101906102389190610f56565b61046a565b005b61024761048a565b60405161025491906110d8565b60405180910390f35b6102656104b2565b6040516102729190610ea5565b60405180910390f35b61029560048036038101906102909190610f56565b610542565b6040516102a29190610fae565b60405180910390f35b6102c560048036038101906102c091906110f1565b610564565b6040516102d29190610fd6565b60405180910390f35b6102f560048036038101906102f0919061109e565b6105e6565b005b6060600380546103069061115c565b80601f01602080910402602001604051908101604052809291908181526020018280546103329061115c565b801561037d5780601f106103545761010080835404028352916020019161037d565b820191905f5260205f20905b81548152906001019060200180831161036057829003601f168201915b5050505050905090565b5f8061039161066a565b905061039e818585610671565b600191505092915050565b5f600254905090565b5f806103bc61066a565b90506103c9858285610683565b6103d4858585610715565b60019150509392505050565b5f6012905090565b6103f0610805565b6103fa828261088c565b5050565b61040f61040961066a565b8261090b565b50565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61045f610805565b6104685f61098a565b565b61047c8261047661066a565b83610683565b610486828261090b565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546104c19061115c565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061115c565b80156105385780601f1061050f57610100808354040283529160200191610538565b820191905f5260205f20905b81548152906001019060200180831161051b57829003601f168201915b5050505050905090565b5f8061054c61066a565b9050610559818585610715565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b6105ee610805565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361065e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161065591906110d8565b60405180910390fd5b6106678161098a565b50565b5f33905090565b61067e8383836001610a4d565b505050565b5f61068e8484610564565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461070f5781811015610700578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016106f79392919061118c565b60405180910390fd5b61070e84848484035f610a4d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610785575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161077c91906110d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f5575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107ec91906110d8565b60405180910390fd5b610800838383610c1c565b505050565b61080d61066a565b73ffffffffffffffffffffffffffffffffffffffff1661082b61048a565b73ffffffffffffffffffffffffffffffffffffffff161461088a5761084e61066a565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161088191906110d8565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108fc575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108f391906110d8565b60405180910390fd5b6109075f8383610c1c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361097b575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161097291906110d8565b60405180910390fd5b610986825f83610c1c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610abd575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610ab491906110d8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b2d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610b2491906110d8565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610c16578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610c0d9190610fd6565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c6c578060025f828254610c6091906111ee565b92505081905550610d3a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610cf5578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610cec9392919061118c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d81578060025f8282540392505081905550610dcb565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610e289190610fd6565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610e7782610e35565b610e818185610e3f565b9350610e91818560208601610e4f565b610e9a81610e5d565b840191505092915050565b5f6020820190508181035f830152610ebd8184610e6d565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ef282610ec9565b9050919050565b610f0281610ee8565b8114610f0c575f80fd5b50565b5f81359050610f1d81610ef9565b92915050565b5f819050919050565b610f3581610f23565b8114610f3f575f80fd5b50565b5f81359050610f5081610f2c565b92915050565b5f8060408385031215610f6c57610f6b610ec5565b5b5f610f7985828601610f0f565b9250506020610f8a85828601610f42565b9150509250929050565b5f8115159050919050565b610fa881610f94565b82525050565b5f602082019050610fc15f830184610f9f565b92915050565b610fd081610f23565b82525050565b5f602082019050610fe95f830184610fc7565b92915050565b5f805f6060848603121561100657611005610ec5565b5b5f61101386828701610f0f565b935050602061102486828701610f0f565b925050604061103586828701610f42565b9150509250925092565b5f60ff82169050919050565b6110548161103f565b82525050565b5f60208201905061106d5f83018461104b565b92915050565b5f6020828403121561108857611087610ec5565b5b5f61109584828501610f42565b91505092915050565b5f602082840312156110b3576110b2610ec5565b5b5f6110c084828501610f0f565b91505092915050565b6110d281610ee8565b82525050565b5f6020820190506110eb5f8301846110c9565b92915050565b5f806040838503121561110757611106610ec5565b5b5f61111485828601610f0f565b925050602061112585828601610f0f565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061117357607f821691505b6020821081036111865761118561112f565b5b50919050565b5f60608201905061119f5f8301866110c9565b6111ac6020830185610fc7565b6111b96040830184610fc7565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6111f882610f23565b915061120383610f23565b925082820190508082111561121b5761121a6111c1565b5b9291505056fea26469706673582212200a9254352d15f9d7ebb6279225bf4789fa1f54baeb6a9a5478281d7f28c5ebb664736f6c634300081a00330000000000000000000000008ca22db2e2a18726f9888fd781ee7ccf7e1e8dc9