0x608060405234801561001057600080fd5b50612ab3806100206000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063ada11457116100c3578063d22158fa1161007c578063d22158fa146103c5578063ecc1f083146103f5578063f50b2efe14610425578063f90c492414610441578063fba031581461045f578063fd1f4bef1461047d5761014d565b8063ada1145714610304578063b0f106b014610320578063b1fcc5cf1461033f578063b24ebfcc1461035b578063c14c92041461038b578063d149c0d7146103a75761014d565b80636dafaf6a116101155780636dafaf6a146102305780637a02bdf1146102605780638129fc1c1461027e57806395262d9f14610288578063971b9c03146102b8578063a8b940e6146102e85761014d565b80631b2758ee146101525780633ce142f514610170578063429989f0146101a057806344e02982146101d05780636668316a14610200575b600080fd5b61015a61049b565b6040516101679190611fc8565b60405180910390f35b61018a60048036038101906101859190612055565b6104c3565b604051610197919061209e565b60405180910390f35b6101ba60048036038101906101b59190612055565b6104d5565b6040516101c7919061209e565b60405180910390f35b6101ea60048036038101906101e591906120ef565b610b59565b6040516101f79190611fc8565b60405180910390f35b61021a600480360381019061021591906120ef565b610b85565b6040516102279190611fc8565b60405180910390f35b61024a600480360381019061024591906120ef565b610b9d565b6040516102579190611fc8565b60405180910390f35b610268610c37565b6040516102759190611fc8565b60405180910390f35b610286610c5e565b005b6102a2600480360381019061029d9190612055565b610d94565b6040516102af919061209e565b60405180910390f35b6102d260048036038101906102cd9190612275565b610da6565b6040516102df919061237c565b60405180910390f35b61030260048036038101906102fd9190612055565b610e2c565b005b61031e600480360381019061031991906123ca565b610e2f565b005b610328610e44565b604051610336929190612422565b60405180910390f35b6103596004803603810190610354919061244b565b610e5f565b005b6103756004803603810190610370919061254e565b610ea8565b6040516103829190611fc8565b60405180910390f35b6103a560048036038101906103a091906123ca565b610eba565b005b6103af610f05565b6040516103bc9190611fc8565b60405180910390f35b6103df60048036038101906103da9190612055565b610f0e565b6040516103ec919061209e565b60405180910390f35b61040f600480360381019061040a9190612275565b610fa4565b60405161041c919061237c565b60405180910390f35b61043f600480360381019061043a91906123ca565b611059565b005b6104496110e5565b604051610456919061209e565b60405180910390f35b6104676110ee565b6040516104749190612655565b60405180910390f35b610485611180565b6040516104929190611fc8565b60405180910390f35b60006104a5610e44565b9050806fffffffffffffffffffffffffffffffff1690508091505090565b60006104ce82610d94565b9050919050565b600073f39fd6e51aad88f6f4ce6ab8827279cfffb9226673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105275760009050610b54565b7370997970c51812dc3a010c7d01b50e0d17dc79c873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105775760019050610b54565b733c44cdddb6a900fa2b585dd299e03d12fa4293bc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105c75760029050610b54565b7390f79bf6eb2c4f870365e785982e1f101e93b90673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106175760039050610b54565b7315d34aaf54267db7d7c367839aaf71a00a2c6a6573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106675760049050610b54565b739965507d1a55bcc2695c58ba16fb37d819b0a4dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106b75760059050610b54565b73976ea74026e726554db657fa54763abd0c3a0aa973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107075760069050610b54565b7314dc79964da2c08b23698b3d3cc7ca32193d995573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107575760079050610b54565b7323618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107a75760089050610b54565b73a0ee7a142d267c1f36714e4a8f75612f20a7972073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107f75760099050610b54565b73bcd4042de499d14e55001ccbb24a551f3b95409673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361084757600a9050610b54565b7371be63f3384f5fb98995898a86b02fb2426c578873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361089757600b9050610b54565b73fabb0ac9d68b0b445fb7357272ff202c5651694a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108e757600c9050610b54565b731cbd3b2770909d4e10f157cabc84c7264073c9ec73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361093757600d9050610b54565b73df3e18d64bc6a983f673ab319ccae4f1a57c709773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361098757600e9050610b54565b73cd3b766ccdd6ae721141f452c550ca635964ce7173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109d757600f9050610b54565b732546bcd3c84621e976d8185a91a922ae77ecec3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a275760109050610b54565b73bda5747bfd65f08deb54cb465eb87d40e51b197e73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610a775760119050610b54565b73dd2fd4581271e230360230f9337d5c0430bf44c073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ac75760129050610b54565b738626f6940e2eb28930efb4cef49b2d1f2c9c119973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b175760139050610b54565b816040517fec459bc0000000000000000000000000000000000000000000000000000000008152600401610b4b9190612686565b60405180910390fd5b919050565b6000610b6482610b9d565b506000610b7083610b85565b9050610b7c8382610e5f565b80915050919050565b600080610b91836111a9565b90508054915050919050565b600080610ba86110ee565b905060005b8151811015610bf45783828281518110610bca57610bc96126a1565b5b602002602001015103610be1578092505050610c32565b8080610bec906126ff565b915050610bad565b50826040517f93829403000000000000000000000000000000000000000000000000000000008152600401610c299190612756565b60405180910390fd5b919050565b6000610c41610e44565b816fffffffffffffffffffffffffffffffff169150508091505090565b60008060019054906101000a900460ff16159050808015610c8f5750600160008054906101000a900460ff1660ff16105b80610cbc5750610c9e306111fe565b158015610cbb5750600160008054906101000a900460ff1660ff16145b5b610cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf2906127f4565b60405180910390fd5b60016000806101000a81548160ff021916908360ff1602179055508015610d38576001600060016101000a81548160ff0219169083151502179055505b8015610d915760008060016101000a81548160ff0219169083151502179055507f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024986001604051610d889190612859565b60405180910390a15b50565b6000610d9f82610f0e565b9050919050565b60606000610db383610fa4565b905060005b8351811015610e22576000848281518110610dd657610dd56126a1565b5b60200260200101519050610de981610b9d565b50610e0e81848481518110610e0157610e006126a1565b5b6020026020010151610e5f565b508080610e1a906126ff565b915050610db8565b5080915050919050565b50565b610e3881611221565b610e4181611277565b50565b600080610e57610e52611180565b611341565b915091509091565b60008103610ea457816040517f0565ce2a000000000000000000000000000000000000000000000000000000008152600401610e9b9190612756565b60405180910390fd5b5050565b6000610eb382611353565b9050919050565b610ec333610e2c565b610ecb611365565b610ed481610e2f565b610edd816113db565b6000610ee76110ee565b90506000610ef482611427565b9050610f008282611439565b505050565b60006003905090565b6000738626f6940e2eb28930efb4cef49b2d1f2c9c119973ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f9457816040517fec459bc0000000000000000000000000000000000000000000000000000000008152600401610f8b9190612686565b60405180910390fd5b610f9d826104d5565b9050919050565b6060815167ffffffffffffffff811115610fc157610fc0612132565b5b604051908082528060200260200182016040528015610fef5781602001602082028036833780820191505090505b50905060005b825181101561105357611021838281518110611014576110136126a1565b5b6020026020010151610b85565b828281518110611034576110336126a1565b5b602002602001018181525050808061104b906126ff565b915050610ff5565b50919050565b600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1603156110e2576000611098610c37565b90508082146110e05780826040517f6bc11ec50000000000000000000000000000000000000000000000000000000081526004016110d7929190612874565b60405180910390fd5b505b50565b60006002905090565b6060600167ffffffffffffffff81111561110b5761110a612132565b5b6040519080825280602002602001820160405280156111395781602001602082028036833780820191505090505b5090507f425443000000000000000000000000000000000000000000000000000000000081600081518110611171576111706126a1565b5b60200260200101818152505090565b60007f3d01e4d77237ea0f771f1786da4d4ff757fcba6a92933aa53b1dcef2d6bd6fe254905090565b6000817f4dd0c77efa6f6d590c97573d8c70b714546e7311202ff7c11c484cc841d91bfc60001b6040516020016111e192919061289d565b604051602081830303815290604052805190602001209050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061122b610c37565b90508082116112735781816040517fef05deba00000000000000000000000000000000000000000000000000000000815260040161126a929190612874565b60405180910390fd5b5050565b60006103e88261128791906128f5565b9050804210156112e957603c428261129f9190612926565b11156112e45780426040517fb6b0916d0000000000000000000000000000000000000000000000000000000081526004016112db929190612874565b60405180910390fd5b61133d565b60b481426112f79190612926565b111561133c5780426040517f0321d0b5000000000000000000000000000000000000000000000000000000008152600401611333929190612874565b60405180910390fd5b5b5050565b600080608083901c9150829050915091565b600061135e826114a1565b9050919050565b6000429050600061137461049b565b90506000611380610f05565b9050808261138e919061295a565b8310156113d6578282826040517f83b3f5c40000000000000000000000000000000000000000000000000000000081526004016113cd9392919061298e565b60405180910390fd5b505050565b60004290506113ea8183611412565b807f3d01e4d77237ea0f771f1786da4d4ff757fcba6a92933aa53b1dcef2d6bd6fe255611422565b6000828260801b17905092915050565b505050565b606061143282611595565b9050919050565b60005b825181101561149c57600083828151811061145a576114596126a1565b5b602002602001015190506114888184848151811061147b5761147a6126a1565b5b60200260200101516117a4565b508080611494906126ff565b91505061143c565b505050565b6000808251036114dd576040517f9e198af900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e6826117c3565b6000600283516114f691906128f5565b905060006002845161150891906129c5565b03611571576000611559846001846115209190612926565b81518110611531576115306126a1565b5b602002602001015185848151811061154c5761154b6126a1565b5b6020026020010151611816565b905060028161156891906128f5565b92505050611590565b828181518110611584576115836126a1565b5b60200260200101519150505b919050565b60606000825167ffffffffffffffff8111156115b4576115b3612132565b5b6040519080825280602002602001820160405280156115e25781602001602082028036833780820191505090505b5090506000835167ffffffffffffffff81111561160257611601612132565b5b6040519080825280602002602001820160405280156116305781602001602082028036833780820191505090505b5090506000845167ffffffffffffffff8111156116505761164f612132565b5b60405190808252806020026020018201604052801561168357816020015b606081526020019060019003908161166e5790505b50905060005b85518110156117165761169a6110e5565b60ff1667ffffffffffffffff8111156116b6576116b5612132565b5b6040519080825280602002602001820160405280156116e45781602001602082028036833780820191505090505b508282815181106116f8576116f76126a1565b5b6020026020010181905250808061170e906126ff565b915050611689565b50600061172161182c565b9050600061172e8261193d565b61ffff169050600282611741919061295a565b91506000604051905060005b8281101561178c5760006117648a89898989611999565b90508085611772919061295a565b945082604052508080611784906126ff565b91505061174d565b506117978487611c91565b9650505050505050919050565b6117ae8282610e5f565b60006117b9836111a9565b9050818155505050565b805160208201602082028101815b8181101561180f57825b818110156118035781518151808210156117f6578084528183525b50506020810190506117db565b506020810190506117d1565b5050505050565b60008183611824919061295a565b905092915050565b60008060203603356602ed57011e000081166602ed57011e00001491505080611881576040517fe7764c9e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080369050602911156118c1576040517f5796f78a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602936033590506000600960038362ffffff166118de919061295a565b6118e8919061295a565b905060003690506002826118fc919061295a565b1115611934576040517fc30a7bd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80935050505090565b60008060208361194d919061295a565b9050600036905081111561198d576040517f5796f78a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80360335915050919050565b6000806000806119a885611dde565b91509150600080600060606000600d6119d66020886119c7919061295a565b89611e5490919063ffffffff16565b6119e0919061295a565b90506000611a0760688c6119f4919061295a565b6000369050611e6a90919063ffffffff16565b90506000611a398360418e611a1c919061295a565b611a26919061295a565b6000369050611e6a90919063ffffffff16565b9050611a458382611a73565b9350826020850120945081359650611a8f565b60006040519050818152602081019050818101604052919050565b6000611a7e83611a58565b838382376020810391505092915050565b611aa08765ffffffffffff16611059565b611ab68560418e611ab1919061295a565b611e80565b9550611ac1866104c3565b60ff1699505050505050505060008060005b84811015611c5c57611ae6888583611eff565b809350819450505060005b8c51811015611c48578c8181518110611b0d57611b0c6126a1565b5b60200260200101518403611c355760008b8281518110611b3057611b2f6126a1565b5b60200260200101519050611b448189611f85565b158015611b745750611b546110e5565b60ff168d8381518110611b6a57611b696126a1565b5b6020026020010151105b15611c2f578c8281518110611b8c57611b8b6126a1565b5b602002602001018051809190611ba1906126ff565b81525050838b8381518110611bb957611bb86126a1565b5b602002602001015160018f8581518110611bd657611bd56126a1565b5b6020026020010151611be89190612926565b81518110611bf957611bf86126a1565b5b602002602001018181525050611c0f8189611f9e565b8c8381518110611c2257611c216126a1565b5b6020026020010181815250505b50611c48565b8080611c40906126ff565b915050611af1565b508080611c54906126ff565b915050611ad3565b50505081602082611c6d919061295a565b611c7791906129f6565b604e611c83919061295a565b935050505095945050505050565b60606000835167ffffffffffffffff811115611cb057611caf612132565b5b604051908082528060200260200182016040528015611cde5781602001602082028036833780820191505090505b5090506000611ceb6110e5565b60ff16905060005b8551811015611dd25781858281518110611d1057611d0f6126a1565b5b60200260200101511015611d7757848181518110611d3157611d306126a1565b5b6020026020010151826040517f2b13aef5000000000000000000000000000000000000000000000000000000008152600401611d6e929190612874565b60405180910390fd5b6000611d9c878381518110611d8f57611d8e6126a1565b5b6020026020010151610ea8565b905080848381518110611db257611db16126a1565b5b602002602001018181525050508080611dca906126ff565b915050611cf3565b50819250505092915050565b6000806000806000604186611df3919061295a565b90506000611e1a602083611e07919061295a565b6000369050611e6a90919063ffffffff16565b905080359350611e34600382611e6a90919063ffffffff16565b9050803592508362ffffff1695508263ffffffff16945050505050915091565b60008183611e6291906129f6565b905092915050565b60008183611e789190612926565b905092915050565b6000806000808436038035935060208101905080359250602081019050803560001a91505060018682858560405160008152602001604052604051611ec89493929190612a38565b6020604051602081039080840390855afa158015611eea573d6000803e3d6000fd5b50505060206040510351935050505092915050565b6000806000604e86611f11919061295a565b90506000611f52611f43602088611f28919061295a565b876001611f35919061295a565b611e5490919063ffffffff16565b8361181690919063ffffffff16565b90506000611f6d826000369050611e6a90919063ffffffff16565b90508035945060208101359350505050935093915050565b600080826001901b841690506000811191505092915050565b6000816001901b8317905092915050565b6000819050919050565b611fc281611faf565b82525050565b6000602082019050611fdd6000830184611fb9565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061202282611ff7565b9050919050565b61203281612017565b811461203d57600080fd5b50565b60008135905061204f81612029565b92915050565b60006020828403121561206b5761206a611fed565b5b600061207984828501612040565b91505092915050565b600060ff82169050919050565b61209881612082565b82525050565b60006020820190506120b3600083018461208f565b92915050565b6000819050919050565b6120cc816120b9565b81146120d757600080fd5b50565b6000813590506120e9816120c3565b92915050565b60006020828403121561210557612104611fed565b5b6000612113848285016120da565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61216a82612121565b810181811067ffffffffffffffff8211171561218957612188612132565b5b80604052505050565b600061219c611fe3565b90506121a88282612161565b919050565b600067ffffffffffffffff8211156121c8576121c7612132565b5b602082029050602081019050919050565b600080fd5b60006121f16121ec846121ad565b612192565b90508083825260208201905060208402830185811115612214576122136121d9565b5b835b8181101561223d578061222988826120da565b845260208401935050602081019050612216565b5050509392505050565b600082601f83011261225c5761225b61211c565b5b813561226c8482602086016121de565b91505092915050565b60006020828403121561228b5761228a611fed565b5b600082013567ffffffffffffffff8111156122a9576122a8611ff2565b5b6122b584828501612247565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6122f381611faf565b82525050565b600061230583836122ea565b60208301905092915050565b6000602082019050919050565b6000612329826122be565b61233381856122c9565b935061233e836122da565b8060005b8381101561236f57815161235688826122f9565b975061236183612311565b925050600181019050612342565b5085935050505092915050565b60006020820190508181036000830152612396818461231e565b905092915050565b6123a781611faf565b81146123b257600080fd5b50565b6000813590506123c48161239e565b92915050565b6000602082840312156123e0576123df611fed565b5b60006123ee848285016123b5565b91505092915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61241c816123f7565b82525050565b60006040820190506124376000830185612413565b6124446020830184612413565b9392505050565b6000806040838503121561246257612461611fed565b5b6000612470858286016120da565b9250506020612481858286016123b5565b9150509250929050565b600067ffffffffffffffff8211156124a6576124a5612132565b5b602082029050602081019050919050565b60006124ca6124c58461248b565b612192565b905080838252602082019050602084028301858111156124ed576124ec6121d9565b5b835b81811015612516578061250288826123b5565b8452602084019350506020810190506124ef565b5050509392505050565b600082601f8301126125355761253461211c565b5b81356125458482602086016124b7565b91505092915050565b60006020828403121561256457612563611fed565b5b600082013567ffffffffffffffff81111561258257612581611ff2565b5b61258e84828501612520565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6125cc816120b9565b82525050565b60006125de83836125c3565b60208301905092915050565b6000602082019050919050565b600061260282612597565b61260c81856125a2565b9350612617836125b3565b8060005b8381101561264857815161262f88826125d2565b975061263a836125ea565b92505060018101905061261b565b5085935050505092915050565b6000602082019050818103600083015261266f81846125f7565b905092915050565b61268081612017565b82525050565b600060208201905061269b6000830184612677565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061270a82611faf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361273c5761273b6126d0565b5b600182019050919050565b612750816120b9565b82525050565b600060208201905061276b6000830184612747565b92915050565b600082825260208201905092915050565b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b60006127de602e83612771565b91506127e982612782565b604082019050919050565b6000602082019050818103600083015261280d816127d1565b9050919050565b6000819050919050565b6000819050919050565b600061284361283e61283984612814565b61281e565b612082565b9050919050565b61285381612828565b82525050565b600060208201905061286e600083018461284a565b92915050565b60006040820190506128896000830185611fb9565b6128966020830184611fb9565b9392505050565b60006040820190506128b26000830185612747565b6128bf6020830184612747565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061290082611faf565b915061290b83611faf565b92508261291b5761291a6128c6565b5b828204905092915050565b600061293182611faf565b915061293c83611faf565b9250828203905081811115612954576129536126d0565b5b92915050565b600061296582611faf565b915061297083611faf565b9250828201905080821115612988576129876126d0565b5b92915050565b60006060820190506129a36000830186611fb9565b6129b06020830185611fb9565b6129bd6040830184611fb9565b949350505050565b60006129d082611faf565b91506129db83611faf565b9250826129eb576129ea6128c6565b5b828206905092915050565b6000612a0182611faf565b9150612a0c83611faf565b9250828202612a1a81611faf565b91508282048414831517612a3157612a306126d0565b5b5092915050565b6000608082019050612a4d6000830187612747565b612a5a602083018661208f565b612a676040830185612747565b612a746060830184612747565b9594505050505056fea26469706673582212209db3fd3326eb4ec29845a01ea60617781ecc8ff9377e5f4d8311170f559dadee64736f6c63430008110033