0x60806040523480156200001157600080fd5b506200001c62000022565b620000e4565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e2576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612c8680620000f46000396000f3fe6080604052600436106101af5760003560e01c8063439fab91116100ec5780639308ecff1161008a578063f23a6e6111610064578063f23a6e6114610542578063f2ade9db1461047d578063f862ddeb14610587578063ffc29ab2146105a757600080fd5b80639308ecff146104bd578063a61f00e4146104dd578063bc197c81146104fd57600080fd5b80635f85c015116100c65780635f85c0151461043d5780637d8216401461045d578063858dda871461047d57806388a6b4e21461049d57600080fd5b8063439fab91146103dd5780634976595d146103fd578063512883561461041d57600080fd5b80631bd0a4a4116101595780632cff3e67116101335780632cff3e671461035d57806339f35fca1461037d5780633b8c25591461039d5780633d902f31146103bd57600080fd5b80631bd0a4a4146102c557806320bc3b0d146102e557806329cbe6641461033d57600080fd5b8063084347091161018a5780630843470914610234578063150b7a021461025457806319e6ff39146102a557600080fd5b8062c03cd9146101bb57806301ffc9a7146101dd57806306fdde031461021257600080fd5b366101b657005b600080fd5b3480156101c757600080fd5b506101db6101d6366004611fc1565b6105c7565b005b3480156101e957600080fd5b506101fd6101f8366004611ff6565b610735565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b506102276107ce565b60405161020991906120ad565b34801561024057600080fd5b506101db61024f366004611fc1565b61085c565b34801561026057600080fd5b5061027461026f366004612225565b610983565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610209565b3480156102b157600080fd5b506101db6102c03660046122dd565b6109ad565b3480156102d157600080fd5b506101db6102e03660046122dd565b610a3e565b3480156102f157600080fd5b506000546103189062010000900473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b34801561034957600080fd5b506101db6103583660046122dd565b610ac9565b34801561036957600080fd5b506101db610378366004612331565b610b49565b34801561038957600080fd5b506101db61039836600461235f565b610c2f565b3480156103a957600080fd5b506101db6103b836600461237b565b610d81565b3480156103c957600080fd5b506101db6103d83660046122dd565b610e13565b3480156103e957600080fd5b506101fd6103f83660046123f0565b610e9e565b34801561040957600080fd5b506101db610418366004612331565b61110e565b34801561042957600080fd5b506101db61043836600461235f565b6111ee565b34801561044957600080fd5b506101db61045836600461246a565b6112e6565b34801561046957600080fd5b506101db61047836600461246a565b611371565b34801561048957600080fd5b506101db61049836600461235f565b6113fc565b3480156104a957600080fd5b506101db6104b836600461235f565b6114f3565b3480156104c957600080fd5b506102276104d83660046124ae565b6115dc565b3480156104e957600080fd5b506101db6104f836600461235f565b6117de565b34801561050957600080fd5b506102746105183660046125c2565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561054e57600080fd5b5061027461055d366004612670565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561059357600080fd5b506101db6105a23660046122dd565b611877565b3480156105b357600080fd5b506101db6105c23660046122dd565b611902565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461061e576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061063060408301602084016126d9565b73ffffffffffffffffffffffffffffffffffffffff160361067d576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61068a60208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff16632eb2c2d6306106b660408501602086016126d9565b6106c360408601866126f6565b6106d060608801886126f6565b6106dd60808a018a61275e565b6040518963ffffffff1660e01b8152600401610700989796959493929190612857565b600060405180830381600087803b15801561071a57600080fd5b505af115801561072e573d6000803e3d6000fd5b5050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806107c857507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600180546107db906128c8565b80601f0160208091040260200160405190810160405280929190818152602001828054610807906128c8565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b505050505081565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108c560408301602084016126d9565b73ffffffffffffffffffffffffffffffffffffffff1603610912576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61091f60208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff1663f242432a3061094b60408501602086016126d9565b60408501356060860135610962608088018861275e565b6040518763ffffffff1660e01b815260040161070096959493929190612915565b7f150b7a02000000000000000000000000000000000000000000000000000000005b949350505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a04576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a3857610a30848483818110610a2557610a25612967565b9050606002016113fc565b600101610a08565b50505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610a95576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a3857610ac1848483818110610ab657610ab6612967565b905060600201610c2f565b600101610a99565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610b20576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a3857610b41848483818110610a2557610a25612967565b600101610b24565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610ba0576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610baf60208301836126d9565b73ffffffffffffffffffffffffffffffffffffffff1603610bfc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2c60208201803590610c1090846126d9565b73ffffffffffffffffffffffffffffffffffffffff169061198d565b50565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610c86576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610c9860408301602084016126d9565b73ffffffffffffffffffffffffffffffffffffffff1603610ce5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cf260208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff166323b872dd30610d1e60408501602086016126d9565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301528401356044820152606401610700565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610dd8576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a3857610e0b848483818110610df957610df9612967565b90506020028101906101d69190612996565b600101610ddc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314610e6a576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a3857610e96848483818110610e8b57610e8b612967565b9050606002016114f3565b600101610e6e565b60008054610100900460ff1615808015610ebf5750600054600160ff909116105b80610ed95750303b158015610ed9575060005460ff166001145b610f6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fc857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b3373ffffffffffffffffffffffffffffffffffffffff1663c34c08e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611013573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103791906129d4565b600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008380602001905181019061108d91906129f1565b805190915060019061109f9082612aea565b506001925050801561110857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50919050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611165576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117260208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff16635c19a95c61119d60408401602085016126d9565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610700565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611245576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125760408301602084016126d9565b73ffffffffffffffffffffffffffffffffffffffff16036112a4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2c6112b760408301602084016126d9565b60408301356112c960208501856126d9565b73ffffffffffffffffffffffffffffffffffffffff169190611aec565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461133d576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a385761136984848381811061135e5761135e612967565b905060400201610b49565b600101611341565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146113c8576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a38576113f48484838181106113e9576113e9612967565b90506040020161110e565b6001016113cc565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611453576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61146060208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff1663a22cb46561148b60408401602085016126d9565b61149b6060850160408601612c04565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015215156024820152604401610700565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff16331461154a576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61155760208201826126d9565b73ffffffffffffffffffffffffffffffffffffffff1663095ea7b361158260408401602085016126d9565b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301528401356024820152604401610700565b60005460609062010000900473ffffffffffffffffffffffffffffffffffffffff163314611636576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060608615611729578515611678576040517faa5ec47300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005460405173ffffffffffffffffffffffffffffffffffffffff8a16906116a39088908890612c21565b600060405180830381855af49150503d80600081146116de576040519150601f19603f3d011682016040523d82523d6000602084013e6116e3565b606091505b5060005491945092508114611723576040517ea0061c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061179a565b8773ffffffffffffffffffffffffffffffffffffffff16868686604051611751929190612c21565b60006040518083038185875af1925050503d806000811461178e576040519150601f19603f3d011682016040523d82523d6000602084013e611793565b606091505b5090925090505b816117d357806040517fbce0ac7f000000000000000000000000000000000000000000000000000000008152600401610f6191906120ad565b979650505050505050565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611835576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c2c61184860408301602084016126d9565b604083013561185a60208501856126d9565b73ffffffffffffffffffffffffffffffffffffffff169190611bc0565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff1633146118ce576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a38576118fa8484838181106118ef576118ef612967565b9050606002016117de565b6001016118d2565b60005462010000900473ffffffffffffffffffffffffffffffffffffffff163314611959576040517f1185bb6100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060005b81811015610a385761198584848381811061197a5761197a612967565b9050606002016111ee565b60010161195d565b804710156119f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610f61565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114611a51576040519150601f19603f3d011682016040523d82523d6000602084013e611a56565b606091505b5050905080611ae7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610f61565b505050565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ae79084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611d42565b801580611c6057506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa158015611c3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5e9190612c31565b155b611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610f61565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ae79084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611b3e565b6000611da4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611e4e9092919063ffffffff16565b805190915015611ae75780806020019051810190611dc29190612c4a565b611ae7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610f61565b60606109a58484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051611e829190612c67565b60006040518083038185875af1925050503d8060008114611ebf576040519150601f19603f3d011682016040523d82523d6000602084013e611ec4565b606091505b50915091506117d38783838760608315611f66578251600003611f5f5773ffffffffffffffffffffffffffffffffffffffff85163b611f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610f61565b50816109a5565b6109a58383815115611f7b5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6191906120ad565b600060a0828403121561110857600080fd5b600060208284031215611fd357600080fd5b813567ffffffffffffffff811115611fea57600080fd5b6109a584828501611faf565b60006020828403121561200857600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461203857600080fd5b9392505050565b60005b8381101561205a578181015183820152602001612042565b50506000910152565b6000815180845261207b81602086016020860161203f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006120386020830184612063565b73ffffffffffffffffffffffffffffffffffffffff81168114610c2c57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516020810167ffffffffffffffff81118282101715612134576121346120e2565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612181576121816120e2565b604052919050565b600067ffffffffffffffff8211156121a3576121a36120e2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126121e057600080fd5b81356121f36121ee82612189565b61213a565b81815284602083860101111561220857600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561223b57600080fd5b8435612246816120c0565b93506020850135612256816120c0565b925060408501359150606085013567ffffffffffffffff81111561227957600080fd5b612285878288016121cf565b91505092959194509250565b60008083601f8401126122a357600080fd5b50813567ffffffffffffffff8111156122bb57600080fd5b6020830191508360206060830285010111156122d657600080fd5b9250929050565b600080602083850312156122f057600080fd5b823567ffffffffffffffff81111561230757600080fd5b61231385828601612291565b90969095509350505050565b60006040828403121561110857600080fd5b60006040828403121561234357600080fd5b612038838361231f565b60006060828403121561110857600080fd5b60006060828403121561237157600080fd5b612038838361234d565b6000806020838503121561238e57600080fd5b823567ffffffffffffffff808211156123a657600080fd5b818501915085601f8301126123ba57600080fd5b8135818111156123c957600080fd5b8660208260051b85010111156123de57600080fd5b60209290920196919550909350505050565b60006020828403121561240257600080fd5b813567ffffffffffffffff81111561241957600080fd5b6109a5848285016121cf565b60008083601f84011261243757600080fd5b50813567ffffffffffffffff81111561244f57600080fd5b6020830191508360208260061b85010111156122d657600080fd5b6000806020838503121561247d57600080fd5b823567ffffffffffffffff81111561249457600080fd5b61231385828601612425565b8015158114610c2c57600080fd5b6000806000806000608086880312156124c657600080fd5b85356124d1816120c0565b945060208601356124e1816124a0565b935060408601359250606086013567ffffffffffffffff8082111561250557600080fd5b818801915088601f83011261251957600080fd5b81358181111561252857600080fd5b89602082850101111561253a57600080fd5b9699959850939650602001949392505050565b600082601f83011261255e57600080fd5b8135602067ffffffffffffffff82111561257a5761257a6120e2565b8160051b61258982820161213a565b92835284810182019282810190878511156125a357600080fd5b83870192505b848310156117d3578235825291830191908301906125a9565b600080600080600060a086880312156125da57600080fd5b85356125e5816120c0565b945060208601356125f5816120c0565b9350604086013567ffffffffffffffff8082111561261257600080fd5b61261e89838a0161254d565b9450606088013591508082111561263457600080fd5b61264089838a0161254d565b9350608088013591508082111561265657600080fd5b50612663888289016121cf565b9150509295509295909350565b600080600080600060a0868803121561268857600080fd5b8535612693816120c0565b945060208601356126a3816120c0565b93506040860135925060608601359150608086013567ffffffffffffffff8111156126cd57600080fd5b612663888289016121cf565b6000602082840312156126eb57600080fd5b8135612038816120c0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261272b57600080fd5b83018035915067ffffffffffffffff82111561274657600080fd5b6020019150600581901b36038213156122d657600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261279357600080fd5b83018035915067ffffffffffffffff8211156127ae57600080fd5b6020019150368190038213156122d657600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156127f557600080fd5b8260051b80836020870137939093016020019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b600073ffffffffffffffffffffffffffffffffffffffff808b168352808a1660208401525060a0604083015261289160a08301888a6127c3565b82810360608401526128a48187896127c3565b905082810360808401526128b981858761280e565b9b9a5050505050505050505050565b600181811c908216806128dc57607f821691505b602082108103611108577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff808916835280881660208401525085604083015284606083015260a0608083015261295b60a08301848661280e565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618336030181126129ca57600080fd5b9190910192915050565b6000602082840312156129e657600080fd5b8151612038816120c0565b600060208284031215612a0357600080fd5b815167ffffffffffffffff80821115612a1b57600080fd5b9083019060208286031215612a2f57600080fd5b612a37612111565b825182811115612a4657600080fd5b80840193505085601f840112612a5b57600080fd5b82519150612a6b6121ee83612189565b828152866020848601011115612a8057600080fd5b612a9183602083016020870161203f565b815295945050505050565b601f821115611ae757600081815260208120601f850160051c81016020861015612ac35750805b601f850160051c820191505b81811015612ae257828155600101612acf565b505050505050565b815167ffffffffffffffff811115612b0457612b046120e2565b612b1881612b1284546128c8565b84612a9c565b602080601f831160018114612b6b5760008415612b355750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612ae2565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612bb857888601518255948401946001909101908401612b99565b5085821015612bf457878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215612c1657600080fd5b8135612038816124a0565b8183823760009101908152919050565b600060208284031215612c4357600080fd5b5051919050565b600060208284031215612c5c57600080fd5b8151612038816124a0565b600082516129ca81846020870161203f56fea164736f6c6343000813000a