0x49aa18fc00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000982399b1ac0f7b5de13fc36f1593b395d66c77c200000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000042c00000000000000000000000000000000000000000000000000000000000004200608060405234801561001057600080fd5b506141e0806100206000396000f3fe6080604052600436106102885760003560e01c80636e9960c31161015357806390ac1866116100cb578063d2197bd31161007f578063ebac15f911610064578063ebac15f914610819578063f851a4401461084d578063ff1370d91461086257600080fd5b8063d2197bd3146107e4578063da8292d9146107f957600080fd5b8063a91ee0dc116100b0578063a91ee0dc1461079e578063b24b2afc146107be578063bf64a82d146107d157600080fd5b806390ac18661461073b57806391e0d46b1461075b57600080fd5b80637868674d116101225780638dd14802116101075780638dd14802146106b85780639013ae08146106d8578063905eceed146106f857600080fd5b80637868674d146106785780638b432e4e1461069857600080fd5b80636e9960c3146105ce578063704b6c0214610602578063761b48ec14610622578063778fd1d11461066557600080fd5b80633fb58819116102015780634ddf47d4116101b55780635ab1bd531161019a5780635ab1bd5314610567578063612a33721461059b578063696af2bf146105bb57600080fd5b80634ddf47d41461050357806357a781221461055457600080fd5b80634827ae0c116101e65780634827ae0c1461046657806348dfc8b71461049a578063493b07ef146104ce57600080fd5b80633fb588191461041f578063409aad691461045357600080fd5b806321cb8f371161025857806325d5cac81161023d57806325d5cac8146103b257806327aa01f5146103d25780632b4a75b4146103ff57600080fd5b806321cb8f371461037d578063254e10621461039f57600080fd5b8062626679146102945780630b239c4e146102ee5780630fffbaf31461031c57806311a33bda1461035057600080fd5b3661028f57005b600080fd5b3480156102a057600080fd5b507fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37545b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156102fa57600080fd5b5061030e6103093660046136d5565b61089d565b6040519081526020016102e5565b34801561032857600080fd5b507feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9546102c4565b34801561035c57600080fd5b5061037061036b3660046136d5565b610940565b6040516102e591906136ee565b34801561038957600080fd5b5061039d6103983660046137ad565b610a19565b005b61039d6103ad366004613822565b610bfd565b3480156103be57600080fd5b5061039d6103cd366004613864565b611097565b3480156103de57600080fd5b506103f26103ed366004613881565b611171565b6040516102e591906138ad565b34801561040b57600080fd5b5061039d61041a366004613864565b611334565b34801561042b57600080fd5b507f264d744422f7427cd080572c35c848b6cd3a36da6b47519af89ef13098b12fc05461030e565b61039d610461366004613919565b61140e565b34801561047257600080fd5b507fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a546102c4565b3480156104a657600080fd5b507f54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a546102c4565b3480156104da57600080fd5b506104ee6104e93660046136d5565b6119f1565b604080519283526020830191909152016102e5565b34801561050f57600080fd5b5061052361051e3660046139e0565b611a23565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102e5565b61039d610562366004613822565b611cab565b34801561057357600080fd5b507fce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e7546102c4565b3480156105a757600080fd5b5061039d6105b6366004613aaf565b611f30565b61039d6105c9366004613ae8565b6122e7565b3480156105da57600080fd5b507f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9546102c4565b34801561060e57600080fd5b5061039d61061d366004613864565b612398565b34801561062e57600080fd5b5061030e61063d366004613864565b73ffffffffffffffffffffffffffffffffffffffff166000908152600e602052604090205490565b61039d610673366004613822565b612472565b34801561068457600080fd5b506103f26106933660046136d5565b6124fa565b3480156106a457600080fd5b5061039d6106b3366004613b3d565b6125fd565b3480156106c457600080fd5b5061039d6106d3366004613864565b612b67565b3480156106e457600080fd5b5061039d6106f3366004613864565b612c41565b34801561070457600080fd5b5061030e610713366004613864565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205490565b34801561074757600080fd5b5061039d6107563660046136d5565b612d1b565b34801561076757600080fd5b5061030e610776366004613864565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602052604090205490565b3480156107aa57600080fd5b5061039d6107b9366004613864565b612df5565b61030e6107cc366004613822565b612ecf565b61039d6107df366004613ae8565b612f29565b3480156107f057600080fd5b50600b5461030e565b34801561080557600080fd5b5061039d610814366004613864565b613004565b34801561082557600080fd5b507fbd3084b8c09da87ad159c247a60e209784196be2530cecbbd8f337fdd1848827546102c4565b34801561085957600080fd5b506102c46130de565b34801561086e57600080fd5b5061088261087d366004613b72565b61310d565b604080519384526020840192909252908201526060016102e5565b600b54600090821115610911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a20706f6420646f6573206e6f7420657869737400000060448201526064015b60405180910390fd5b600b61091e600184613c0b565b8154811061092e5761092e613c22565b60009182526020909120015492915050565b61094861354b565b50600090815260076020908152604080832054815160c08101835260f882901c8152845461ffff9081168286015263ffffffff60d884901c16865260098552948390205473ffffffffffffffffffffffffffffffffffffffff168184015264ffffffffff60b083901c1660608083019190915267ffffffffffffffff601084901c16608080840191909152845160a0818101875285811c89168252609086901c89169782019790975284821c881695810195909552607084901c87168583015292901c909416908201529082015290565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600c60205260408120549003610aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a206f70657261746f72206e6f7420626f6e64656400006044820152606401610908565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e602052604090208054820190557fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810183905273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610b6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b939190613c51565b610bf9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20746f6b656e207472616e73666572206661696c65646044820152606401610908565b5050565b7f54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a5473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a206d6573736167696e67206f6e6c792063616c6c00006044820152606401610908565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820101356000610d037f264d744422f7427cd080572c35c848b6cd3a36da6b47519af89ef13098b12fc05490565b8210905060008484604051610d19929190613c73565b604051908190039020600a805463ffffffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009091161790559050600081610d8e7f1cda64803f3b43503042e00863791e8d996666552d5855a78d53ee1dd4b3286d80546001019081905590565b60408051602081019390935282015243606082015242608082015260a001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201209250608083901c916fffffffffffffffffffffffffffffffff841691610e1191838501910190815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600b549093506000908381610e5e57610e5e613c83565b0690506000600b8281548110610e7657610e76613c22565b6000918252602082200154915087610e9d57818481610e9757610e97613c83565b06610ea0565b60005b9050600b8381548110610eb557610eb5613c22565b906000526020600020018181548110610ed057610ed0613c22565b6000918252602080832090910154600a5463ffffffff1683526009909152604090912080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091179055610f3f8382613152565b6001821115610f6e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909101905b4260101b606089610f8a57610f8588856005613410565b610f8d565b60005b901b60708a610fa757610fa289866004613410565b610faa565b60005b901b60808b610fc457610fbf8a876003613410565b610fc7565b60005b901b60908c610fe157610fdc8b886002613410565b610fe4565b60005b901b60a08d610ffe57610ff98c896001613410565b611001565b60005b901b60b043901b60d8600a60009054906101000a900463ffffffff1663ffffffff16901b60f88b600101901b171717171717171760001760076000898152602001908152602001600020819055507f4422a85db963f113e500bc4ada8f9e9f1a7bcd57cbec6907fbb2bf6aaf5878ff878c8c60405161108293929190613cfb565b60405180910390a15050505050505050505050565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461114d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a55565b600b546060908411156111e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a20706f6420646f6573206e6f742065786973740000006044820152606401610908565b836111ea81613d1e565b9450506000600b858154811061120257611202613c22565b60009182526020909120015490508061121b8486613d53565b111561122e5761122b8482613c0b565b92505b8267ffffffffffffffff811115611247576112476139b1565b604051908082528060200260200182016040528015611270578160200160208202803683370190505b50915060005b8381101561132b57600b868154811061129157611291613c22565b9060005260206000200181866112a79190613d53565b815481106112b7576112b7613c22565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106112f4576112f4613c22565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101528061132381613d6b565b915050611276565b50509392505050565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7f54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a55565b7feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f484f4c4f47524150483a20627269646765206f6e6c792063616c6c00000000006044820152606401610908565b60006114ee7f54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a5490565b905060008173ffffffffffffffffffffffffffffffffffffffff16638c19a89f898c8c88886040518663ffffffff1660e01b8152600401611533959493929190613da3565b602060405180830381865afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115749190613dda565b905060006115a07fce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e75490565b73ffffffffffffffffffffffffffffffffffffffff1663949d53a76115e37fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a5490565b73ffffffffffffffffffffffffffffffffffffffff1663381b5f466040518163ffffffff1660e01b8152600401602060405180830381865afa15801561162d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116519190613df3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815263ffffffff919091166004820152602401602060405180830381865afa1580156116ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cf9190613e10565b905034821061173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f484f4c4f47524150483a206e6f7420656e6f7567682076616c756500000000006044820152606401610908565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f1935050505015801561177d573d6000803e3d6000fd5b5060007f16f1be7000000000000000000000000000000000000000000000000000000000886117ca7fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a5490565b73ffffffffffffffffffffffffffffffffffffffff1663381b5f466040518163ffffffff1660e01b8152600401602060405180830381865afa158015611814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118389190613df3565b898560008860018d8d60405160240161185999989796959493929190613e2d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090951694909417909352519092506118eb9183918f918f9101613ecc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905073ffffffffffffffffffffffffffffffffffffffff8416630a0542ef6119418534613c0b565b8e8e8e8e61194f8a34613c0b565b886040518863ffffffff1660e01b815260040161197196959493929190613ef3565b6000604051808303818588803b15801561198a57600080fd5b505af115801561199e573d6000803e3d6000fd5b50505050507f0f5759b4182507dcfc771071166f98d7ca331262e5134eaa74b676adce2138b781805190602001206040516119db91815260200190565b60405180910390a1505050505050505050505050565b600080611a07611a02600185613c0b565b613430565b9150611a1c611a17600185613c0b565b613453565b9050915091565b6000611a4d7f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a015490565b15611ab4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a20616c726561647920696e697469616c697a656400006044820152606401610908565b60008060008060008087806020019051810190611ad19190613f83565b327f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c9557feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f98690557fb4107f746e9496e8452accc7de63d1c5e14c19f510932daa04077cd49e8bd77a8590557fbd3084b8c09da87ad159c247a60e209784196be2530cecbbd8f337fdd18488278490557fce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e78390557fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c378290557f264d744422f7427cd080572c35c848b6cd3a36da6b47519af89ef13098b12fc0819055603c600090815568056bc75e2d631000006001908155600280556103e8600355600a60045560646005556040805180820190915260208101928352918252969c50949a5092985090965094509250611c2791600b9190613587565b5060008052600c60205260017f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e855611c7e60017f4e5f991bca30eca2d4643aaefa807e88f96a4a97398933d572a3c0d973004a0155565b507f4ddf47d400000000000000000000000000000000000000000000000000000000979650505050505050565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b60008282604051611d73929190613c73565b604080519182900390912060008181526008602052919091205490915060ff16611df9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f484f4c4f47524150483a20696e76616c6964207265636f76657279206a6f62006044820152606401610908565b6000611e237feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f95490565b73ffffffffffffffffffffffffffffffffffffffff16348585604051611e4a929190613c73565b60006040518083038185875af1925050503d8060008114611e87576040519150601f19603f3d011682016040523d82523d6000602084013e611e8c565b606091505b5050905080611ef7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f484f4c4f47524150483a207265636f76657279206661696c65640000000000006044820152606401610908565b50600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600c60205260408120549003611fbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a206f70657261746f72206e6f7420626f6e64656400006044820152606401610908565b3373ffffffffffffffffffffffffffffffffffffffff83161461214d57611fe482613511565b61204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a206f70657261746f72206e6f7420636f6e74726163746044820152606401610908565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d09190613e10565b73ffffffffffffffffffffffffffffffffffffffff161461214d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f484f4c4f47524150483a2073656e646572206e6f74206f776e657200000000006044820152606401610908565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600e60209081526040808320805490849055600c909252909120546121bf9061219490600190613c0b565b73ffffffffffffffffffffffffffffffffffffffff85166000908152600d6020526040902054613152565b7fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c37546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff848116600483015260248201849052919091169063a9059cbb906044016020604051808303816000875af1158015612258573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227c9190613c51565b6122e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20746f6b656e207472616e73666572206661696c65646044820152606401610908565b505050565b333014612350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a206f70657261746f72206f6e6c792063616c6c0000006044820152606401610908565b602081038260003782608452600080604083036000347feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9546040870351f18061039d57600080fd5b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461244e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c955565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f484f4c4f47524150483a20657865637574654a6f622069732063757272656e7460448201527f6c792064697361626c65640000000000000000000000000000000000000000006064820152608401610908565b600b54606090821115612569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a20706f6420646f6573206e6f742065786973740000006044820152606401610908565b600b612576600184613c0b565b8154811061258657612586613c22565b906000526020600020018054806020026020016040519081016040528092919081815260200182805480156125f157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116125c6575b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600c6020526040902054158015612653575073ffffffffffffffffffffffffffffffffffffffff83166000908152600e6020526040902054155b6126b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a206f70657261746f7220697320626f6e6465640000006044820152606401610908565b6126c283613511565b156127cb57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561272a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274e9190613e10565b73ffffffffffffffffffffffffffffffffffffffff16036127cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f484f4c4f47524150483a20636f6e7472616374206e6f74206f776e61626c65006044820152606401610908565b60006127d960018303613453565b905082811115612845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20626f6e6420616d6f756e7420746f6f20736d616c6c6044820152606401610908565b600b548211156128b457600b545b828110156128b25760408051602081019091526000808252600b805460018181018355919092526128a9927f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db990920191906135de565b50600101612853565b505b61ffff8016600b60018403815481106128cf576128cf613c22565b60009182526020909120015410612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f484f4c4f47524150483a20746f6f206d616e79206f70657261746f72730000006044820152606401610908565b600b600183038154811061295857612958613c22565b6000918252602080832091909101805460018082018355918452919092200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716179055600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85019081106129eb576129eb613c22565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff88168352600d8252604080842094909103909355600c8152828220859055600e905220839055612a5c7fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c375490565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015612ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afb9190613c51565b612b61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f484f4c4f47524150483a20746f6b656e207472616e73666572206661696c65646044820152606401610908565b50505050565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f955565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cf7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7fbf76518d46db472b71aa7677a0908b8016f3dee568415ffa24055f9a670f9c3755565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7f264d744422f7427cd080572c35c848b6cd3a36da6b47519af89ef13098b12fc055565b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7fce8e75d5c5227ce29a4ee170160bb296e5dea6934b80a9bd723f7ef1e7c850e755565b60006040820383600037600060e353600080604084036000347feb87cbb21687feb327e3d58c6c16d552231d12c7a0e8115042a4165fac8a77f9545af160018103612f1e573d6000803e3d6000fd5b505a60005260206000f35b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612fdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b808260003760008082600034875af13d6000803e808015612fff573d6000f35b3d6000fd5b7f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146130ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f484f4c4f47524150483a2061646d696e206f6e6c792066756e6374696f6e00006044820152606401610908565b7fbd3084b8c09da87ad159c247a60e209784196be2530cecbbd8f337fdd184882755565b60006131087f3f106594dc74eeef980dae234cde8324dc2497b13d27a0c59e55bd2ca10a07c95490565b905090565b600080600036600080376000803660007f54176250282e65985d205704ffce44a59efe61f7afd99e29fda50f55b48c061a545afa3d6000803e808015612fff573d6000f35b8015610bf9576000600b838154811061316d5761316d613c22565b90600052602060002001828154811061318857613188613c22565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600c82526040808420849055600d909252908220829055600b8054919350600191869081106131e0576131e0613c22565b60009182526020909120015403905082811461332657600b848154811061320957613209613c22565b90600052602060002001818154811061322457613224613c22565b600091825260209091200154600b805473ffffffffffffffffffffffffffffffffffffffff909216918690811061325d5761325d613c22565b90600052602060002001848154811061327857613278613c22565b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600d6000600b87815481106132d8576132d8613c22565b9060005260206000200186815481106132f3576132f3613c22565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020555b600b848154811061333957613339613c22565b90600052602060002001818154811061335457613354613c22565b600091825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600b80548590811061339957613399613c22565b906000526020600020018054806133b2576133b261403b565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550505050565b600082438390034085018161342757613427613c83565b06949350505050565b600060015482600254613443919061418a565b61344d9190614196565b92915050565b60008060015483600254613467919061418a565b6134719190614196565b600b5490915083106134835792915050565b600061349084600261418a565b60035461349d9190614000565b90506000600b85815481106134b4576134b4613c22565b600091825260209091200154905081811115613508576134d48282613c0b565b9050600454816134e49190614000565b6005546134f19085614000565b6134fb9190614196565b6135059084613d53565b92505b50909392505050565b6000813f801580159061354457507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b6040805160c08101825260008082526020820181905291810182905260608101829052608081019190915260a08101613582613664565b905290565b8280548282559060005260206000209081019282156135ce579160200282015b828111156135ce5782516135be90839060016135de565b50916020019190600101906135a7565b506135da929150613682565b5090565b828054828255906000526020600020908101928215613658579160200282015b8281111561365857825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906135fe565b506135da92915061369f565b6040518060a001604052806005906020820280368337509192915050565b808211156135da57600061369682826136b4565b50600101613682565b5b808211156135da57600081556001016136a0565b50805460008255906000526020600020908101906136d2919061369f565b50565b6000602082840312156136e757600080fd5b5035919050565b60006101408201905060ff835116825260208084015161ffff8082168386015273ffffffffffffffffffffffffffffffffffffffff604087015116604086015264ffffffffff606087015116606086015267ffffffffffffffff608087015116608086015260a0860151915060a0850160005b6005811015613780578351831682529284019290840190600101613761565b505050505092915050565b73ffffffffffffffffffffffffffffffffffffffff811681146136d257600080fd5b600080604083850312156137c057600080fd5b82356137cb8161378b565b946020939093013593505050565b60008083601f8401126137eb57600080fd5b50813567ffffffffffffffff81111561380357600080fd5b60208301915083602082850101111561381b57600080fd5b9250929050565b6000806020838503121561383557600080fd5b823567ffffffffffffffff81111561384c57600080fd5b613858858286016137d9565b90969095509350505050565b60006020828403121561387657600080fd5b81356135448161378b565b60008060006060848603121561389657600080fd5b505081359360208301359350604090920135919050565b6020808252825182820181905260009190848201906040850190845b818110156138fb57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138c9565b50909695505050505050565b63ffffffff811681146136d257600080fd5b60008060008060008060008060e0898b03121561393557600080fd5b8835975060208901359650604089013561394e81613907565b9550606089013561395e8161378b565b94506080890135935060a08901356139758161378b565b925060c089013567ffffffffffffffff81111561399157600080fd5b61399d8b828c016137d9565b999c989b5096995094979396929594505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000602082840312156139f257600080fd5b813567ffffffffffffffff80821115613a0a57600080fd5b818401915084601f830112613a1e57600080fd5b813581811115613a3057613a306139b1565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715613a7657613a766139b1565b81604052828152876020848701011115613a8f57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060408385031215613ac257600080fd5b8235613acd8161378b565b91506020830135613add8161378b565b809150509250929050565b600080600060408486031215613afd57600080fd5b8335613b088161378b565b9250602084013567ffffffffffffffff811115613b2457600080fd5b613b30868287016137d9565b9497909650939450505050565b600080600060608486031215613b5257600080fd5b8335613b5d8161378b565b95602085013595506040909401359392505050565b600080600080600060808688031215613b8a57600080fd5b8535613b9581613907565b94506020860135935060408601359250606086013567ffffffffffffffff811115613bbf57600080fd5b613bcb888289016137d9565b969995985093965092949392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015613c1d57613c1d613bdc565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215613c6357600080fd5b8151801515811461354457600080fd5b8183823760009101908152919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b838152604060208201526000613d15604083018486613cb2565b95945050505050565b600081613d2d57613d2d613bdc565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b60008219821115613d6657613d66613bdc565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613d9c57613d9c613bdc565b5060010190565b63ffffffff86168152846020820152836040820152608060608201526000613dcf608083018486613cb2565b979650505050505050565b600060208284031215613dec57600080fd5b5051919050565b600060208284031215613e0557600080fd5b815161354481613907565b600060208284031215613e2257600080fd5b81516135448161378b565b60006101008b835263ffffffff8b16602084015273ffffffffffffffffffffffffffffffffffffffff808b166040850152808a1660608501528089166080850152508660a084015285151560c08401528060e0840152613e908184018587613cb2565b9c9b505050505050505050505050565b60005b83811015613ebb578181015183820152602001613ea3565b83811115612b615750506000910152565b60008451613ede818460208901613ea0565b91909101928352506020820152604001919050565b86815285602082015263ffffffff8516604082015273ffffffffffffffffffffffffffffffffffffffff8416606082015282608082015260c060a0820152600082518060c0840152613f4c8160e0850160208701613ea0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160e001979650505050505050565b60008060008060008060c08789031215613f9c57600080fd5b8651613fa78161378b565b6020880151909650613fb88161378b565b6040880151909550613fc98161378b565b6060880151909450613fda8161378b565b6080880151909350613feb8161378b565b8092505060a087015190509295509295509295565b600082614036577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600181815b808511156140c357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156140a9576140a9613bdc565b808516156140b657918102915b93841c939080029061406f565b509250929050565b6000826140da5750600161344d565b816140e75750600061344d565b81600181146140fd576002811461410757614123565b600191505061344d565b60ff84111561411857614118613bdc565b50506001821b61344d565b5060208310610133831016604e8410600b8410161715614146575081810a61344d565b614150838361406a565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561418257614182613bdc565b029392505050565b600061354483836140cb565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141ce576141ce613bdc565b50029056fea164736f6c634300080d000a00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000