608060405234801561000f575f80fd5b506040518060400160405280600e81526020017f5765696768746564566f74696e670000000000000000000000000000000000008152506040518060400160405280600381526020017f5756540000000000000000000000000000000000000000000000000000000000815250816003908161008b919061058e565b50806004908161009b919061058e565b5050506100b130620f42406100b660201b60201c565b610772565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610126575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161011d919061069c565b60405180910390fd5b6101375f838361013b60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361018b578060025f82825461017f91906106e2565b92505081905550610259565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610214578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161020b93929190610724565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102a0578060025f82825403925050819055506102ea565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103479190610759565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103cf57607f821691505b6020821081036103e2576103e161038b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104447fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610409565b61044e8683610409565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61049261048d61048884610466565b61046f565b610466565b9050919050565b5f819050919050565b6104ab83610478565b6104bf6104b782610499565b848454610415565b825550505050565b5f90565b6104d36104c7565b6104de8184846104a2565b505050565b5b81811015610501576104f65f826104cb565b6001810190506104e4565b5050565b601f82111561054657610517816103e8565b610520846103fa565b8101602085101561052f578190505b61054361053b856103fa565b8301826104e3565b50505b505050565b5f82821c905092915050565b5f6105665f198460080261054b565b1980831691505092915050565b5f61057e8383610557565b9150826002028217905092915050565b61059782610354565b67ffffffffffffffff8111156105b0576105af61035e565b5b6105ba82546103b8565b6105c5828285610505565b5f60209050601f8311600181146105f6575f84156105e4578287015190505b6105ee8582610573565b865550610655565b601f198416610604866103e8565b5f5b8281101561062b57848901518255600182019150602085019450602081019050610606565b868310156106485784890151610644601f891682610557565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106868261065d565b9050919050565b6106968161067c565b82525050565b5f6020820190506106af5f83018461068d565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6106ec82610466565b91506106f783610466565b925082820190508082111561070f5761070e6106b5565b5b92915050565b61071e81610466565b82525050565b5f6060820190506107375f83018661068d565b6107446020830185610715565b6107516040830184610715565b949350505050565b5f60208201905061076c5f830184610715565b92915050565b611ebc8061077f5f395ff3fe608060405234801561000f575f80fd5b50600436106100f3575f3560e01c806373b2e80e11610095578063976b311311610064578063976b311314610285578063a9059cbb146102b5578063d5abeb01146102e5578063dd62ed3e14610303576100f3565b806373b2e80e146101eb5780638615d8551461021b578063943e82161461024b57806395d89b4114610267576100f3565b806323b872dd116100d157806323b872dd14610163578063313ce567146101935780634e71d92d146101b157806370a08231146101bb576100f3565b806306fdde03146100f7578063095ea7b31461011557806318160ddd14610145575b5f80fd5b6100ff610333565b60405161010c9190611417565b60405180910390f35b61012f600480360381019061012a91906114d5565b6103c3565b60405161013c919061152d565b60405180910390f35b61014d6103e5565b60405161015a9190611555565b60405180910390f35b61017d6004803603810190610178919061156e565b6103ee565b60405161018a919061152d565b60405180910390f35b61019b61041c565b6040516101a891906115d9565b60405180910390f35b6101b9610424565b005b6101d560048036038101906101d091906115f2565b61054a565b6040516101e29190611555565b60405180910390f35b610205600480360381019061020091906115f2565b61058f565b604051610212919061152d565b60405180910390f35b61023560048036038101906102309190611749565b6105ac565b6040516102429190611555565b60405180910390f35b610265600480360381019061026091906117c6565b610691565b005b61026f6108cf565b60405161027c9190611417565b60405180910390f35b61029f600480360381019061029a9190611804565b61095f565b6040516102ac9190611a15565b60405180910390f35b6102cf60048036038101906102ca91906114d5565b610b70565b6040516102dc919061152d565b60405180910390f35b6102ed610b92565b6040516102fa9190611555565b60405180910390f35b61031d60048036038101906103189190611a35565b610b99565b60405161032a9190611555565b60405180910390f35b60606003805461034290611aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461036e90611aa0565b80156103b95780601f10610390576101008083540402835291602001916103b9565b820191905f5260205f20905b81548152906001019060200180831161039c57829003601f168201915b5050505050905090565b5f806103cd610c1b565b90506103da818585610c22565b600191505092915050565b5f600254905090565b5f806103f8610c1b565b9050610405858285610c34565b610410858585610cc6565b60019150509392505050565b5f6012905090565b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156104a5576040517f0b1327a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620f42406104b16103e5565b106104e8576040517fcbe2483100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550610548336064610db6565b565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6006602052805f5260405f205f915054906101000a900460ff1681565b5f806105b73361054a565b036105ee576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105f66103e5565b82111561063a57816040517f589a49520000000000000000000000000000000000000000000000000000000081526004016106319190611555565b60405180910390fd5b5f600560018160018154018082558091505003905f5260205f20906009020190508381600201908161066c9190611c6d565b5082816007018190555060016005805490506106889190611d69565b91505092915050565b5f600583815481106106a6576106a5611d9c565b5b905f5260205f20906009020190508060080160019054906101000a900460ff16156106fd576040517f66b6cb4a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61071233825f01610e3590919063ffffffff16565b15610749576040517f7c9a1cf900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6107533361054a565b90505f810361078e576040517f8439960d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107a333835f01610e6290919063ffffffff16565b5080826006015f8282546107b79190611dc9565b92505081905550600160028111156107d2576107d1611dfc565b5b8360028111156107e5576107e4611dfc565b5b036108095780826003015f8282546107fd9190611dc9565b9250508190555061086f565b5f600281111561081c5761081b611dfc565b5b83600281111561082f5761082e611dfc565b5b036108535780826004015f8282546108479190611dc9565b9250508190555061086e565b80826005015f8282546108669190611dc9565b925050819055505b5b81600701548260060154106108c95760018260080160016101000a81548160ff0219169083151502179055508160040154826003015411156108c8576001826008015f6101000a81548160ff0219169083151502179055505b5b50505050565b6060600480546108de90611aa0565b80601f016020809104026020016040519081016040528092919081815260200182805461090a90611aa0565b80156109555780601f1061092c57610100808354040283529160200191610955565b820191905f5260205f20905b81548152906001019060200180831161093857829003601f168201915b5050505050905090565b61096761135e565b5f6005838154811061097c5761097b611d9c565b5b905f5260205f20906009020190505f610996825f01610e8f565b67ffffffffffffffff8111156109af576109ae611625565b5b6040519080825280602002602001820160405280156109dd5781602001602082028036833780820191505090505b5090505f5b6109ed835f01610e8f565b811015610a6357610a0981845f01610ea290919063ffffffff16565b828281518110610a1c57610a1b611d9c565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806001019150506109e2565b50604051806101200160405280828152602001836002018054610a8590611aa0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab190611aa0565b8015610afc5780601f10610ad357610100808354040283529160200191610afc565b820191905f5260205f20905b815481529060010190602001808311610adf57829003601f168201915b505050505081526020018360030154815260200183600401548152602001836005015481526020018360060154815260200183600701548152602001836008015f9054906101000a900460ff16151581526020018360080160019054906101000a900460ff16151581525092505050919050565b5f80610b7a610c1b565b9050610b87818585610cc6565b600191505092915050565b620f424081565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b610c2f8383836001610eb9565b505050565b5f610c3f8484610b99565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610cc05781811015610cb1578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610ca893929190611e38565b60405180910390fd5b610cbf84848484035f610eb9565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d36575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d2d9190611e6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610da6575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610d9d9190611e6d565b60405180910390fd5b610db1838383611088565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e26575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610e1d9190611e6d565b60405180910390fd5b610e315f8383611088565b5050565b5f610e5a835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6112a1565b905092915050565b5f610e87835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6112c1565b905092915050565b5f610e9b825f01611328565b9050919050565b5f610eaf835f0183611337565b5f1c905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610f29575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401610f209190611e6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f99575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610f909190611e6d565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611082578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516110799190611555565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110d8578060025f8282546110cc9190611dc9565b925050819055506111a6565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611161578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161115893929190611e38565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111ed578060025f8282540392505081905550611237565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112949190611555565b60405180910390a3505050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f6112cc83836112a1565b61131e57825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050611322565b5f90505b92915050565b5f815f01805490509050919050565b5f825f01828154811061134d5761134c611d9c565b5b905f5260205f200154905092915050565b60405180610120016040528060608152602001606081526020015f81526020015f81526020015f81526020015f81526020015f81526020015f151581526020015f151581525090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6113e9826113a7565b6113f381856113b1565b93506114038185602086016113c1565b61140c816113cf565b840191505092915050565b5f6020820190508181035f83015261142f81846113df565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61147182611448565b9050919050565b61148181611467565b811461148b575f80fd5b50565b5f8135905061149c81611478565b92915050565b5f819050919050565b6114b4816114a2565b81146114be575f80fd5b50565b5f813590506114cf816114ab565b92915050565b5f80604083850312156114eb576114ea611440565b5b5f6114f88582860161148e565b9250506020611509858286016114c1565b9150509250929050565b5f8115159050919050565b61152781611513565b82525050565b5f6020820190506115405f83018461151e565b92915050565b61154f816114a2565b82525050565b5f6020820190506115685f830184611546565b92915050565b5f805f6060848603121561158557611584611440565b5b5f6115928682870161148e565b93505060206115a38682870161148e565b92505060406115b4868287016114c1565b9150509250925092565b5f60ff82169050919050565b6115d3816115be565b82525050565b5f6020820190506115ec5f8301846115ca565b92915050565b5f6020828403121561160757611606611440565b5b5f6116148482850161148e565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61165b826113cf565b810181811067ffffffffffffffff8211171561167a57611679611625565b5b80604052505050565b5f61168c611437565b90506116988282611652565b919050565b5f67ffffffffffffffff8211156116b7576116b6611625565b5b6116c0826113cf565b9050602081019050919050565b828183375f83830152505050565b5f6116ed6116e88461169d565b611683565b90508281526020810184848401111561170957611708611621565b5b6117148482856116cd565b509392505050565b5f82601f8301126117305761172f61161d565b5b81356117408482602086016116db565b91505092915050565b5f806040838503121561175f5761175e611440565b5b5f83013567ffffffffffffffff81111561177c5761177b611444565b5b6117888582860161171c565b9250506020611799858286016114c1565b9150509250929050565b600381106117af575f80fd5b50565b5f813590506117c0816117a3565b92915050565b5f80604083850312156117dc576117db611440565b5b5f6117e9858286016114c1565b92505060206117fa858286016117b2565b9150509250929050565b5f6020828403121561181957611818611440565b5b5f611826848285016114c1565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61186181611467565b82525050565b5f6118728383611858565b60208301905092915050565b5f602082019050919050565b5f6118948261182f565b61189e8185611839565b93506118a983611849565b805f5b838110156118d95781516118c08882611867565b97506118cb8361187e565b9250506001810190506118ac565b5085935050505092915050565b5f82825260208201905092915050565b5f611900826113a7565b61190a81856118e6565b935061191a8185602086016113c1565b611923816113cf565b840191505092915050565b611937816114a2565b82525050565b61194681611513565b82525050565b5f61012083015f8301518482035f860152611967828261188a565b9150506020830151848203602086015261198182826118f6565b9150506040830151611996604086018261192e565b5060608301516119a9606086018261192e565b5060808301516119bc608086018261192e565b5060a08301516119cf60a086018261192e565b5060c08301516119e260c086018261192e565b5060e08301516119f560e086018261193d565b50610100830151611a0a61010086018261193d565b508091505092915050565b5f6020820190508181035f830152611a2d818461194c565b905092915050565b5f8060408385031215611a4b57611a4a611440565b5b5f611a588582860161148e565b9250506020611a698582860161148e565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611ab757607f821691505b602082108103611aca57611ac9611a73565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302611b2c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611af1565b611b368683611af1565b95508019841693508086168417925050509392505050565b5f819050919050565b5f611b71611b6c611b67846114a2565b611b4e565b6114a2565b9050919050565b5f819050919050565b611b8a83611b57565b611b9e611b9682611b78565b848454611afd565b825550505050565b5f90565b611bb2611ba6565b611bbd818484611b81565b505050565b5b81811015611be057611bd55f82611baa565b600181019050611bc3565b5050565b601f821115611c2557611bf681611ad0565b611bff84611ae2565b81016020851015611c0e578190505b611c22611c1a85611ae2565b830182611bc2565b50505b505050565b5f82821c905092915050565b5f611c455f1984600802611c2a565b1980831691505092915050565b5f611c5d8383611c36565b9150826002028217905092915050565b611c76826113a7565b67ffffffffffffffff811115611c8f57611c8e611625565b5b611c998254611aa0565b611ca4828285611be4565b5f60209050601f831160018114611cd5575f8415611cc3578287015190505b611ccd8582611c52565b865550611d34565b601f198416611ce386611ad0565b5f5b82811015611d0a57848901518255600182019150602085019450602081019050611ce5565b86831015611d275784890151611d23601f891682611c36565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d73826114a2565b9150611d7e836114a2565b9250828203905081811115611d9657611d95611d3c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f611dd3826114a2565b9150611dde836114a2565b9250828201905080821115611df657611df5611d3c565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b611e3281611467565b82525050565b5f606082019050611e4b5f830186611e29565b611e586020830185611546565b611e656040830184611546565b949350505050565b5f602082019050611e805f830184611e29565b9291505056fea26469706673582212204e828d1f3def7849a454e52fd7fc0b6a10db110f2c7ed8cf8758ac5d9dceeade64736f6c634300081a0033