0x608060405234801561001057600080fd5b50326000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a83806100606000396000f3fe6080604052600436106100e85760003560e01c806397d837ce1161008a578063e1ac9e2f11610059578063e1ac9e2f14610291578063f23a6e61146102ba578063f80f5dd5146102f7578063fad03eb314610320576100e8565b806397d837ce14610200578063af07f8841461021c578063b8d11d9714610238578063bc197c8114610254576100e8565b80634a69a277116100c65780634a69a2771461018357806378c8cda71461019f5780637a129603146101c857806382916381146101e4576100e8565b806301ffc9a7146100ed578063150b7a021461012a578063481644be14610167575b600080fd5b3480156100f957600080fd5b50610114600480360381019061010f9190611cf5565b61033c565b6040516101219190611d3d565b60405180910390f35b34801561013657600080fd5b50610151600480360381019061014c9190611f32565b6103b6565b60405161015e9190611fc4565b60405180910390f35b610181600480360381019061017c9190611fdf565b6103ca565b005b61019d60048036038101906101989190612062565b61075a565b005b3480156101ab57600080fd5b506101c660048036038101906101c191906120b5565b6108fd565b005b6101e260048036038101906101dd91906120e2565b610a0a565b005b6101fe60048036038101906101f99190612179565b610d67565b005b61021a60048036038101906102159190612179565b610eb0565b005b610236600480360381019061023191906121fc565b610fd6565b005b610252600480360381019061024d9190611fdf565b6111c3565b005b34801561026057600080fd5b5061027b60048036038101906102769190612333565b611638565b6040516102889190611fc4565b60405180910390f35b34801561029d57600080fd5b506102b860048036038101906102b39190612402565b61164d565b005b3480156102c657600080fd5b506102e160048036038101906102dc919061242f565b6117e4565b6040516102ee9190611fc4565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906120b5565b6117f9565b005b61033a600480360381019061033591906120e2565b611906565b005b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103af57506103ae82611bb5565b5b9050919050565b600063150b7a0260e01b9050949350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156104705750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156104d4573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d010000000000000000000000000000000000000000000000000000000081526004016104cb9291906124d5565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e60006040518263ffffffff1660e01b815260040161050e9190612543565b6020604051808303816000875af192505050801561054a57506040513d601f19601f820116820180604052508101906105479190612573565b60015b61055b576001600481905550610565565b6000600481905550505b60006004548473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156105b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105db91906125b5565b6105e59190612611565b9050600085346105f59190612674565b905060005b86811015610751576000808773ffffffffffffffffffffffffffffffffffffffff16848760405161062b9190612716565b60006040518083038185875af1925050503d8060008114610668576040519150601f19603f3d011682016040523d82523d6000602084013e61066d565b606091505b50915091508181906106b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ac9190612782565b60405180910390fd5b5060005b87811015610743578873ffffffffffffffffffffffffffffffffffffffff166323b872dd3033896040518463ffffffff1660e01b81526004016106fe939291906127b3565b600060405180830381600087803b15801561071857600080fd5b505af115801561072c573d6000803e3d6000fd5b5050505085806001019650508060010190506106b9565b5082600101925050506105fa565b50505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156108005750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610864573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d0100000000000000000000000000000000000000000000000000000000815260040161085b9291906124d5565b60405180910390fd5b60008390505b6001836108779190612611565b81146108f7578173ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b81526004016108ba939291906127b3565b600060405180830381600087803b1580156108d457600080fd5b505af11580156108e8573d6000803e3d6000fd5b5050505080600101905061086a565b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109af573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d010000000000000000000000000000000000000000000000000000000081526004016109a69291906124d5565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610ab05750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15610b14573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d01000000000000000000000000000000000000000000000000000000008152600401610b0b9291906124d5565b60405180910390fd5b60018054905085600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610b659190612611565b1115610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90612836565b60405180910390fd5b60008534610bb49190612674565b90506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b86600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c469190612611565b811015610d085760018181548110610c6157610c60612856565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166397d837ce83888789886040518663ffffffff1660e01b8152600401610ccb94939291906128cf565b6000604051808303818588803b158015610ce457600080fd5b505af1158015610cf8573d6000803e3d6000fd5b5050505050806001019050610bfb565b5085600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d589190612611565b92505081905550505050505050565b60008473ffffffffffffffffffffffffffffffffffffffff163483604051610d8f9190612716565b60006040518083038185875af1925050503d8060008114610dcc576040519150601f19603f3d011682016040523d82523d6000602084013e610dd1565b606091505b5050905080610e15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0c90612967565b60405180910390fd5b60008490505b8385610e279190612611565b811015610ea8578573ffffffffffffffffffffffffffffffffffffffff166323b872dd3032846040518463ffffffff1660e01b8152600401610e6b939291906127b3565b600060405180830381600087803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b50505050806001019050610e1b565b505050505050565b60008473ffffffffffffffffffffffffffffffffffffffff163483604051610ed89190612716565b60006040518083038185875af1925050503d8060008114610f15576040519150601f19603f3d011682016040523d82523d6000602084013e610f1a565b606091505b5050905080610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612967565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1663f242432a303287876040518563ffffffff1660e01b8152600401610f9d94939291906129ad565b600060405180830381600087803b158015610fb757600080fd5b505af1158015610fcb573d6000803e3d6000fd5b505050505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561107c5750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156110e0573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d010000000000000000000000000000000000000000000000000000000081526004016110d79291906124d5565b60405180910390fd5b600083346110ee9190612674565b905060005b848110156111bc576000808573ffffffffffffffffffffffffffffffffffffffff1684866040516111249190612716565b60006040518083038185875af1925050503d8060008114611161576040519150601f19603f3d011682016040523d82523d6000602084013e611166565b606091505b50915091508181906111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a59190612782565b60405180910390fd5b5082600101925050506110f3565b5050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156112695750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156112cd573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d010000000000000000000000000000000000000000000000000000000081526004016112c49291906124d5565b60405180910390fd5b60018054905084600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461131e9190612611565b111561135f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135690612836565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16636352211e60006040518263ffffffff1660e01b81526004016113999190612543565b6020604051808303816000875af19250505080156113d557506040513d601f19601f820116820180604052508101906113d29190612573565b60015b6113e65760016004819055506113f0565b6000600481905550505b60006004548473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611442573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146691906125b5565b6114709190612611565b9050600085346114809190612674565b90506000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b86600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115129190612611565b8110156115d9576001818154811061152d5761152c612856565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638291638183888689896040518663ffffffff1660e01b815260040161159794939291906128cf565b6000604051808303818588803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b505050505084830192508060010190506114c7565b5085600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116299190612611565b92505081905550505050505050565b600063bc197c8160e01b905095945050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156116f35750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611757573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d0100000000000000000000000000000000000000000000000000000000815260040161174e9291906124d5565b60405180910390fd5b60005b818110156117e057600161176d30611c1f565b9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806117d890612a05565b91505061175a565b5050565b600063f23a6e6160e01b905095945050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ab573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d010000000000000000000000000000000000000000000000000000000081526004016118a29291906124d5565b60405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156119ac5750600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15611a10573360008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040517f93f44d01000000000000000000000000000000000000000000000000000000008152600401611a079291906124d5565b60405180910390fd5b60008534611a1e9190612674565b905060005b86811015611b565760008673ffffffffffffffffffffffffffffffffffffffff168385604051611a539190612716565b60006040518083038185875af1925050503d8060008114611a90576040519150601f19603f3d011682016040523d82523d6000602084013e611a95565b606091505b5050905080611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad090612967565b60405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1663f242432a3032888a6040518563ffffffff1660e01b8152600401611b1894939291906129ad565b600060405180830381600087803b158015611b3257600080fd5b505af1158015611b46573d6000803e3d6000fd5b5050505081600101915050611a23565b5085600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba69190612611565b92505081905550505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000808260601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611cd281611c9d565b8114611cdd57600080fd5b50565b600081359050611cef81611cc9565b92915050565b600060208284031215611d0b57611d0a611c93565b5b6000611d1984828501611ce0565b91505092915050565b60008115159050919050565b611d3781611d22565b82525050565b6000602082019050611d526000830184611d2e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d8382611d58565b9050919050565b611d9381611d78565b8114611d9e57600080fd5b50565b600081359050611db081611d8a565b92915050565b6000819050919050565b611dc981611db6565b8114611dd457600080fd5b50565b600081359050611de681611dc0565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611e3f82611df6565b810181811067ffffffffffffffff82111715611e5e57611e5d611e07565b5b80604052505050565b6000611e71611c89565b9050611e7d8282611e36565b919050565b600067ffffffffffffffff821115611e9d57611e9c611e07565b5b611ea682611df6565b9050602081019050919050565b82818337600083830152505050565b6000611ed5611ed084611e82565b611e67565b905082815260208101848484011115611ef157611ef0611df1565b5b611efc848285611eb3565b509392505050565b600082601f830112611f1957611f18611dec565b5b8135611f29848260208601611ec2565b91505092915050565b60008060008060808587031215611f4c57611f4b611c93565b5b6000611f5a87828801611da1565b9450506020611f6b87828801611da1565b9350506040611f7c87828801611dd7565b925050606085013567ffffffffffffffff811115611f9d57611f9c611c98565b5b611fa987828801611f04565b91505092959194509250565b611fbe81611c9d565b82525050565b6000602082019050611fd96000830184611fb5565b92915050565b60008060008060808587031215611ff957611ff8611c93565b5b600061200787828801611dd7565b945050602061201887828801611da1565b935050604061202987828801611dd7565b925050606085013567ffffffffffffffff81111561204a57612049611c98565b5b61205687828801611f04565b91505092959194509250565b60008060006060848603121561207b5761207a611c93565b5b600061208986828701611dd7565b935050602061209a86828701611dd7565b92505060406120ab86828701611da1565b9150509250925092565b6000602082840312156120cb576120ca611c93565b5b60006120d984828501611da1565b91505092915050565b600080600080600060a086880312156120fe576120fd611c93565b5b600061210c88828901611dd7565b955050602061211d88828901611da1565b945050604061212e88828901611dd7565b935050606061213f88828901611dd7565b925050608086013567ffffffffffffffff8111156121605761215f611c98565b5b61216c88828901611f04565b9150509295509295909350565b6000806000806080858703121561219357612192611c93565b5b60006121a187828801611da1565b94505060206121b287828801611dd7565b93505060406121c387828801611dd7565b925050606085013567ffffffffffffffff8111156121e4576121e3611c98565b5b6121f087828801611f04565b91505092959194509250565b60008060006060848603121561221557612214611c93565b5b600061222386828701611dd7565b935050602061223486828701611da1565b925050604084013567ffffffffffffffff81111561225557612254611c98565b5b61226186828701611f04565b9150509250925092565b600067ffffffffffffffff82111561228657612285611e07565b5b602082029050602081019050919050565b600080fd5b60006122af6122aa8461226b565b611e67565b905080838252602082019050602084028301858111156122d2576122d1612297565b5b835b818110156122fb57806122e78882611dd7565b8452602084019350506020810190506122d4565b5050509392505050565b600082601f83011261231a57612319611dec565b5b813561232a84826020860161229c565b91505092915050565b600080600080600060a0868803121561234f5761234e611c93565b5b600061235d88828901611da1565b955050602061236e88828901611da1565b945050604086013567ffffffffffffffff81111561238f5761238e611c98565b5b61239b88828901612305565b935050606086013567ffffffffffffffff8111156123bc576123bb611c98565b5b6123c888828901612305565b925050608086013567ffffffffffffffff8111156123e9576123e8611c98565b5b6123f588828901611f04565b9150509295509295909350565b60006020828403121561241857612417611c93565b5b600061242684828501611dd7565b91505092915050565b600080600080600060a0868803121561244b5761244a611c93565b5b600061245988828901611da1565b955050602061246a88828901611da1565b945050604061247b88828901611dd7565b935050606061248c88828901611dd7565b925050608086013567ffffffffffffffff8111156124ad576124ac611c98565b5b6124b988828901611f04565b9150509295509295909350565b6124cf81611d78565b82525050565b60006040820190506124ea60008301856124c6565b6124f760208301846124c6565b9392505050565b6000819050919050565b6000819050919050565b600061252d612528612523846124fe565b612508565b611db6565b9050919050565b61253d81612512565b82525050565b60006020820190506125586000830184612534565b92915050565b60008151905061256d81611d8a565b92915050565b60006020828403121561258957612588611c93565b5b60006125978482850161255e565b91505092915050565b6000815190506125af81611dc0565b92915050565b6000602082840312156125cb576125ca611c93565b5b60006125d9848285016125a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061261c82611db6565b915061262783611db6565b925082820190508082111561263f5761263e6125e2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061267f82611db6565b915061268a83611db6565b92508261269a57612699612645565b5b828204905092915050565b600081519050919050565b600081905092915050565b60005b838110156126d95780820151818401526020810190506126be565b60008484015250505050565b60006126f0826126a5565b6126fa81856126b0565b935061270a8185602086016126bb565b80840191505092915050565b600061272282846126e5565b915081905092915050565b600081519050919050565b600082825260208201905092915050565b60006127548261272d565b61275e8185612738565b935061276e8185602086016126bb565b61277781611df6565b840191505092915050565b6000602082019050818103600083015261279c8184612749565b905092915050565b6127ad81611db6565b82525050565b60006060820190506127c860008301866124c6565b6127d560208301856124c6565b6127e260408301846127a4565b949350505050565b7f4552524f5220434f4445205b305d000000000000000000000000000000000000600082015250565b6000612820600e83612738565b915061282b826127ea565b602082019050919050565b6000602082019050818103600083015261284f81612813565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b60006128a1826126a5565b6128ab8185612885565b93506128bb8185602086016126bb565b6128c481611df6565b840191505092915050565b60006080820190506128e460008301876124c6565b6128f160208301866127a4565b6128fe60408301856127a4565b81810360608301526129108184612896565b905095945050505050565b7f4e465420436f6e74726163742052657665727465640000000000000000000000600082015250565b6000612951601583612738565b915061295c8261291b565b602082019050919050565b6000602082019050818103600083015261298081612944565b9050919050565b50565b6000612997600083612885565b91506129a282612987565b600082019050919050565b600060a0820190506129c260008301876124c6565b6129cf60208301866124c6565b6129dc60408301856127a4565b6129e960608301846127a4565b81810360808301526129fa8161298a565b905095945050505050565b6000612a1082611db6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a4257612a416125e2565b5b60018201905091905056fea2646970667358221220ac368cb9fe52c0ef6f2b66df31a43e0b70895b0c5609bbaa315a8192dfb77a5c64736f6c63430008100033