0x608060405234801561001057600080fd5b506124ba806100206000396000f3fe6080604052600436106100e15760003560e01c8063a9e118931161007f578063d60b347f11610059578063d60b347f14610355578063eb8d3f121461039b578063f951975a146103be578063fbe3c2cd146103eb57610159565b8063a9e11893146102db578063b172b22214610308578063c0fd8bde1461032657610159565b80636606b4e0116100bb5780636606b4e014610243578063875be02a146102655780639a8a059214610293578063a0cce1b3146102bb57610159565b806304ca84cf146101a15780631cfe7951146101d75780632c3c02a41461020357610159565b366101595760405162461bcd60e51b815260206004820152603560248201527f74686520576f726d686f6c6520526563656976657220636f6e7472616374206460448201527f6f6573206e6f742061636365707420617373657473000000000000000000000060648201526084015b60405180910390fd5b60405162461bcd60e51b815260206004820152600b60248201527f756e737570706f727465640000000000000000000000000000000000000000006044820152606401610150565b3480156101ad57600080fd5b506101c16101bc366004611d4e565b61040a565b6040516101ce919061211a565b60405180910390f35b3480156101e357600080fd5b5060035463ffffffff165b60405163ffffffff90911681526020016101ce565b34801561020f57600080fd5b5061023361021e366004611bc1565b60009081526004602052604090205460ff1690565b60405190151581526020016101ce565b34801561024f57600080fd5b5061026361025e366004611d4e565b61067d565b005b34801561027157600080fd5b50610285610280366004611d89565b6108b7565b6040516101ce9291906120ec565b34801561029f57600080fd5b5060005461ffff165b60405161ffff90911681526020016101ce565b3480156102c757600080fd5b506102856102d6366004611bd9565b610a68565b3480156102e757600080fd5b506102fb6102f6366004611d4e565b610cb4565b6040516101ce919061218a565b34801561031457600080fd5b506001546040519081526020016101ce565b34801561033257600080fd5b50610346610341366004611ce1565b61119b565b6040516101ce9392919061219d565b34801561036157600080fd5b50610233610370366004611ba0565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205460ff1690565b3480156103a757600080fd5b50600354640100000000900463ffffffff166101ee565b3480156103ca57600080fd5b506103de6103d9366004611ea9565b61124d565b6040516101ce9190612177565b3480156103f757600080fd5b5060005462010000900461ffff166102a8565b6104126118f2565b600061041e83826112f9565b825261042b6020826122b7565b9050610437838261135f565b60ff16602083015261044a6001826122b7565b9050816020015160ff166002146104a35760405162461bcd60e51b815260206004820152601a60248201527f696e76616c696420477561726469616e536574557067726164650000000000006044820152606401610150565b6104ad83826113c5565b61ffff1660408301526104c16002826122b7565b90506104cd838261142b565b63ffffffff1660808301526104e36004826122b7565b905060006104f1848361135f565b90506104fe6001836122b7565b915060405180604001604052808260ff1667ffffffffffffffff81111561054e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610577578160200160208202803683370190505b5081526000602090910181905260608501919091525b8160ff16811015610625576105a28584611491565b6060850151518051839081106105e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526106116014846122b7565b92508061061d816123a9565b91505061058d565b50818451146106765760405162461bcd60e51b815260206004820152601a60248201527f696e76616c696420477561726469616e536574557067726164650000000000006044820152606401610150565b5050919050565b600061068882610cb4565b905060008061069683611507565b915091508181906106ba5760405162461bcd60e51b81526004016101509190612107565b5060006106ca8460e0015161040a565b805190915063436f7265146107215760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964204d6f64756c650000000000000000000000000000000000006044820152606401610150565b606081015151516107745760405162461bcd60e51b815260206004820152601960248201527f6e657720677561726469616e2073657420697320656d707479000000000000006044820152606401610150565b60035463ffffffff166107889060016122cf565b63ffffffff16816080015163ffffffff161461080c5760405162461bcd60e51b815260206004820152602160248201527f696e646578206d75737420696e63726561736520696e207374657073206f662060448201527f31000000000000000000000000000000000000000000000000000000000000006064820152608401610150565b61084e846101400151600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61086561086060035463ffffffff1690565b611684565b610877816060015182608001516116d7565b6080810151600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9092169190911790555050505050565b6000606060006108cb84610100015161124d565b8051519091506109175760006040518060400160405280601481526020017f696e76616c696420677561726469616e207365740000000000000000000000008152509250925050915091565b60035463ffffffff1663ffffffff1684610100015163ffffffff1614158015610949575042816020015163ffffffff16105b156109905760006040518060400160405280601881526020017f677561726469616e2073657420686173206578706972656400000000000000008152509250925050915091565b61012084015151815151600a906003906109aa9083612355565b6109b4919061231c565b6109bf906002612355565b6109c9919061231c565b6109d49060016122b7565b1115610a1c5760006040518060400160405280600981526020017f6e6f2071756f72756d00000000000000000000000000000000000000000000008152509250925050915091565b600080610a3486610140015187610120015185610a68565b9150915081610a4a576000969095509350505050565b60016040518060200160405280600081525094509450505050915091565b600060606000805b8551811015610c93576000868281518110610ab4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190508160001480610ad657508260ff16816060015160ff16115b610b485760405162461bcd60e51b815260206004820152602360248201527f7369676e617475726520696e6469636573206d75737420626520617363656e6460448201527f696e6700000000000000000000000000000000000000000000000000000000006064820152608401610150565b6060810151865180519194509060ff8516908110610b8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1660018983604001518460000151856020015160405160008152602001604052604051610bf5949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610c17573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff1614610c805760006040518060400160405280601481526020017f564d207369676e617475726520696e76616c696400000000000000000000000081525094509450505050610cac565b5080610c8b816123a9565b915050610a70565b5060016040518060200160405280600081525092509250505b935093915050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018190526101008201839052610120820152610140810182905290610d16838261135f565b60ff168252610d266001826122b7565b9050816000015160ff16600114610d7f5760405162461bcd60e51b815260206004820152601760248201527f564d2076657273696f6e20696e636f6d70617469626c650000000000000000006044820152606401610150565b610d89838261142b565b63ffffffff16610100830152610da06004826122b7565b90506000610dae848361135f565b60ff169050610dbe6001836122b7565b91508067ffffffffffffffff811115610e00577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e7057816020015b6040805160808101825260008082526020808301829052928201819052606082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181610e1e5790505b5061012084015260005b8181101561104357610e8c858461135f565b8461012001518281518110610eca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015160ff909116606090910152610eeb6001846122b7565b9250610ef785846112f9565b8461012001518281518110610f35577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516000018181525050602083610f5291906122b7565b9250610f5e85846112f9565b8461012001518281518110610f9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516020018181525050602083610fb991906122b7565b9250610fc5858461135f565b610fd090601b6122f7565b846101200151828151811061100e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015160ff90911660409091015261102f6001846122b7565b92508061103b816123a9565b915050610e7a565b50600061105f838487516110579190612392565b879190611746565b9050808051906020012060405160200161107b91815260200190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101206101408501526110c1858461142b565b63ffffffff1660208501526110d76004846122b7565b92506110e3858461142b565b63ffffffff1660408501526110f96004846122b7565b925061110585846113c5565b61ffff1660608501526111196002846122b7565b925061112585846112f9565b60808501526111356020846122b7565b9250611141858461188c565b67ffffffffffffffff1660a085015261115b6008846122b7565b9250611167858461135f565b60ff1660c085015261117a6001846122b7565b925061118d838487516110579190612392565b60e085015250919392505050565b604080516101608101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e0820181905261010082018390526101208201526101408101919091526000606061123685858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610cb492505050565b9250611241836108b7565b93969095509293505050565b60408051808201825260608082526000602080840182905263ffffffff861682526002815290849020845181549283028101840186529485018281529394939092849284918401828280156112d857602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116112ad575b50505091835250506001919091015463ffffffff1660209091015292915050565b60006113068260206122b7565b835110156113565760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e647300000000000000000000006044820152606401610150565b50016020015190565b600061136c8260016122b7565b835110156113bc5760405162461bcd60e51b815260206004820152601360248201527f746f55696e74385f6f75744f66426f756e6473000000000000000000000000006044820152606401610150565b50016001015190565b60006113d28260026122b7565b835110156114225760405162461bcd60e51b815260206004820152601460248201527f746f55696e7431365f6f75744f66426f756e64730000000000000000000000006044820152606401610150565b50016002015190565b60006114388260046122b7565b835110156114885760405162461bcd60e51b815260206004820152601460248201527f746f55696e7433325f6f75744f66426f756e64730000000000000000000000006044820152606401610150565b50016004015190565b600061149e8260146122b7565b835110156114ee5760405162461bcd60e51b815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e647300000000000000000000006044820152606401610150565b5001602001516c01000000000000000000000000900490565b60006060600080611517856108b7565b915091508161152c5760009590945092505050565b60035463ffffffff1663ffffffff1685610100015163ffffffff161461157257600060405180606001604052806022815260200161244160229139935093505050915091565b60005462010000900461ffff1661ffff16856060015161ffff16146115d45760006040518060400160405280601681526020017f77726f6e6720676f7665726e616e636520636861696e00000000000000000000815250935093505050915091565b6001548560800151146116245760006040518060400160405280601981526020017f77726f6e6720676f7665726e616e636520636f6e747261637400000000000000815250935093505050915091565b61014085015160009081526004602052604090205460ff161561166757600060405180606001604052806022815260200161246360229139935093505050915091565b600160405180602001604052806000815250935093505050915091565b61169142620151806122cf565b63ffffffff918216600090815260026020526040902060010180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001691909216179055565b63ffffffff8116600090815260026020908152604090912083518051859361170392849291019061194c565b5060209190910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9092169190911790555050565b60608161175481601f6122b7565b10156117a25760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610150565b6117ac82846122b7565b845110156117fc5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610150565b60608215801561181b5760405191506000825260208201604052611883565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561185457805183526020928301920161183c565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b60006118998260086122b7565b835110156118e95760405162461bcd60e51b815260206004820152601460248201527f746f55696e7436345f6f75744f66426f756e64730000000000000000000000006044820152606401610150565b50016008015190565b6040518060a0016040528060008019168152602001600060ff168152602001600061ffff16815260200161193f604051806040016040528060608152602001600063ffffffff1681525090565b8152600060209091015290565b8280548282559060005260206000209081019282156119c6579160200282015b828111156119c657825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90911617825560209092019160019091019061196c565b506119d29291506119d6565b5090565b5b808211156119d257600081556001016119d7565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a0f57600080fd5b919050565b600082601f830112611a24578081fd5b81356020611a39611a3483612293565b612244565b80838252828201915082860187848660071b8901011115611a58578586fd5b855b85811015611abb57608080838b031215611a72578788fd5b611a7a6121d4565b8335815286840135878201526040611a93818601611b8f565b908201526060611aa4858201611b8f565b908201528552938501939190910190600101611a5a565b5090979650505050505050565b600082601f830112611ad8578081fd5b813567ffffffffffffffff811115611af257611af2612411565b611b2360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612244565b818152846020838601011115611b37578283fd5b816020850160208301379081016020019190915292915050565b803561ffff81168114611a0f57600080fd5b803563ffffffff81168114611a0f57600080fd5b803567ffffffffffffffff81168114611a0f57600080fd5b803560ff81168114611a0f57600080fd5b600060208284031215611bb1578081fd5b611bba826119eb565b9392505050565b600060208284031215611bd2578081fd5b5035919050565b600080600060608486031215611bed578182fd5b8335925060208085013567ffffffffffffffff80821115611c0c578485fd5b611c1888838901611a14565b94506040870135915080821115611c2d578384fd5b9086019060408289031215611c40578384fd5b611c486121fd565b823582811115611c56578586fd5b83019150601f82018913611c68578485fd5b8135611c76611a3482612293565b8082825286820191508685018c888560051b8801011115611c95578889fd5b8895505b83861015611cbe57611caa816119eb565b835260019590950194918701918701611c99565b50835250611ccf9050838501611b63565b84820152809450505050509250925092565b60008060208385031215611cf3578182fd5b823567ffffffffffffffff80821115611d0a578384fd5b818501915085601f830112611d1d578384fd5b813581811115611d2b578485fd5b866020828501011115611d3c578485fd5b60209290920196919550909350505050565b600060208284031215611d5f578081fd5b813567ffffffffffffffff811115611d75578182fd5b611d8184828501611ac8565b949350505050565b600060208284031215611d9a578081fd5b813567ffffffffffffffff80821115611db1578283fd5b908301906101608286031215611dc5578283fd5b611dcd612220565b611dd683611b8f565b8152611de460208401611b63565b6020820152611df560408401611b63565b6040820152611e0660608401611b51565b606082015260808301356080820152611e2160a08401611b77565b60a0820152611e3260c08401611b8f565b60c082015260e083013582811115611e48578485fd5b611e5487828601611ac8565b60e083015250610100611e68818501611b63565b908201526101208381013583811115611e7f578586fd5b611e8b88828701611a14565b91830191909152506101409283013592810192909252509392505050565b600060208284031215611eba578081fd5b611bba82611b63565b6000815180845260208085019450808401835b83811015611f1b57815180518852838101518489015260408082015160ff908116918a0191909152606091820151169088015260809096019590820190600101611ed6565b509495945050505050565b60008151808452815b81811015611f4b57602081850181015186830182015201611f2f565b81811115611f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805160408084528151908401819052600091602091908201906060860190845b81811015611fe157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101611faf565b50509382015163ffffffff16949091019390935250919050565b805160ff1682526000610160602083015161201e602086018263ffffffff169052565b506040830151612036604086018263ffffffff169052565b50606083015161204c606086018261ffff169052565b506080830151608085015260a083015161207260a086018267ffffffffffffffff169052565b5060c083015161208760c086018260ff169052565b5060e08301518160e086015261209f82860182611f26565b915050610100808401516120ba8287018263ffffffff169052565b505061012080840151858303828701526120d48382611ec3565b61014095860151969095019590955250919392505050565b8215158152604060208201526000611d816040830184611f26565b602081526000611bba6020830184611f26565b602081528151602082015260ff602083015116604082015261ffff60408301511660608201526000606083015160a0608084015261215b60c0840182611f8f565b905063ffffffff60808501511660a08401528091505092915050565b602081526000611bba6020830184611f8f565b602081526000611bba6020830184611ffb565b6060815260006121b06060830186611ffb565b841515602084015282810360408401526121ca8185611f26565b9695505050505050565b6040516080810167ffffffffffffffff811182821017156121f7576121f7612411565b60405290565b6040805190810167ffffffffffffffff811182821017156121f7576121f7612411565b604051610160810167ffffffffffffffff811182821017156121f7576121f7612411565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561228b5761228b612411565b604052919050565b600067ffffffffffffffff8211156122ad576122ad612411565b5060051b60200190565b600082198211156122ca576122ca6123e2565b500190565b600063ffffffff8083168185168083038211156122ee576122ee6123e2565b01949350505050565b600060ff821660ff84168060ff03821115612314576123146123e2565b019392505050565b600082612350577f4e487b710000000000000000000000000000000000000000000000000000000081526012600452602481fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561238d5761238d6123e2565b500290565b6000828210156123a4576123a46123e2565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156123db576123db6123e2565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfe6e6f74207369676e65642062792063757272656e7420677561726469616e20736574676f7665726e616e636520616374696f6e20616c726561647920636f6e73756d6564a264697066735822122013d765e3807475ef9a17a32914264d66276649977872f8789da6030edeb63cb064736f6c63430008040033