LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9leHRpLmMNCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KICAqIEB2ZXJzaW9uIFYzLjQuMA0KICAqIEBkYXRlICAgIDEwLzE1LzIwMTANCiAgKiBAYnJpZWYgICBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBFWFRJIGZpcm13YXJlIGZ1bmN0aW9ucy4NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGNvcHkNCiAgKg0KICAqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KICAqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFDQogICogVElNRS4gQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWQ0KICAqIERJUkVDVCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcNCiAgKiBGUk9NIFRIRSBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFDQogICogQ09ESU5HIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVCAyMDEwIFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICovIA0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjEweF9leHRpLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRVhUSSANCiAgKiBAYnJpZWYgRVhUSSBkcml2ZXIgbW9kdWxlcw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgRVhUSV9Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9EZWZpbmVzDQogICogQHsNCiAgKi8NCg0KI2RlZmluZSBFWFRJX0xJTkVOT05FICAgICgodWludDMyX3QpMHgwMDAwMCkgIC8qIE5vIGludGVycnVwdCBzZWxlY3RlZCAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9NYWNyb3MNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9WYXJpYWJsZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIEVYVElfUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIERlaW5pdGlhbGl6ZXMgdGhlIEVYVEkgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEVYVElfRGVJbml0KHZvaWQpDQp7DQogIEVYVEktPklNUiA9IDB4MDAwMDAwMDA7DQogIEVYVEktPkVNUiA9IDB4MDAwMDAwMDA7DQogIEVYVEktPlJUU1IgPSAweDAwMDAwMDAwOyANCiAgRVhUSS0+RlRTUiA9IDB4MDAwMDAwMDA7IA0KICBFWFRJLT5QUiA9IDB4MDAwRkZGRkY7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIEVYVEkgcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KICAqICAgcGFyYW1ldGVycyBpbiB0aGUgRVhUSV9Jbml0U3RydWN0Lg0KICAqIEBwYXJhbSAgRVhUSV9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgRVhUSV9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBFWFRJIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEVYVElfSW5pdChFWFRJX0luaXRUeXBlRGVmKiBFWFRJX0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcCA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTU9ERShFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRVhUSV9UUklHR0VSKEVYVElfSW5pdFN0cnVjdC0+RVhUSV9UcmlnZ2VyKSk7DQogIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoRVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmUpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTGluZUNtZCkpOw0KDQogIHRtcCA9ICh1aW50MzJfdClFWFRJX0JBU0U7DQogICAgIA0KICBpZiAoRVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmVDbWQgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIENsZWFyIEVYVEkgbGluZSBjb25maWd1cmF0aW9uICovDQogICAgRVhUSS0+SU1SICY9IH5FWFRJX0luaXRTdHJ1Y3QtPkVYVElfTGluZTsNCiAgICBFWFRJLT5FTVIgJj0gfkVYVElfSW5pdFN0cnVjdC0+RVhUSV9MaW5lOw0KICAgIA0KICAgIHRtcCArPSBFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTW9kZTsNCg0KICAgICooX19JTyB1aW50MzJfdCAqKSB0bXAgfD0gRVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmU7DQoNCiAgICAvKiBDbGVhciBSaXNpbmcgRmFsbGluZyBlZGdlIGNvbmZpZ3VyYXRpb24gKi8NCiAgICBFWFRJLT5SVFNSICY9IH5FWFRJX0luaXRTdHJ1Y3QtPkVYVElfTGluZTsNCiAgICBFWFRJLT5GVFNSICY9IH5FWFRJX0luaXRTdHJ1Y3QtPkVYVElfTGluZTsNCiAgICANCiAgICAvKiBTZWxlY3QgdGhlIHRyaWdnZXIgZm9yIHRoZSBzZWxlY3RlZCBleHRlcm5hbCBpbnRlcnJ1cHRzICovDQogICAgaWYgKEVYVElfSW5pdFN0cnVjdC0+RVhUSV9UcmlnZ2VyID09IEVYVElfVHJpZ2dlcl9SaXNpbmdfRmFsbGluZykNCiAgICB7DQogICAgICAvKiBSaXNpbmcgRmFsbGluZyBlZGdlICovDQogICAgICBFWFRJLT5SVFNSIHw9IEVYVElfSW5pdFN0cnVjdC0+RVhUSV9MaW5lOw0KICAgICAgRVhUSS0+RlRTUiB8PSBFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTGluZTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHRtcCA9ICh1aW50MzJfdClFWFRJX0JBU0U7DQogICAgICB0bXAgKz0gRVhUSV9Jbml0U3RydWN0LT5FWFRJX1RyaWdnZXI7DQoNCiAgICAgICooX19JTyB1aW50MzJfdCAqKSB0bXAgfD0gRVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmU7DQogICAgfQ0KICB9DQogIGVsc2UNCiAgew0KICAgIHRtcCArPSBFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTW9kZTsNCg0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGxpbmVzICovDQogICAgKihfX0lPIHVpbnQzMl90ICopIHRtcCAmPSB+RVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmU7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBGaWxscyBlYWNoIEVYVElfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgcmVzZXQgdmFsdWUuDQogICogQHBhcmFtICBFWFRJX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBFWFRJX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaCB3aWxsDQogICogICBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgRVhUSV9TdHJ1Y3RJbml0KEVYVElfSW5pdFR5cGVEZWYqIEVYVElfSW5pdFN0cnVjdCkNCnsNCiAgRVhUSV9Jbml0U3RydWN0LT5FWFRJX0xpbmUgPSBFWFRJX0xJTkVOT05FOw0KICBFWFRJX0luaXRTdHJ1Y3QtPkVYVElfTW9kZSA9IEVYVElfTW9kZV9JbnRlcnJ1cHQ7DQogIEVYVElfSW5pdFN0cnVjdC0+RVhUSV9UcmlnZ2VyID0gRVhUSV9UcmlnZ2VyX0ZhbGxpbmc7DQogIEVYVElfSW5pdFN0cnVjdC0+RVhUSV9MaW5lQ21kID0gRElTQUJMRTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBHZW5lcmF0ZXMgYSBTb2Z0d2FyZSBpbnRlcnJ1cHQuDQogICogQHBhcmFtICBFWFRJX0xpbmU6IHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBFWFRJX0xpbmV4IHdoZXJlIHggY2FuIGJlICgwLi4xOSkuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEVYVElfR2VuZXJhdGVTV0ludGVycnVwdCh1aW50MzJfdCBFWFRJX0xpbmUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19FWFRJX0xJTkUoRVhUSV9MaW5lKSk7DQogIA0KICBFWFRJLT5TV0lFUiB8PSBFWFRJX0xpbmU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFWFRJIGxpbmUgZmxhZyBpcyBzZXQgb3Igbm90Lg0KICAqIEBwYXJhbSAgRVhUSV9MaW5lOiBzcGVjaWZpZXMgdGhlIEVYVEkgbGluZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KICAqICAgICBAYXJnIEVYVElfTGluZXg6IEV4dGVybmFsIGludGVycnVwdCBsaW5lIHggd2hlcmUgeCgwLi4xOSkNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgRVhUSV9MaW5lIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBFWFRJX0dldEZsYWdTdGF0dXModWludDMyX3QgRVhUSV9MaW5lKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfR0VUX0VYVElfTElORShFWFRJX0xpbmUpKTsNCiAgDQogIGlmICgoRVhUSS0+UFIgJiBFWFRJX0xpbmUpICE9ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgRVhUSZJzIGxpbmUgcGVuZGluZyBmbGFncy4NCiAgKiBAcGFyYW0gIEVYVElfTGluZTogc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmVzIGZsYWdzIHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiBFWFRJX0xpbmV4IHdoZXJlIHggY2FuIGJlICgwLi4xOSkuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEVYVElfQ2xlYXJGbGFnKHVpbnQzMl90IEVYVElfTGluZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShFWFRJX0xpbmUpKTsNCiAgDQogIEVYVEktPlBSID0gRVhUSV9MaW5lOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgRVhUSSBsaW5lIGlzIGFzc2VydGVkIG9yIG5vdC4NCiAgKiBAcGFyYW0gIEVYVElfTGluZTogc3BlY2lmaWVzIHRoZSBFWFRJIGxpbmUgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQogICogICAgIEBhcmcgRVhUSV9MaW5leDogRXh0ZXJuYWwgaW50ZXJydXB0IGxpbmUgeCB3aGVyZSB4KDAuLjE5KQ0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBFWFRJX0xpbmUgKFNFVCBvciBSRVNFVCkuDQogICovDQpJVFN0YXR1cyBFWFRJX0dldElUU3RhdHVzKHVpbnQzMl90IEVYVElfTGluZSkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIHVpbnQzMl90IGVuYWJsZXN0YXR1cyA9IDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19HRVRfRVhUSV9MSU5FKEVYVElfTGluZSkpOw0KICANCiAgZW5hYmxlc3RhdHVzID0gIEVYVEktPklNUiAmIEVYVElfTGluZTsNCiAgaWYgKCgoRVhUSS0+UFIgJiBFWFRJX0xpbmUpICE9ICh1aW50MzJfdClSRVNFVCkgJiYgKGVuYWJsZXN0YXR1cyAhPSAodWludDMyX3QpUkVTRVQpKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBFWFRJknMgbGluZSBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBFWFRJX0xpbmU6IHNwZWNpZmllcyB0aGUgRVhUSSBsaW5lcyB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgRVhUSV9MaW5leCB3aGVyZSB4IGNhbiBiZSAoMC4uMTkpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBFWFRJX0NsZWFySVRQZW5kaW5nQml0KHVpbnQzMl90IEVYVElfTGluZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0VYVElfTElORShFWFRJX0xpbmUpKTsNCiAgDQogIEVYVEktPlBSID0gRVhUSV9MaW5lOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K