608060405234801561000f575f80fd5b50336040518060400160405280601c81526020017f232054656c656772616d2040626c617374526f756c65747465426f740000000081525060405180606001604052806039815260200161292660399139816003908161006f9190610704565b50806004908161007f9190610704565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100f2575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100e99190610812565b60405180910390fd5b6101018161016160201b60201c565b505f600560146101000a81548160ff021916908315150217905550600160068190555061015c3361013661022460201b60201c565b600a6101429190610993565b6305f5e10061015191906109dd565b61022c60201b60201c565b610aae565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361029c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016102939190610812565b60405180910390fd5b6102ad5f83836102b160201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610301578060025f8282546102f59190610a1e565b925050819055506103cf565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561038a578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161038193929190610a60565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610416578060025f8282540392505081905550610460565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104bd9190610a95565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061054557607f821691505b60208210810361055857610557610501565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105ba7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261057f565b6105c4868361057f565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6106086106036105fe846105dc565b6105e5565b6105dc565b9050919050565b5f819050919050565b610621836105ee565b61063561062d8261060f565b84845461058b565b825550505050565b5f90565b61064961063d565b610654818484610618565b505050565b5b818110156106775761066c5f82610641565b60018101905061065a565b5050565b601f8211156106bc5761068d8161055e565b61069684610570565b810160208510156106a5578190505b6106b96106b185610570565b830182610659565b50505b505050565b5f82821c905092915050565b5f6106dc5f19846008026106c1565b1980831691505092915050565b5f6106f483836106cd565b9150826002028217905092915050565b61070d826104ca565b67ffffffffffffffff811115610726576107256104d4565b5b610730825461052e565b61073b82828561067b565b5f60209050601f83116001811461076c575f841561075a578287015190505b61076485826106e9565b8655506107cb565b601f19841661077a8661055e565b5f5b828110156107a15784890151825560018201915060208501945060208101905061077c565b868310156107be57848901516107ba601f8916826106cd565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107fc826107d3565b9050919050565b61080c816107f2565b82525050565b5f6020820190506108255f830184610803565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156108ad578086048111156108895761088861082b565b5b60018516156108985780820291505b80810290506108a685610858565b945061086d565b94509492505050565b5f826108c55760019050610980565b816108d2575f9050610980565b81600181146108e857600281146108f257610921565b6001915050610980565b60ff8411156109045761090361082b565b5b8360020a91508482111561091b5761091a61082b565b5b50610980565b5060208310610133831016604e8410600b84101617156109565782820a9050838111156109515761095061082b565b5b610980565b6109638484846001610864565b9250905081840481111561097a5761097961082b565b5b81810290505b9392505050565b5f60ff82169050919050565b5f61099d826105dc565b91506109a883610987565b92506109d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846108b6565b905092915050565b5f6109e7826105dc565b91506109f2836105dc565b9250828202610a00816105dc565b91508282048414831517610a1757610a1661082b565b5b5092915050565b5f610a28826105dc565b9150610a33836105dc565b9250828201905080821115610a4b57610a4a61082b565b5b92915050565b610a5a816105dc565b82525050565b5f606082019050610a735f830186610803565b610a806020830185610a51565b610a8d6040830184610a51565b949350505050565b5f602082019050610aa85f830184610a51565b92915050565b611e6b80610abb5f395ff3fe608060405234801561000f575f80fd5b5060043610610171575f3560e01c806370a08231116100dc5780638980f11f11610095578063a9059cbb1161006f578063a9059cbb146103c1578063dd62ed3e146103f1578063f2fde38b14610421578063f9f92be41461043d57610171565b80638980f11f146103695780638da5cb5b1461038557806395d89b41146103a357610171565b806370a08231146102d1578063715018a614610301578063777dc9b01461030b57806379cc679014610327578063819d4cc6146103435780638456cb591461035f57610171565b80633f4ba83a1161012e5780633f4ba83a14610239578063423f6cef1461024357806342966c681461025f57806344337ea11461027b578063537df3b6146102975780635c975abb146102b357610171565b80630614117a1461017557806306fdde031461017f578063095ea7b31461019d57806318160ddd146101cd57806323b872dd146101eb578063313ce5671461021b575b5f80fd5b61017d61046d565b005b6101876104c2565b60405161019491906116db565b60405180910390f35b6101b760048036038101906101b29190611790565b610552565b6040516101c491906117e8565b60405180910390f35b6101d5610574565b6040516101e29190611810565b60405180910390f35b61020560048036038101906102009190611829565b61057d565b60405161021291906117e8565b60405180910390f35b6102236105ab565b6040516102309190611894565b60405180910390f35b6102416105b3565b005b61025d60048036038101906102589190611790565b6105c5565b005b610279600480360381019061027491906118ad565b6105ec565b005b610295600480360381019061029091906118d8565b610647565b005b6102b160048036038101906102ac91906118d8565b6106f6565b005b6102bb6107a3565b6040516102c891906117e8565b60405180910390f35b6102eb60048036038101906102e691906118d8565b6107b9565b6040516102f89190611810565b60405180910390f35b6103096107fe565b005b61032560048036038101906103209190611964565b610811565b005b610341600480360381019061033c9190611790565b6108e5565b005b61035d60048036038101906103589190611790565b610949565b005b610367610a14565b005b610383600480360381019061037e9190611790565b610a26565b005b61038d610b71565b60405161039a91906119f7565b60405180910390f35b6103ab610b99565b6040516103b891906116db565b60405180910390f35b6103db60048036038101906103d69190611790565b610c29565b6040516103e891906117e8565b60405180910390f35b61040b60048036038101906104069190611a10565b610c4b565b6040516104189190611810565b60405180910390f35b61043b600480360381019061043691906118d8565b610ccd565b005b610457600480360381019061045291906118d8565b610d51565b60405161046491906117e8565b60405180910390f35b610475610d6e565b61047d610b71565b73ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156104bf573d5f803e3d5ffd5b50565b6060600380546104d190611a7b565b80601f01602080910402602001604051908101604052809291908181526020018280546104fd90611a7b565b80156105485780601f1061051f57610100808354040283529160200191610548565b820191905f5260205f20905b81548152906001019060200180831161052b57829003601f168201915b5050505050905090565b5f8061055c610df5565b9050610569818585610dfc565b600191505092915050565b5f600254905090565b5f80610587610df5565b9050610594858285610e0e565b61059f858585610ea0565b60019150509392505050565b5f6012905090565b6105bb610d6e565b6105c3610f90565b565b6105cd610ff2565b6105d5611041565b6105e0338383610ea0565b6105e861108b565b5050565b6105f63382611095565b3373ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb68260405161063c9190611810565b60405180910390a250565b61064f610d6e565b600160075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac60016040516106eb91906117e8565b60405180910390a250565b6106fe610d6e565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f6a12b3df6cba4203bd7fd06b816789f87de8c594299aed5717ae070fac781bac5f60405161079891906117e8565b60405180910390a250565b5f600560149054906101000a900460ff16905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610806610d6e565b61080f5f611114565b565b610819610d6e565b8473ffffffffffffffffffffffffffffffffffffffff1663f242432a3061083e610b71565b878787876040518763ffffffff1660e01b815260040161086396959493929190611af5565b5f604051808303815f87803b15801561087a575f80fd5b505af115801561088c573d5f803e3d5ffd5b505050508473ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa856040516108d69190611810565b60405180910390a25050505050565b6108ed610d6e565b6108f78282611095565b8173ffffffffffffffffffffffffffffffffffffffff167ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb68260405161093d9190611810565b60405180910390a25050565b610951610d6e565b8173ffffffffffffffffffffffffffffffffffffffff166342842e0e30610976610b71565b846040518463ffffffff1660e01b815260040161099593929190611b4f565b5f604051808303815f87803b1580156109ac575f80fd5b505af11580156109be573d5f803e3d5ffd5b505050508173ffffffffffffffffffffffffffffffffffffffff167ff0e12da6b257be18ce026650cff8b178975c77440ae67662ac380d78d784ffaa82604051610a089190611810565b60405180910390a25050565b610a1c610d6e565b610a246111d7565b565b610a2e610d6e565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9390611bce565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610ac0610b71565b836040518363ffffffff1660e01b8152600401610ade929190611bec565b6020604051808303815f875af1158015610afa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1e9190611c3d565b508173ffffffffffffffffffffffffffffffffffffffff167f505b28e6941631badc363841ecbf8e1214b9379c643936458e87be718e15799982604051610b659190611810565b60405180910390a25050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ba890611a7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bd490611a7b565b8015610c1f5780601f10610bf657610100808354040283529160200191610c1f565b820191905f5260205f20905b815481529060010190602001808311610c0257829003601f168201915b5050505050905090565b5f80610c33610df5565b9050610c40818585610ea0565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610cd5610d6e565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d45575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610d3c91906119f7565b60405180910390fd5b610d4e81611114565b50565b6007602052805f5260405f205f915054906101000a900460ff1681565b610d76610df5565b73ffffffffffffffffffffffffffffffffffffffff16610d94610b71565b73ffffffffffffffffffffffffffffffffffffffff1614610df357610db7610df5565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610dea91906119f7565b60405180910390fd5b565b5f33905090565b610e09838383600161123a565b505050565b5f610e198484610c4b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e9a5781811015610e8b578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610e8293929190611c68565b60405180910390fd5b610e9984848484035f61123a565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f10575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610f0791906119f7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f80575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610f7791906119f7565b60405180910390fd5b610f8b838383611409565b505050565b610f98611622565b5f600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610fdb610df5565b604051610fe891906119f7565b60405180910390a1565b600260065403611037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102e90611ce7565b60405180910390fd5b6002600681905550565b6110496107a3565b15611089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108090611d4f565b60405180910390fd5b565b6001600681905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611105575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016110fc91906119f7565b60405180910390fd5b611110825f83611409565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6111df611041565b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611223610df5565b60405161123091906119f7565b60405180910390a1565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036112aa575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112a191906119f7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361131a575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161131191906119f7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611403578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113fa9190611810565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611459578060025f82825461144d9190611d9a565b92505081905550611527565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156114e2578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016114d993929190611c68565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361156e578060025f82825403925050819055506115b8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116159190611810565b60405180910390a3505050565b61162a6107a3565b611669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166090611e17565b60405180910390fd5b565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6116ad8261166b565b6116b78185611675565b93506116c7818560208601611685565b6116d081611693565b840191505092915050565b5f6020820190508181035f8301526116f381846116a3565b905092915050565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61172c82611703565b9050919050565b61173c81611722565b8114611746575f80fd5b50565b5f8135905061175781611733565b92915050565b5f819050919050565b61176f8161175d565b8114611779575f80fd5b50565b5f8135905061178a81611766565b92915050565b5f80604083850312156117a6576117a56116fb565b5b5f6117b385828601611749565b92505060206117c48582860161177c565b9150509250929050565b5f8115159050919050565b6117e2816117ce565b82525050565b5f6020820190506117fb5f8301846117d9565b92915050565b61180a8161175d565b82525050565b5f6020820190506118235f830184611801565b92915050565b5f805f606084860312156118405761183f6116fb565b5b5f61184d86828701611749565b935050602061185e86828701611749565b925050604061186f8682870161177c565b9150509250925092565b5f60ff82169050919050565b61188e81611879565b82525050565b5f6020820190506118a75f830184611885565b92915050565b5f602082840312156118c2576118c16116fb565b5b5f6118cf8482850161177c565b91505092915050565b5f602082840312156118ed576118ec6116fb565b5b5f6118fa84828501611749565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261192457611923611903565b5b8235905067ffffffffffffffff81111561194157611940611907565b5b60208301915083600182028301111561195d5761195c61190b565b5b9250929050565b5f805f805f6080868803121561197d5761197c6116fb565b5b5f61198a88828901611749565b955050602061199b8882890161177c565b94505060406119ac8882890161177c565b935050606086013567ffffffffffffffff8111156119cd576119cc6116ff565b5b6119d98882890161190f565b92509250509295509295909350565b6119f181611722565b82525050565b5f602082019050611a0a5f8301846119e8565b92915050565b5f8060408385031215611a2657611a256116fb565b5b5f611a3385828601611749565b9250506020611a4485828601611749565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a9257607f821691505b602082108103611aa557611aa4611a4e565b5b50919050565b5f82825260208201905092915050565b828183375f83830152505050565b5f611ad48385611aab565b9350611ae1838584611abb565b611aea83611693565b840190509392505050565b5f60a082019050611b085f8301896119e8565b611b1560208301886119e8565b611b226040830187611801565b611b2f6060830186611801565b8181036080830152611b42818486611ac9565b9050979650505050505050565b5f606082019050611b625f8301866119e8565b611b6f60208301856119e8565b611b7c6040830184611801565b949350505050565b7f43616e6e6f74207265636f766572206f776e20746f6b656e73000000000000005f82015250565b5f611bb8601983611675565b9150611bc382611b84565b602082019050919050565b5f6020820190508181035f830152611be581611bac565b9050919050565b5f604082019050611bff5f8301856119e8565b611c0c6020830184611801565b9392505050565b611c1c816117ce565b8114611c26575f80fd5b50565b5f81519050611c3781611c13565b92915050565b5f60208284031215611c5257611c516116fb565b5b5f611c5f84828501611c29565b91505092915050565b5f606082019050611c7b5f8301866119e8565b611c886020830185611801565b611c956040830184611801565b949350505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f611cd1601f83611675565b9150611cdc82611c9d565b602082019050919050565b5f6020820190508181035f830152611cfe81611cc5565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f611d39601083611675565b9150611d4482611d05565b602082019050919050565b5f6020820190508181035f830152611d6681611d2d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611da48261175d565b9150611daf8361175d565b9250828201905080821115611dc757611dc6611d6d565b5b92915050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f611e01601483611675565b9150611e0c82611dcd565b602082019050919050565b5f6020820190508181035f830152611e2e81611df5565b905091905056fea264697066735822122095e7909f93cac52d0790bfe8ca222c721eb63b90f581f2715c568a7e7f3511aa64736f6c634300081a00335370696e20616e642077696e20526f756c657474652047616d652068747470733a2f2f742e6d652f626c617374526f756c65747465426f7420