60806040525f600655348015610013575f80fd5b506100306100256102a260201b60201c565b6102a960201b60201c565b6040518060400160405280600f81526020017f507265736964656e74205472756d7000000000000000000000000000000000008152506004908161007491906106fb565b506040518060400160405280600281526020017f3437000000000000000000000000000000000000000000000000000000000000815250600590816100b991906106fb565b506100f2336100cc61036a60201b60201c565b600a6100d89190610932565b633b9aca006100e7919061097c565b61037260201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610153573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101779190610a1b565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102009190610a1b565b6040518363ffffffff1660e01b815260040161021d929190610a55565b6020604051808303815f875af1158015610239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061025d9190610a1b565b600c5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610b4f565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6008905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103d790610ad6565b60405180910390fd5b8060035f8282546103f19190610af4565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161049f9190610b36565b60405180910390a36104b85f83836104bc60201b60201c565b5050565b505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061053c57607f821691505b60208210810361054f5761054e6104f8565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610576565b6105bb8683610576565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105ff6105fa6105f5846105d3565b6105dc565b6105d3565b9050919050565b5f819050919050565b610618836105e5565b61062c61062482610606565b848454610582565b825550505050565b5f90565b610640610634565b61064b81848461060f565b505050565b5b8181101561066e576106635f82610638565b600181019050610651565b5050565b601f8211156106b35761068481610555565b61068d84610567565b8101602085101561069c578190505b6106b06106a885610567565b830182610650565b50505b505050565b5f82821c905092915050565b5f6106d35f19846008026106b8565b1980831691505092915050565b5f6106eb83836106c4565b9150826002028217905092915050565b610704826104c1565b67ffffffffffffffff81111561071d5761071c6104cb565b5b6107278254610525565b610732828285610672565b5f60209050601f831160018114610763575f8415610751578287015190505b61075b85826106e0565b8655506107c2565b601f19841661077186610555565b5f5b8281101561079857848901518255600182019150602085019450602081019050610773565b868310156107b557848901516107b1601f8916826106c4565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561084c57808604811115610828576108276107ca565b5b60018516156108375780820291505b8081029050610845856107f7565b945061080c565b94509492505050565b5f82610864576001905061091f565b81610871575f905061091f565b81600181146108875760028114610891576108c0565b600191505061091f565b60ff8411156108a3576108a26107ca565b5b8360020a9150848211156108ba576108b96107ca565b5b5061091f565b5060208310610133831016604e8410600b84101617156108f55782820a9050838111156108f0576108ef6107ca565b5b61091f565b6109028484846001610803565b92509050818404811115610919576109186107ca565b5b81810290505b9392505050565b5f60ff82169050919050565b5f61093c826105d3565b915061094783610926565b92506109747fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610855565b905092915050565b5f610986826105d3565b9150610991836105d3565b925082820261099f816105d3565b915082820484148315176109b6576109b56107ca565b5b5092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6109ea826109c1565b9050919050565b6109fa816109e0565b8114610a04575f80fd5b50565b5f81519050610a15816109f1565b92915050565b5f60208284031215610a3057610a2f6109bd565b5b5f610a3d84828501610a07565b91505092915050565b610a4f816109e0565b82525050565b5f604082019050610a685f830185610a46565b610a756020830184610a46565b9392505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f610ac0601f83610a7c565b9150610acb82610a8c565b602082019050919050565b5f6020820190508181035f830152610aed81610ab4565b9050919050565b5f610afe826105d3565b9150610b09836105d3565b9250828201905080821115610b2157610b206107ca565b5b92915050565b610b30816105d3565b82525050565b5f602082019050610b495f830184610b27565b92915050565b611e9b80610b5c5f395ff3fe608060405234801561000f575f80fd5b506004361061012a575f3560e01c8063715018a6116100ab578063beabacc81161006f578063beabacc81461031c578063ca72a4e714610338578063dd62ed3e14610354578063e2f4560514610384578063f2fde38b146103a25761012a565b8063715018a61461028a5780638da5cb5b1461029457806395d89b41146102b2578063a9059cbb146102d0578063b18834aa146103005761012a565b806326ededb8116100f257806326ededb8146101e6578063313ce56714610202578063321bef231461022057806349bd5a5e1461023c57806370a082311461025a5761012a565b806306fdde031461012e578063095ea7b31461014c57806318160ddd1461017c5780632349e24a1461019a57806323b872dd146101b6575b5f80fd5b6101366103be565b604051610143919061140c565b60405180910390f35b610166600480360381019061016191906114ca565b61044e565b6040516101739190611522565b60405180910390f35b610184610470565b604051610191919061154a565b60405180910390f35b6101b460048036038101906101af91906116cd565b610479565b005b6101d060048036038101906101cb9190611727565b610656565b6040516101dd9190611522565b60405180910390f35b61020060048036038101906101fb91906117d0565b610684565b005b61020a610751565b6040516102179190611848565b60405180910390f35b61023a600480360381019061023591906117d0565b610759565b005b610244610826565b6040516102519190611870565b60405180910390f35b610274600480360381019061026f9190611889565b61084b565b604051610281919061154a565b60405180910390f35b610292610891565b005b61029c6108a4565b6040516102a99190611870565b60405180910390f35b6102ba6108cb565b6040516102c7919061140c565b60405180910390f35b6102ea60048036038101906102e591906114ca565b61095b565b6040516102f79190611522565b60405180910390f35b61031a600480360381019061031591906117d0565b61097d565b005b61033660048036038101906103319190611727565b610a4a565b005b610352600480360381019061034d9190611889565b610ab4565b005b61036e600480360381019061036991906118b4565b610b07565b60405161037b919061154a565b60405180910390f35b61038c610b89565b604051610399919061154a565b60405180910390f35b6103bc60048036038101906103b79190611889565b610b8f565b005b6060600480546103cd9061191f565b80601f01602080910402602001604051908101604052809291908181526020018280546103f99061191f565b80156104445780601f1061041b57610100808354040283529160200191610444565b820191905f5260205f20905b81548152906001019060200180831161042757829003601f168201915b5050505050905090565b5f80610458610c11565b9050610465818585610c18565b600191505092915050565b5f600354905090565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ff90611999565b60405180910390fd5b5f5b825181101561065157600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1683828151811061055e5761055d6119b7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614806105aa57505f6105a784838151811061059a576105996119b7565b5b602002602001015161084b565b11155b8061061b5750811515600a5f8584815181106105c9576105c86119b7565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515145b61064457610643838281518110610635576106346119b7565b5b602002602001015183610ddb565b5b808060010191505061050a565b505050565b5f80610660610c11565b905061066d858285610e33565b610678858585610ebe565b60019150509392505050565b5f5b8383905081101561074b578383828181106106a4576106a36119b7565b5b90506020020160208101906106b99190611889565b73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610736919061154a565b60405180910390a38080600101915050610686565b50505050565b5f6008905090565b5f5b8383905081101561082057838382818110610779576107786119b7565b5b905060200201602081019061078e9190611889565b73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161080b919061154a565b60405180910390a3808060010191505061075b565b50505050565b600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6108996111e6565b6108a25f611264565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546108da9061191f565b80601f01602080910402602001604051908101604052809291908181526020018280546109069061191f565b80156109515780601f1061092857610100808354040283529160200191610951565b820191905f5260205f20905b81548152906001019060200180831161093457829003601f168201915b5050505050905090565b5f80610965610c11565b9050610972818585610ebe565b600191505092915050565b5f5b83839050811015610a445783838281811061099d5761099c6119b7565b5b90506020020160208101906109b29190611889565b73ffffffffffffffffffffffffffffffffffffffff16600c5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a2f919061154a565b60405180910390a3808060010191505061097f565b50505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610aa7919061154a565b60405180910390a3505050565b610abc6111e6565b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610b04610891565b50565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60095481565b610b976111e6565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfc90611a54565b60405180910390fd5b610c0e81611264565b50565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90611ae2565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb90611b70565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610dce919061154a565b60405180910390a3505050565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f610e3e8484610b07565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610eb85781811015610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190611bd8565b60405180910390fd5b610eb78484848403610c18565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2390611c66565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190611cf4565b60405180910390fd5b5f610fa43061084b565b90505f6009548210159050808015610fc8575060085f9054906101000a900460ff16155b801561101a5750600a5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b1561105c57600160085f6101000a81548160ff02191690831515021790555061104285611325565b5f60085f6101000a81548160ff0219169083151502179055505b5f60015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050838110156110e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d790611d82565b60405180910390fd5b83810360015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508360015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516111cb919061154a565b60405180910390a36111de868686611397565b505050505050565b6111ee610c11565b73ffffffffffffffffffffffffffffffffffffffff1661120c6108a4565b73ffffffffffffffffffffffffffffffffffffffff1614611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125990611dea565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61132f8261084b565b90505f60019050600a8211156113455760065490505b80826113519190611e35565b60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6113de8261139c565b6113e881856113a6565b93506113f88185602086016113b6565b611401816113c4565b840191505092915050565b5f6020820190508181035f83015261142481846113d4565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6114668261143d565b9050919050565b6114768161145c565b8114611480575f80fd5b50565b5f813590506114918161146d565b92915050565b5f819050919050565b6114a981611497565b81146114b3575f80fd5b50565b5f813590506114c4816114a0565b92915050565b5f80604083850312156114e0576114df611435565b5b5f6114ed85828601611483565b92505060206114fe858286016114b6565b9150509250929050565b5f8115159050919050565b61151c81611508565b82525050565b5f6020820190506115355f830184611513565b92915050565b61154481611497565b82525050565b5f60208201905061155d5f83018461153b565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61159d826113c4565b810181811067ffffffffffffffff821117156115bc576115bb611567565b5b80604052505050565b5f6115ce61142c565b90506115da8282611594565b919050565b5f67ffffffffffffffff8211156115f9576115f8611567565b5b602082029050602081019050919050565b5f80fd5b5f61162061161b846115df565b6115c5565b905080838252602082019050602084028301858111156116435761164261160a565b5b835b8181101561166c57806116588882611483565b845260208401935050602081019050611645565b5050509392505050565b5f82601f83011261168a57611689611563565b5b813561169a84826020860161160e565b91505092915050565b6116ac81611508565b81146116b6575f80fd5b50565b5f813590506116c7816116a3565b92915050565b5f80604083850312156116e3576116e2611435565b5b5f83013567ffffffffffffffff811115611700576116ff611439565b5b61170c85828601611676565b925050602061171d858286016116b9565b9150509250929050565b5f805f6060848603121561173e5761173d611435565b5b5f61174b86828701611483565b935050602061175c86828701611483565b925050604061176d868287016114b6565b9150509250925092565b5f80fd5b5f8083601f8401126117905761178f611563565b5b8235905067ffffffffffffffff8111156117ad576117ac611777565b5b6020830191508360208202830111156117c9576117c861160a565b5b9250929050565b5f805f604084860312156117e7576117e6611435565b5b5f84013567ffffffffffffffff81111561180457611803611439565b5b6118108682870161177b565b93509350506020611823868287016114b6565b9150509250925092565b5f60ff82169050919050565b6118428161182d565b82525050565b5f60208201905061185b5f830184611839565b92915050565b61186a8161145c565b82525050565b5f6020820190506118835f830184611861565b92915050565b5f6020828403121561189e5761189d611435565b5b5f6118ab84828501611483565b91505092915050565b5f80604083850312156118ca576118c9611435565b5b5f6118d785828601611483565b92505060206118e885828601611483565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061193657607f821691505b602082108103611949576119486118f2565b5b50919050565b7f5f61697264726f704164647265737320657272000000000000000000000000005f82015250565b5f6119836013836113a6565b915061198e8261194f565b602082019050919050565b5f6020820190508181035f8301526119b081611977565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611a3e6026836113a6565b9150611a49826119e4565b604082019050919050565b5f6020820190508181035f830152611a6b81611a32565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611acc6024836113a6565b9150611ad782611a72565b604082019050919050565b5f6020820190508181035f830152611af981611ac0565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611b5a6022836113a6565b9150611b6582611b00565b604082019050919050565b5f6020820190508181035f830152611b8781611b4e565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f611bc2601d836113a6565b9150611bcd82611b8e565b602082019050919050565b5f6020820190508181035f830152611bef81611bb6565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f611c506025836113a6565b9150611c5b82611bf6565b604082019050919050565b5f6020820190508181035f830152611c7d81611c44565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f611cde6023836113a6565b9150611ce982611c84565b604082019050919050565b5f6020820190508181035f830152611d0b81611cd2565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f611d6c6026836113a6565b9150611d7782611d12565b604082019050919050565b5f6020820190508181035f830152611d9981611d60565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611dd46020836113a6565b9150611ddf82611da0565b602082019050919050565b5f6020820190508181035f830152611e0181611dc8565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611e3f82611497565b9150611e4a83611497565b925082611e5a57611e59611e08565b5b82820490509291505056fea264697066735822122064176646b3ddfb4470cd9df81e753a482cbd4a53439b4d486e6fa7d5e7f93ea064736f6c634300081a0033