608060405234801561001057600080fd5b50612ca8806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80635c8a9c45116100715780635c8a9c4514610210578063970466df14610248578063a10e63f014610252578063bc197c81146102c2578063f23a6e6114610458578063f8c8765e14610558576100b4565b806301ffc9a7146100b957806314d78ed91461011c578063322df2081461012657806351cecc80146101445780635216a4bc1461017c57806358077dfa146101e2575b600080fd5b610104600480360360208110156100cf57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506105fc565b60405180821515815260200191505060405180910390f35b610124610607565b005b61012e610955565b6040518082815260200191505060405180910390f35b61017a6004803603604081101561015a57600080fd5b810190808035906020019092919080359060200190929190505050610b16565b005b6101be6004803603602081101561019257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f1a565b60405180848152602001838152602001828152602001935050505060405180910390f35b61020e600480360360208110156101f857600080fd5b8101908080359060200190929190505050610f44565b005b6102466004803603604081101561022657600080fd5b8101908080359060200190929190803590602001909291905050506112dc565b005b6102506117d0565b005b61029e6004803603604081101561026857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c65565b60405180848152602001838152602001828152602001935050505060405180910390f35b610423600480360360a08110156102d857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561033557600080fd5b82018360208201111561034757600080fd5b8035906020019184602083028401116401000000008311171561036957600080fd5b90919293919293908035906020019064010000000081111561038a57600080fd5b82018360208201111561039c57600080fd5b803590602001918460208302840111640100000000831117156103be57600080fd5b9091929391929390803590602001906401000000008111156103df57600080fd5b8201836020820111156103f157600080fd5b8035906020019184600183028401116401000000008311171561041357600080fd5b9091929391929390505050611c9c565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b610523600480360360a081101561046e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190803590602001906401000000008111156104df57600080fd5b8201836020820111156104f157600080fd5b8035906020019184600183028401116401000000008311171561051357600080fd5b9091929391929390505050611cb4565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b6105fa6004803603608081101561056e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611cca565b005b600060019050919050565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414156106a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180612c4a6029913960400191505060405180910390fd5b6106ac33611ed8565b610791576106b933612117565b60005b6005811161078f576000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000015414610782576107293382612210565b42600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055505b80806001019150506106bc565b505b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061087d8160065461233e90919063ffffffff16565b600681905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561091657600080fd5b505af115801561092a573d6000803e3d6000fd5b505050506040513d602081101561094057600080fd5b81019080805190602001909291905050505050565b60008060009050600080600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015493506109ba828661238890919063ffffffff16565b945060005b60058111610a3f57600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600201549250610a30838761238890919063ffffffff16565b955080806001019150506109bf565b50610a4933611ed8565b158015610a9957506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414155b15610b0b57610aa733612410565b9250610abc838661238890919063ffffffff16565b945060005b60058111610b0957610ad3338261255c565b9150610afa82610aec858961238890919063ffffffff16565b61238890919063ffffffff16565b95508080600101915050610ac1565b505b849550505050505090565b60008210158015610b28575060048211155b610b9a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e4654204c6576656c20697320696e76616c696421000000000000000000000081525060200191505060405180910390fd5b60008111610c10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e742073686f756c6420626520626967676572207468616e2030210081525060200191505060405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a333085856040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020018060200182810382526000815260200160200195505050505050600060405180830381600087803b158015610cdd57600080fd5b505af1158015610cf1573d6000803e3d6000fd5b505050506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414610e0157610d4833611ed8565b15610d995742600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610e00565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001015414610dff57610dfe3383612210565b5b5b5b42600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010181905550610ebf81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206000015461238890919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600001819055505050565b60056020528060005260406000206000915090508060000154908060010154908060020154905083565b60008111610fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f416d6f756e742073686f756c6420626520626967676572207468616e2030210081525060200191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b8101908080519060200190929190505050506110b033611ed8565b6111dc576000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414156111d15760005b600581116111cb576000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010154146111be5742600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600101819055505b8080600101915050611102565b506111db565b6111da33612117565b5b5b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061127881600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461238890919063ffffffff16565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506112d38160065461238890919063ffffffff16565b60068190555050565b600082101580156112ee575060048211155b611360576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4e4654204c6576656c20697320696e76616c696421000000000000000000000081525060200191505060405180910390fd5b6000811180156113c35750600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600001548111155b611418576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180612bc26039913960400191505060405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541461146d5761146c3383612210565b5b6114d381600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206000015461233e90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600001819055506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206000015411156115e35742600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206001018190555061163d565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600101819055505b61164633611ed8565b156116e7576000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154146116e65761169e33612117565b42600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a303385856040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020018060200182810382526000815260200160200195505050505050600060405180830381600087803b1580156117b457600080fd5b505af11580156117c8573d6000803e3d6000fd5b505050505050565b6000806117dc33611ed8565b15801561182c57506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414155b156119c85760005b60058111611917576118463382612210565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008281526020019081526020016000206002015491506118af828461238890919063ffffffff16565b92506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055508080600101915050611834565b5061192133612117565b600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050611979818361238890919063ffffffff16565b91506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611b48565b60005b60058111611aa457600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828152602001908152602001600020600201549150611a3c828461238890919063ffffffff16565b92506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002018190555080806001019150506119cb565b50600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050611afd818361238890919063ffffffff16565b91506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b6000821115611c6157600060029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611c2457600080fd5b505af1158015611c38573d6000803e3d6000fd5b505050506040513d6020811015611c4e57600080fd5b8101908080519060200190929190505050505b5050565b6004602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b600063bc197c8160e01b905098975050505050505050565b600063f23a6e6160e01b90509695505050505050565b600060019054906101000a900460ff1680611ce95750611ce8612662565b5b80611cff575060008054906101000a900460ff16155b611d54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180612bfb602e913960400191505060405180910390fd5b60008060019054906101000a900460ff161590508015611da4576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600060068190555084600060026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015611ed15760008060016101000a81548160ff0219169083151502179055505b5050505050565b600080600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080815260200190815260200160002060010154148015611f9057506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006001815260200190815260200160002060010154145b8015611ff057506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002815260200190815260200160002060010154145b801561205057506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006003815260200190815260200160002060010154145b80156120b057506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006004815260200190815260200160002060010154145b801561211057506000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006005815260200190815260200160002060010154145b9050919050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050600061216983612410565b905061217e818361238890919063ffffffff16565b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555042600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550505050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206002015490506000612274848461255c565b9050612289818361238890919063ffffffff16565b600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206002018190555042600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000206001018190555050505050565b600061238083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612679565b905092915050565b600080828401905083811015612406576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600080600080600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154925061246783600654612739565b91506124be600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101544261233e90919063ffffffff16565b9050620151808111156124d2576201518090505b600061254e670de0b6b3a764000061254062015180612532866125246006546125168c6125088e8e6128d190919063ffffffff16565b6128d190919063ffffffff16565b61295790919063ffffffff16565b6128d190919063ffffffff16565b61295790919063ffffffff16565b61295790919063ffffffff16565b905080945050505050919050565b600080612568836129a1565b905060006125d2600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868152602001908152602001600020600101544261233e90919063ffffffff16565b90506000600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060000154905060006126538261264585876128d190919063ffffffff16565b6128d190919063ffffffff16565b90508094505050505092915050565b6000803090506000813b9050600081149250505090565b6000838311158290612726576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126eb5780820151818401526020810190506126d0565b50505050905090810190601f1680156127185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b60008060c8612751858561295790919063ffffffff16565b111561279257670de0b6b3a7640000905061278a610e1061277c600a8461295790919063ffffffff16565b61295790919063ffffffff16565b9150506128cb565b60646127a7858561295790919063ffffffff16565b11156127e857671bc16d674ec8000090506127e0610e106127d2600a8461295790919063ffffffff16565b61295790919063ffffffff16565b9150506128cb565b60146127fd858561295790919063ffffffff16565b111561283e57673782dace9d9000009050612836610e10612828600a8461295790919063ffffffff16565b61295790919063ffffffff16565b9150506128cb565b600a612853858561295790919063ffffffff16565b111561289457671bc16d674ec80000905061288c610e1061287e600a8461295790919063ffffffff16565b61295790919063ffffffff16565b9150506128cb565b670de0b6b3a764000090506128c7610e106128b9600a8461295790919063ffffffff16565b61295790919063ffffffff16565b9150505b92915050565b6000808314156128e45760009050612951565b60008284029050828482816128f557fe5b041461294c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612c296021913960400191505060405180910390fd5b809150505b92915050565b600061299983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612afb565b905092915050565b60008060008314156129e857673782dace9d90000090506129e0610e106129d2600a8461295790919063ffffffff16565b61295790919063ffffffff16565b915050612af6565b6001831415612a2c576753444835ec5800009050612a24610e10612a16600a8461295790919063ffffffff16565b61295790919063ffffffff16565b915050612af6565b6002831415612a5d57670de0b6b3a76400009050612a55610e108261295790919063ffffffff16565b915050612af6565b6003831415612aa15767d02ab486cedc00009050612a99610e10612a8b600a8461295790919063ffffffff16565b61295790919063ffffffff16565b915050612af6565b6004831415612ad257671bc16d674ec800009050612aca610e108261295790919063ffffffff16565b915050612af6565b6729a2241af62c00009050612af2610e108261295790919063ffffffff16565b9150505b919050565b60008083118290612ba7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612b6c578082015181840152602081019050612b51565b50505050905090810190601f168015612b995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612bb357fe5b04905080915050939250505056fe416d6f756e742073686f756c6420626520626967676572207468616e203020616e64206e6f7420626967676572207468616e206f776e656421496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754686973206163636f756e7420686173206e6f74207374616b6564204c5020546f6b656e2079657421a2646970667358221220f50835d68f7d615c30d517a9885f92a61d83d41eef847eb3ffd2346ced97b64064736f6c634300060c0033