LyorKw0KDQpDb3B5cmlnaHQgKGMpIDIwMDcsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCmFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0Kd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KTW9kdWxlIE5hbWU6DQoNCiAgRXh0ZW5kZWRTYWxMaWIuaA0KDQpBYnN0cmFjdDoNCg0KLS0qLw0KDQojaWZuZGVmIF9FWFRFTkRFRF9TQUxfTElCX0hfXw0KI2RlZmluZSBfRVhURU5ERURfU0FMX0xJQl9IX18NCg0KLyoqDQogIFJlZ2lzdGVyIEVTQUwgQ2xhc3MgYW5kIGl0J3MgYXNvY2lhdGVkIGdsb2JhbC4NCiAgDQogIFRoaXMgZnVuY3Rpb24gUmVnaXN0ZXJzIG9uZSBvciBtb3JlIEV4dGVuZGVkIFNBTCBzZXJ2aWNlcyBpbiBhIGdpdmVuDQogIGNsYXNzIGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgZ2xvYmFsIGNvbnRleHQuDQogIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgcHJpb3IgdG8gRXhpdEJvb3RTZXJ2aWNlcygpLg0KDQogIEBwYXJhbSAgQ2xhc3NHdWlkICAgICAgICAgICAgR1VJRCBvZiBmdW5jdGlvbiBjbGFzcw0KICBAcGFyYW0gIE1vZHVsZUdsb2JhbCAgICAgICAgIE1vZHVsZSBnbG9iYWwgZm9yIEZ1bmN0aW9uLg0KICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICBUaGUgRXh0ZW5kZWQgU0FMIHNlcnZpY2VzIHdlcmUgcmVnaXN0ZXJlZC4NCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICBUaGlzIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYWZ0ZXIgRXhpdEJvb3RTZXJ2aWNlcygpLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyBhdmFpbGFibGUgdG8gcmVnaXN0ZXIgb25lIG9yIG1vcmUgb2YgdGhlIHNwZWNpZmllZCBzZXJ2aWNlcy4NCiAgQHJldHZhbCBPdGhlciAgICAgICAgICAgICAgICBDbGFzc0d1aWQgY291bGQgbm90IGJlIGluc3RhbGxlZCBvbnRvIGEgbmV3IGhhbmRsZS4gIA0KDQoqKi8NCkVGSV9TVEFUVVMNCkVGSUFQSQ0KUmVnaXN0ZXJFc2FsQ2xhc3MgKA0KICBJTiAgQ09OU1QgRUZJX0dVSUQgICpDbGFzc0d1aWQsDQogIElOICBWT0lEICAgICAgICAgICAgKk1vZHVsZUdsb2JhbCwgIE9QVElPTkFMDQogIC4uLg0KICApDQo7DQoNCi8qKg0KICBDYWxscyBhbiBFeHRlbmRlZCBTQUwgQ2xhc3Mgc2VydmljZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBSZWdpc3RlckVzYWxDbGFzcygpLg0KICANCiAgVGhpcyBmdW5jdGlvbiBjYWxscyBhbiBFeHRlbmRlZCBTQUwgQ2xhc3Mgc2VydmljZSB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCBSZWdpc3RlckVzYWxDbGFzcygpLg0KDQogIEBwYXJhbSAgQ2xhc3NHdWlkICAgICAgR1VJRCBvZiBmdW5jdGlvbg0KICBAcGFyYW0gIEZ1bmN0aW9uSWQgICAgIEZ1bmN0aW9uIGluIENsYXNzR3VpZCB0byBjYWxsDQogIEBwYXJhbSAgQXJnMiAgICAgICAgICAgQXJndW1lbnQgMiBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnMyAgICAgICAgICAgQXJndW1lbnQgMyBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnNCAgICAgICAgICAgQXJndW1lbnQgNCBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnNSAgICAgICAgICAgQXJndW1lbnQgNSBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnNiAgICAgICAgICAgQXJndW1lbnQgNiBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnNyAgICAgICAgICAgQXJndW1lbnQgNyBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIEBwYXJhbSAgQXJnOCAgICAgICAgICAgQXJndW1lbnQgOCBDbGFzc0d1aWQvRnVuY3Rpb25JZCBkZWZpbmVkDQogIA0KICBAcmV0dmFsIEVGSV9TQUxfRVJST1IgIFRoZSBhZGRyZXNzIG9mIEV4dGVuZGVkU2FsUHJvYygpIGNhbiBub3QgYmUgZGV0ZXJtaW5lZA0KICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgY3VycmVudCBDUFUgZXhlY3V0aW9uIG1vZGUuDQogIEByZXR2YWwgT3RoZXIgICAgICAgICAgU2VlIHRoZSByZXR1cm4gc3RhdHVzIGZyb20gRXh0ZW5kZWRTYWxQcm9jKCkgaW4gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgRVhURU5ERURfU0FMX0JPT1RfU0VSVklDRV9QUk9UT0NPTC4gIA0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsQ2FsbCAoDQogIElOICBFRklfR1VJRCAgKkNsYXNzR3VpZCwNCiAgSU4gIFVJTlQ2NCAgICBGdW5jdGlvbklkLA0KICBJTiAgVUlOVDY0ICAgIEFyZzIsDQogIElOICBVSU5UNjQgICAgQXJnMywNCiAgSU4gIFVJTlQ2NCAgICBBcmc0LA0KICBJTiAgVUlOVDY0ICAgIEFyZzUsDQogIElOICBVSU5UNjQgICAgQXJnNiwNCiAgSU4gIFVJTlQ2NCAgICBBcmc3LA0KICBJTiAgVUlOVDY0ICAgIEFyZzgNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxTdGFsbEZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIFN0YWxsIFNlcnZpY2VzIENsYXNzLg0KICANCiAgVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIHRoZSBFc2FsU3RhbGxGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBTdGFsbCBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxTdGFsbEZ1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQogIEBwYXJhbSAgTWljcm9zZWNvbmRzICAgICAgICAgVGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgdG8gZGVsYXkuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxTdGFsbCAoDQogIElOIFVJTlROICBNaWNyb3NlY29uZHMNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxTZXROZXdQYWxFbnRyeUZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIFBBTCBTZXJ2aWNlcyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbFNldE5ld1BhbEVudHJ5RnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgUEFMIFNlcnZpY2VzIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbFNldE5ld1BhbEVudHJ5RnVuY3Rpb25JZCBpbiB0aGUgRXh0ZW5kZWQgU0FMIFNwZWNpZmljYXRpb24uDQoNCiAgQHBhcmFtICBQaHlpY2FsQWRkcmVzcyAgICAgICAgIElmIFRSVUUsIHRoZW4gUGFsRW50cnlQb2ludCBpcyBhIHBoeXNpY2FsIGFkZHJlc3MuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBGQUxTRSwgdGhlbiBQYWxFbnRyeVBvaW50IGlzIGEgdmlydHVhbCBhZGRyZXNzLg0KICBAcGFyYW0gIFBhbEVudHJ5UG9pbnQgICAgICAgICAgVGhlIFBBTCBFbnRyeSBQb2ludCBiZWluZyBzZXQuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxTZXROZXdQYWxFbnRyeSAoDQogIElOIEJPT0xFQU4gIFBoeXNpY2FsQWRkcmVzcywNCiAgSU4gVUlOVDY0ICAgUGFsRW50cnlQb2ludA0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbEdldFN0YXRlQnVmZmVyRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgUEFMIFNlcnZpY2VzIFNlcnZpY2VzIENsYXNzLg0KICANCiAgVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIHRoZSBFc2FsR2V0U3RhdGVCdWZmZXJGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBQQUwgU2VydmljZXMgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsR2V0U3RhdGVCdWZmZXJGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIFBoeWljYWxBZGRyZXNzICAgICAgICAgSWYgVFJVRSwgdGhlbiBQYWxFbnRyeVBvaW50IGlzIGEgcGh5c2ljYWwgYWRkcmVzcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEZBTFNFLCB0aGVuIFBhbEVudHJ5UG9pbnQgaXMgYSB2aXJ0dWFsIGFkZHJlc3MuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxHZXROZXdQYWxFbnRyeSAoDQogIElOIEJPT0xFQU4gIFBoeXNpY2FsQWRkcmVzcw0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbEdldFN0YXRlQnVmZmVyRnVuY3Rpb25JZCAgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxHZXRTdGF0ZUJ1ZmZlckZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsR2V0U3RhdGVCdWZmZXJGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIE1jYVR5cGUgICAgICAgICBTZWUgdHlwZSBwYXJhbWV0ZXIgaW4gdGhlIFNBTCBQcm9jZWR1cmUgU0FMX0dFVF9TVEFURV9JTkZPLg0KICBAcGFyYW0gIE1jYUJ1ZmZlciAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmV0dXJuZWQgYnVmZmVyLiBDb3BpZWQgZnJvbSBTQUxfUkVUVVJOX1JFR1MucjkuDQogIEBwYXJhbSAgQnVmZmVyU2l6ZSAgICAgIEEgcG9pbnRlciB0byB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSByZXR1cm5lZCBidWZmZXIuICBDb3BpZWQgZnJvbSBTQUxfUkVUVVJOX1JFR1MucjEwLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsR2V0U3RhdGVCdWZmZXIgKA0KICBJTiAgVUlOVDY0ICBNY2FUeXBlLA0KICBPVVQgVUlOVDggICAqKk1jYUJ1ZmZlciwNCiAgT1VUIFVJTlROICAgKkJ1ZmZlclNpemUNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxTYXZlU3RhdGVCdWZmZXJGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTCBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLg0KICANCiAgVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIHRoZSBFc2FsU2F2ZVN0YXRlQnVmZmVyRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxTYXZlU3RhdGVCdWZmZXJGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIE1jYVR5cGUgICAgICAgICBTZWUgdHlwZSBwYXJhbWV0ZXIgaW4gdGhlIFNBTCBQcm9jZWR1cmUgU0FMX0dFVF9TVEFURV9JTkZPLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsU2F2ZVN0YXRlQnVmZmVyICgNCiAgSU4gIFVJTlQ2NCAgTWNhVHlwZQ0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbEdldFZlY3RvcnNGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTCBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLg0KICANCiAgVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIHRoZSBFc2FsR2V0VmVjdG9yc0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsR2V0VmVjdG9yc0Z1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQogIEBwYXJhbSAgVmVjdG9yVHlwZSAgICAgICAgIFRoZSB2ZWN0b3IgdHlwZSB0byByZXRyaWV2ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCCoQyBNQ0EsIDEgLSBCU1AgSU5JVCwgMiCoQyBCT09UX1JFTkRFWiwgMyCoQyBBUCBJTklULg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsR2V0VmVjdG9ycyAoDQogIElOICBVSU5UNjQgIFZlY3RvclR5cGUNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxNY0dldFBhcmFtc0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxNY0dldFBhcmFtc0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsTWNHZXRQYXJhbXNGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIFBhcmFtSW5mb1R5cGUgICAgICAgICBUaGUgcGFyYW1ldGVyIHR5cGUgdG8gcmV0cmlldmUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgqEMgcmVuZGV6dm91cyBpbnRlcnJ1cHQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiCoQyB3YWtlIHVwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgqEMgQ29ycmVjdGVkIFBsYXRmb3JtIEVycm9yIFZlY3Rvci4NCg0KKiovDQpTQUxfUkVUVVJOX1JFR1MNCkVGSUFQSQ0KRXNhbE1jR2V0UGFyYW1zICgNCiAgSU4gIFVJTlQ2NCAgUGFyYW1JbmZvVHlwZQ0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbE1jR2V0UGFyYW1zRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbE1jR2V0UGFyYW1zRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxNY0dldFBhcmFtc0Z1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsTWNHZXRNY1BhcmFtcyAoDQogIFZPSUQNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxHZXRNY0NoZWNraW5GbGFnc0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxHZXRNY0NoZWNraW5GbGFnc0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsR2V0TWNDaGVja2luRmxhZ3NGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIENwdUluZGV4ICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBDUFUgaW4gdGhlIHNldCBvZiBlbmFibGVkIENQVXMgdG8gY2hlY2suDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxHZXRNY0NoZWNraW5GbGFncyAoDQogIElOICBVSU5UNjQgIENwdUluZGV4DQogICkNCjsNCg0KLyoqDQogIFdyYXBwZXIgZm9yIHRoZSBFc2FsQWRkQ3B1RGF0YUZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxBZGRDcHVEYXRhRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxBZGRDcHVEYXRhRnVuY3Rpb25JZCBpbiB0aGUgRXh0ZW5kZWQgU0FMIFNwZWNpZmljYXRpb24uDQoNCiAgQHBhcmFtICBDcHVHbG9iYWxJZCAgICAgICAgIFRoZSBHbG9iYWwgSUQgZm9yIHRoZSBDUFUgYmVpbmcgYWRkZWQuDQogIEBwYXJhbSAgRW5hYmxlZCAgICAgICAgICAgICBUaGUgZW5hYmxlIGZsYWcgZm9yIHRoZSBDUFUgYmVpbmcgYWRkZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIG1lYW5zIHRoZSBDUFUgaXMgZW5hYmxlZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG1lYW5zIHRoZSBDUFUgaXMgZGlzYWJsZWQuDQogIEBwYXJhbSAgUGFsQ29tcGF0aWJpbGl0eSAgICBUaGUgUEFMIENvbXBhdGliaWxpdHkgdmFsdWUgZm9yIHRoZSBDUFUgYmVpbmcgYWRkZWQuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxBZGRDcHVEYXRhICgNCiAgSU4gVUlOVDY0ICAgQ3B1R2xvYmFsSWQsDQogIElOIEJPT0xFQU4gIEVuYWJsZWQsDQogIElOIFVJTlQ2NCAgIFBhbENvbXBhdGliaWxpdHkNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxSZW1vdmVDcHVEYXRhRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbFJlbW92ZUNwdURhdGFGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbFJlbW92ZUNwdURhdGFGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIENwdUdsb2JhbElkICAgICAgICAgVGhlIEdsb2JhbCBJRCBmb3IgdGhlIENQVSBiZWluZyByZW1vdmVkLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsUmVtb3ZlQ3B1RGF0YSAoDQogIElOIFVJTlQ2NCAgQ3B1R2xvYmFsSWQNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxNb2RpZnlDcHVEYXRhRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbE1vZGlmeUNwdURhdGFGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbE1vZGlmeUNwdURhdGFGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIENwdUdsb2JhbElkICAgICAgICAgVGhlIEdsb2JhbCBJRCBmb3IgdGhlIENQVSBiZWluZyBtb2RpZmllZC4NCiAgQHBhcmFtICBFbmFibGVkICAgICAgICAgICAgIFRoZSBlbmFibGUgZmxhZyBmb3IgdGhlIENQVSBiZWluZyBtb2RpZmllZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgbWVhbnMgdGhlIENQVSBpcyBlbmFibGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgbWVhbnMgdGhlIENQVSBpcyBkaXNhYmxlZC4NCiAgQHBhcmFtICBQYWxDb21wYXRpYmlsaXR5ICAgIFRoZSBQQUwgQ29tcGF0aWJpbGl0eSB2YWx1ZSBmb3IgdGhlIENQVSBiZWluZyBtb2RpZmllZC4NCg0KKiovDQpTQUxfUkVUVVJOX1JFR1MNCkVGSUFQSQ0KRXNhbE1vZGlmeUNwdURhdGEgKA0KICBJTiBVSU5UNjQgICBDcHVHbG9iYWxJZCwNCiAgSU4gQk9PTEVBTiAgRW5hYmxlZCwNCiAgSU4gVUlOVDY0ICAgUGFsQ29tcGF0aWJpbGl0eQ0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbEdldENwdURhdGFCeUlkRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbEdldENwdURhdGFCeUlkRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxHZXRDcHVEYXRhQnlJZEZ1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQogIEBwYXJhbSAgQ3B1R2xvYmFsSWQgICAgICAgICBUaGUgR2xvYmFsIElEIGZvciB0aGUgQ1BVIGJlaW5nIGxvb2tlZCB1cC4NCiAgQHBhcmFtICBJbmRleEJ5RW5hYmxlZENwdSAgIElmIFRSVUUsIHRoZW4gdGhlIGluZGV4IGluIHRoZSBzZXQgb2YgZW5hYmxlZCBDUFVzIGluIHRoZSBkYXRhYmFzZSBpcyByZXR1cm5lZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIEZBTFNFLCB0aGVuIHRoZSBpbmRleCBpbiB0aGUgc2V0IG9mIGFsbCBDUFVzIGluIHRoZSBkYXRhYmFzZSBpcyByZXR1cm5lZC4NCg0KKiovDQpTQUxfUkVUVVJOX1JFR1MNCkVGSUFQSQ0KRXNhbEdldENwdURhdGFCeUlkICgNCiAgSU4gVUlOVDY0ICAgQ3B1R2xvYmFsSWQsDQogIElOIEJPT0xFQU4gIEluZGV4QnlFbmFibGVkQ3B1DQogICkNCjsNCg0KLyoqDQogIFdyYXBwZXIgZm9yIHRoZSBFc2FsR2V0Q3B1RGF0YUJ5SW5kZXhGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTCBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLg0KICANCiAgVGhpcyBmdW5jdGlvbiBpcyBhIHdyYXBwZXIgZm9yIHRoZSBFc2FsR2V0Q3B1RGF0YUJ5SW5kZXhGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbEdldENwdURhdGFCeUluZGV4RnVuY3Rpb25JZCBpbiB0aGUgRXh0ZW5kZWQgU0FMIFNwZWNpZmljYXRpb24uDQoNCiAgQHBhcmFtICBJbmRleCAgICAgICAgICAgICAgIFRoZSBHbG9iYWwgSUQgZm9yIHRoZSBDUFUgYmVpbmcgbW9kaWZpZWQuDQogIEBwYXJhbSAgSW5kZXhCeUVuYWJsZWRDcHUgICBJZiBUUlVFLCB0aGVuIHRoZSBpbmRleCBpbiB0aGUgc2V0IG9mIGVuYWJsZWQgQ1BVcyBpbiB0aGUgZGF0YWJhc2UgaXMgcmV0dXJuZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBGQUxTRSwgdGhlbiB0aGUgaW5kZXggaW4gdGhlIHNldCBvZiBhbGwgQ1BVcyBpbiB0aGUgZGF0YWJhc2UgaXMgcmV0dXJuZWQuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxHZXRDcHVEYXRhQnlJbmRleCAoDQogIElOIFVJTlQ2NCAgIEluZGV4LA0KICBJTiBCT09MRUFOICBJbmRleEJ5RW5hYmxlZENwdQ0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbFdob0FtSUZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxXaG9BbUlGdW5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbFdob0FtSUZ1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQogIEBwYXJhbSAgSW5kZXhCeUVuYWJsZWRDcHUgICBJZiBUUlVFLCB0aGVuIHRoZSBpbmRleCBpbiB0aGUgc2V0IG9mIGVuYWJsZWQgQ1BVcyBpbiB0aGUgZGF0YWJhc2UgaXMgcmV0dXJuZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBGQUxTRSwgdGhlbiB0aGUgaW5kZXggaW4gdGhlIHNldCBvZiBhbGwgQ1BVcyBpbiB0aGUgZGF0YWJhc2UgaXMgcmV0dXJuZWQuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxXaG9BbUkgKA0KICBJTiBCT09MRUFOICBJbmRleEJ5RW5hYmxlZENwdQ0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbE51bVByb2Nlc3NvcnMgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxOdW1Qcm9jZXNzb3JzIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbE51bVByb2Nlc3NvcnMgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsTnVtUHJvY2Vzc29ycyAoDQogIFZPSUQNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxTZXRNaW5TdGF0ZUZuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbFNldE1pblN0YXRlRm5jdGlvbklkIHNlcnZpY2UgaW4gdGhlIEV4dGVuZGVkIFNBTA0KICBNQ0EgTG9nIFNlcnZpY2VzIENsYXNzLiBTZWUgRXNhbFNldE1pblN0YXRlRm5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIENwdUdsb2JhbElkICAgICAgIFRoZSBHbG9iYWwgSUQgZm9yIHRoZSBDUFUgd2hvc2UgTUlOU1RBVEUgcG9pbnRlciBpcyBiZWluZyBzZXQuDQogIEBwYXJhbSAgTWluU3RhdGVQb2ludGVyICAgVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1JTlNUQVRFIGJ1ZmZlciBmb3IgdGhlIENQVSBzcGVjaWZpZWQgYnkgQ3B1R2xvYmFsSWQuDQoNCioqLw0KU0FMX1JFVFVSTl9SRUdTDQpFRklBUEkNCkVzYWxTZXRNaW5TdGF0ZSAoDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICBDcHVHbG9iYWxJZCwNCiAgSU4gRUZJX1BIWVNJQ0FMX0FERFJFU1MgIE1pblN0YXRlUG9pbnRlcg0KICApDQo7DQoNCi8qKg0KICBXcmFwcGVyIGZvciB0aGUgRXNhbEdldE1pblN0YXRlRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbEdldE1pblN0YXRlRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwNCiAgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4gU2VlIEVzYWxHZXRNaW5TdGF0ZUZ1bmN0aW9uSWQgaW4gdGhlIEV4dGVuZGVkIFNBTCBTcGVjaWZpY2F0aW9uLg0KDQogIEBwYXJhbSAgQ3B1R2xvYmFsSWQgICBUaGUgR2xvYmFsIElEIGZvciB0aGUgQ1BVIHdob3NlIE1JTlNUQVRFIHBvaW50ZXIgaXMgYmVpbmcgcmV0cmlldmVkLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsR2V0TWluU3RhdGUgKA0KICBJTiBVSU5UNjQgIENwdUdsb2JhbElkDQogICkNCjsNCg0KLyoqDQogIFdyYXBwZXIgZm9yIHRoZSBFc2FsTWNzR2V0U3RhdGVJbmZvRnVuY3Rpb25JZCBzZXJ2aWNlIGluIHRoZSBFeHRlbmRlZCBTQUwgTUNBIExvZyBTZXJ2aWNlcyBDbGFzcy4NCiAgDQogIFRoaXMgZnVuY3Rpb24gaXMgYSB3cmFwcGVyIGZvciB0aGUgRXNhbE1jc0dldFN0YXRlSW5mb0Z1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsTWNzR2V0U3RhdGVJbmZvRnVuY3Rpb25JZCBpbiB0aGUgRXh0ZW5kZWQgU0FMIFNwZWNpZmljYXRpb24uDQoNCiAgQHBhcmFtICBDcHVHbG9iYWxJZCAgICAgICAgICAgICAgIFRoZSBHbG9iYWwgSUQgZm9yIHRoZSBDUFUgd2hvc2UgTUNBIHN0YXRlIGJ1ZmZlciBpcyBiZWluZyByZXRyaWV2ZWQuDQogIEBwYXJhbSAgU3RhdGVCdWZmZXJQb2ludGVyICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHJldHVybmVkIE1DQSBzdGF0ZSBidWZmZXIuDQogIEBwYXJhbSAgUmVxdWlyZWRTdGF0ZUJ1ZmZlclNpemUgICBBIHBvaW50ZXIgdG8gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgcmV0dXJuZWQgTUNBIHN0YXRlIGJ1ZmZlci4NCg0KKiovDQpTQUxfUkVUVVJOX1JFR1MNCkVGSUFQSQ0KRXNhbE1jYUdldFN0YXRlSW5mbyAoDQogIElOICBVSU5UNjQgICAgICAgICAgICAgICAgQ3B1R2xvYmFsSWQsDQogIE9VVCBFRklfUEhZU0lDQUxfQUREUkVTUyAgKlN0YXRlQnVmZmVyUG9pbnRlciwNCiAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAqUmVxdWlyZWRTdGF0ZUJ1ZmZlclNpemUNCiAgKQ0KOw0KDQovKioNCiAgV3JhcHBlciBmb3IgdGhlIEVzYWxNY2FSZWdpc3RlckNwdUZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuDQogIA0KICBUaGlzIGZ1bmN0aW9uIGlzIGEgd3JhcHBlciBmb3IgdGhlIEVzYWxNY2FSZWdpc3RlckNwdUZ1bmN0aW9uSWQgc2VydmljZSBpbiB0aGUgRXh0ZW5kZWQgU0FMDQogIE1DQSBMb2cgU2VydmljZXMgQ2xhc3MuIFNlZSBFc2FsTWNhUmVnaXN0ZXJDcHVGdW5jdGlvbklkIGluIHRoZSBFeHRlbmRlZCBTQUwgU3BlY2lmaWNhdGlvbi4NCg0KICBAcGFyYW0gIENwdUdsb2JhbElkICAgICAgICAgIFRoZSBHbG9iYWwgSUQgZm9yIHRoZSBDUFUgd2hvc2UgTUNBIHN0YXRlIGJ1ZmZlciBpcyBiZWluZyBzZXQuDQogIEBwYXJhbSAgU3RhdGVCdWZmZXJQb2ludGVyICAgQSBwb2ludGVyIHRvIHRoZSBNQ0Egc3RhdGUgYnVmZmVyLg0KDQoqKi8NClNBTF9SRVRVUk5fUkVHUw0KRUZJQVBJDQpFc2FsTWNhUmVnaXN0ZXJDcHUgKA0KICBJTiBVSU5UNjQgICAgICAgICAgICAgICAgQ3B1R2xvYmFsSWQsDQogIElOIEVGSV9QSFlTSUNBTF9BRERSRVNTICBTdGF0ZUJ1ZmZlclBvaW50ZXINCiAgKQ0KOw0KDQojZW5kaWYNCg==