LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqKiCw5sioy/nT0CAoQykyMDE1LCDW0NDLzajRtrnJt93T0M/euavLvqGjDQoqKiANCioqIM7EvP7D+7PGOiAgICAgdm9pY2VfYnVmZmVyLmMNCioqIM7EvP6x6sq2OiAgICAgDQoqKiDE2sjd1arSqjogICAgDQoqKiDKudPDt723qDogICAgIA0KKiogDQoqKiDQ3rjEyNXG2iAgICAgICAgsOaxvrrFICAgICAg0N64xLHqvMcgICAgICAgINDeuMTIyyAgICAgICAgICDQ3rjExNrI3Q0KKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCioqIDIwMjMvMDcvMTggICAgIFYxLjAgICAgICAgIENyZWF0ZSAgICAgICAgICB4eHEgICAgICAgILS0vagNCioqIA0KKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPGFzc2VydC5oPg0KI2luY2x1ZGUgPGVycm5vLmg+DQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQojaW5jbHVkZSA8c3lzL3N0YXQuaD4NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCiNpbmNsdWRlIDx1bmlzdGQuaD4NCg0KI2luY2x1ZGUgPHN0ZGludC5oPg0KDQojaW5jbHVkZSA8ZmNudGwuaD4NCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4NCiNpbmNsdWRlIDxzaWduYWwuaD4NCg0KI2luY2x1ZGUgPHBvbGwuaD4NCiNpbmNsdWRlIDxwdGhyZWFkLmg+DQojaW5jbHVkZSA8c2VtYXBob3JlLmg+DQoNCiNpbmNsdWRlIDxsaW51eC92b2x0ZV9kcnYuaD4NCg0KLy8jZGVmaW5lIFZCX0RBVEFfTE9TU19URVNUCSAgICANCg0KI2RlZmluZSBWQl9NQVhfSU5UCSAgICAgMHg3ZmZmZmZmZg0KI2RlZmluZSBWQl9NSU5fSU5UICAgICAgICAwIC8vKDAtMjw8MzEpLy8NCiNkZWZpbmUgVkJfSU5UX09WRVJGTE9XKHgpIGlmKCh4IDwgVkJfTUlOX0lOVCl8fCh4ID4gVkJfTUFYX0lOVCkpICB4ID0gMDsNCg0KI2RlZmluZSBfVFhfUlhfREFUQV9GUk9NX0ZJTEUgLy90ZXN0IHVzZQ0KI2RlZmluZSBWQl9GVU5DX0RFQlVHIC8vREVCVUcgdXNlDQoNCiNkZWZpbmUgVkJVRkZFUl9ERVZfTkFNRSAiL2Rldi92b2ljZV9idWZmZXJfZGV2Ig0KI2RlZmluZSBWQlVGRkVSX0RFVl9GTEFHUyBPX1JEV1IgICAgIC8vT19SRFdSIHwgT19TWU5DDQoNCnR5cGVkZWYgaW50ICh2Yl90aHJlYWRfcHJvYykodm9pZCopOw0KdHlwZWRlZiBpbnQgKHZiX2V4dF9yeF90eF9mdW5jKSh2b2lkKixpbnQpOw0KDQpzdHJ1Y3QgdmJfaW5mb190DQp7DQoJaW50ICAgICAgICAgICAgICAgICBmZDsNCiAgICBwdGhyZWFkX3QJICAgICAgICByeF90aHJlYWQ7CQ0KICAgIHB0aHJlYWRfdAkgICAgICAgIHR4X3RocmVhZDsNCglpbnQgICAgICAgICAgICAgICAgIHF1aXQ7DQoJY2hhciAgICAgICAgCSAgICAqdHhfYnVmOw0KICAgIGNoYXIgICAgICAgIAkgICAgKnJ4X2J1ZjsNCglpbnQgICAgICAgICAgICAgICAgIGJ1Zl9zaXplOw0KCXZiX2V4dF9yeF90eF9mdW5jICAgKmV4dF9yeF9mdW5jOw0KCXZiX2V4dF9yeF90eF9mdW5jICAgKmV4dF90eF9mdW5jOw0KCXNlbV90ICAgICAgICAgICAgICAgcmVhZF9zZW07DQoJc2VtX3QgICAgICAgICAgICAgICB3cml0ZV9zZW07DQojaWZkZWYgX1RYX1JYX0RBVEFfRlJPTV9GSUxFDQoJY2hhciAqdHhfZmlsZW5hbWU7DQoJY2hhciAqcnhfZmlsZW5hbWU7DQogICAgRklMRSAqdHhfZmlsZTsNCglGSUxFICpyeF9maWxlOw0KICAgIGludCB0eF9maWxlc2l6ZTsNCglpbnQgcnhfZmlsZXNpemU7CQ0KI2VuZGlmDQp9Ow0KDQpzdHJ1Y3QgdmJfaW5mb190IHZiX3JlYyA9IHswfTsNCg0KaW50IHR4X29wdGNvdW50ID0gMDsNCmludCByeF9vcHRjb3VudCA9IDA7CQ0KaW50IGZpcnN0X3JkZXJyX2ZsYWcgPSAwOw0KaW50IGZpcnN0X3dyZXJyX2ZsYWcgPSAwOw0KDQp2b2lkIHZiX3NpZ25hbF9iYWNrX2Z1bmMoaW50IHNpZ251bSkNCnsNCglzZW1fcG9zdCgmdmJfcmVjLnJlYWRfc2VtKTsNCglzZW1fcG9zdCgmdmJfcmVjLndyaXRlX3NlbSk7DQp9DQoNCmludCB2b2ljZV9idWZmZXJfb3Blbih2b2lkKQ0Kew0KCWludCBmZDsNCglpbnQgb2ZsYWdzOw0KCQ0KCWZkID0gb3BlbihWQlVGRkVSX0RFVl9OQU1FLCBWQlVGRkVSX0RFVl9GTEFHUyk7DQoJcHJpbnRmKCIlczogZmQ9JWQhXG4iLCBfX2Z1bmNfXywgZmQpOwkJDQoNCglzaWduYWwoU0lHSU8sIHZiX3NpZ25hbF9iYWNrX2Z1bmMpOyAvL9Om08OzzNDy16Ky4dDFusW0psDtuq/K/aOsU0lHSU+x7cq+SU/T0Mr9vt2/ybmptsHIoQ0KCWZjbnRsKGZkLCBGX1NFVE9XTiwgZ2V0cGlkKCkpOw0KCW9mbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsJDQoJZmNudGwoZmQsIEZfU0VURkwsIG9mbGFnc3xGQVNZTkMpOw0KCQ0KCXNlbV9pbml0KCZ2Yl9yZWMucmVhZF9zZW0sIDAsIDApOw0KCXNlbV9pbml0KCZ2Yl9yZWMud3JpdGVfc2VtLCAwLCAwKTsJDQoNCgl0eF9vcHRjb3VudCA9IDA7DQoJcnhfb3B0Y291bnQgPSAwOw0KDQoJZmlyc3RfcmRlcnJfZmxhZyA9IDA7DQoJZmlyc3Rfd3JlcnJfZmxhZyA9IDA7DQoJDQoJcmV0dXJuIGZkOwkNCn0NCg0KaW50IHZvaWNlX2J1ZmZlcl9jbG9zZShpbnQgZmQpDQp7DQoJaW50IHJldCA9IDA7DQogICAgDQoJaWYoZmQgPj0gMCl7DQoJCXJldCA9IGNsb3NlKGZkKTsNCgl9DQoJZWxzZXsNCgkJcHJpbnRmKCIlczogZmQgaW52YWxpZCwgcmV0dXJuIVxuIiwgX19mdW5jX18pOwkJDQoJCXJldHVybiAtRU5PRU5UOw0KCX0NCg0KCXZiX3JlYy5mZCA9IC0xOw0KCXNlbV9kZXN0cm95KCZ2Yl9yZWMucmVhZF9zZW0pOw0KCXNlbV9kZXN0cm95KCZ2Yl9yZWMud3JpdGVfc2VtKTsNCglwcmludGYoIiVzLCBmaXJzdF9yZGVycl9mbGFnPSVkLCBmaXJzdF93cmVycl9mbGFnPSVkLCB0eF9vcHRjb3VudD0lZCwgcnhfb3B0Y291bnQ9JWRcbiIsIF9fZnVuY19fLCBmaXJzdF9yZGVycl9mbGFnLCBmaXJzdF93cmVycl9mbGFnLCB0eF9vcHRjb3VudCwgcnhfb3B0Y291bnQpOw0KDQoJcmV0dXJuIHJldDsNCn0NCg0KDQppbnQgdm9pY2VfYnVmZmVyX3dyaXRlKGludCBmZCwgdW5zaWduZWQgY2hhciAqcGRhdGEsIHVuc2lnbmVkIGludCBsZW4pDQp7DQoJaW50IHJldDsNCglzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHByZV93dGltZSA9IHswfTsNCglzdHJ1Y3QgdGltZXNwZWMgY3VyX3d0aW1lID0gezB9Ow0KCQ0KCWlmKGZkID49IDApew0KCQlzZW1fd2FpdCgmdmJfcmVjLndyaXRlX3NlbSk7DQoJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZjdXJfd3RpbWUpOw0KCQkvL3ByaW50ZigiJXM6IHR2X3NlYz0lZCwgdHZfbnNlYz0lZFxyXG4iLCBfX2Z1bmNfXywgY3VyX3d0aW1lLnR2X3NlYywgY3VyX3d0aW1lLnR2X25zZWMpOw0KDQoJCXJldCA9IHdyaXRlKGZkLCBwZGF0YSwgbGVuKTsNCgl9DQoJZWxzZXsNCgkJcHJpbnRmKCIlczogZmQgaW52YWxpZCwgcmV0dXJuIVxuIixfX2Z1bmNfXyk7CQkNCgkJcmV0dXJuIC1FTk9FTlQ7DQoJfQ0KCXJldHVybiByZXQ7DQp9DQoNCmludCB2b2ljZV9idWZmZXJfcmVhZChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKnBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQ0Kew0KCWludCByZXQ7DQoJc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBwcmVfcnRpbWUgPSB7MH07DQoJc3RydWN0IHRpbWVzcGVjIGN1cl9ydGltZSA9IHswfTsJDQoJDQoJaWYoZmQgPj0gMCl7DQoJCXNlbV93YWl0KCZ2Yl9yZWMucmVhZF9zZW0pOw0KCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmY3VyX3J0aW1lKTsNCgkJLy9wcmludGYoIiVzOiB0dl9zZWM9JWQsIHR2X25zZWM9JWRcclxuIiwgX19mdW5jX18sIGN1cl9ydGltZS50dl9zZWMsIGN1cl9ydGltZS50dl9uc2VjKTsNCgkJDQoJCXJldCA9IHJlYWQoZmQsIHBkYXRhLCBsZW4pOw0KCX0NCgllbHNlew0KCQlwcmludGYoIiVzOiBmZCBpbnZhbGlkLCByZXR1cm4hXG4iLCBfX2Z1bmNfXyk7CQkNCgkJcmV0dXJuIC1FTk9FTlQ7DQoJfQkNCiAgICANCglyZXR1cm4gcmV0Ow0KfQ0KDQppbnQgdm9pY2VfYnVmZmVyX2lvY3RsKGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcHZhbHVlKQ0Kew0KCWludCByZXQgPSAwOw0KICAgIA0KCWlmKGZkID49IDApew0KCQlyZXQgPSBpb2N0bChmZCwgY21kLCBwdmFsdWUpOw0KCX0NCgllbHNlew0KCQlwcmludGYoIiVzOiBmZCBpbnZhbGlkLCByZXR1cm5cbiIsIF9fZnVuY19fKTsJCQ0KCQlyZXR1cm4gLUVOT0VOVDsNCgl9CQ0KICAgIA0KCXJldHVybiByZXQ7DQp9DQoNCnN0YXRpYyBpbnQgdmJfcnhfdGhyZWFkX2Z1bmModm9pZCAqYXJnKQ0Kew0KICAgIGludCByZXQgPSAwOw0KDQogICAgY2hhciogYnVmID0gdmJfcmVjLnJ4X2J1ZjsNCiAgICBpbnQgc2l6ZSA9IHZiX3JlYy5idWZfc2l6ZTsNCiAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcmVhZCA9IDA7DQogICAgaW50IHJfc2l6ZSA9IDA7DQogICAgDQogICAgcHJpbnRmKCIlczogc3RhcnQgc2l6ZT0lZCFcbiIsIF9fZnVuY19fLCBzaXplKTsNCiAgICBtZW1zZXQoYnVmLCAwLCBzaXplKTsNCiAgICANCiAgICB3aGlsZSghdmJfcmVjLnF1aXQpew0KCQlyeF9vcHRjb3VudCArKzsJDQoJCVZCX0lOVF9PVkVSRkxPVyhyeF9vcHRjb3VudCk7DQogICAgDQoJCWlmKChyeF9vcHRjb3VudCAlIDEwMDApID09IDApew0KICAgICAgICAgICAgcHJpbnRmKCIlczogcnhfb3B0Y291bnQ9JWQhXG4iLCBfX2Z1bmNfXywgcnhfb3B0Y291bnQpOw0KDQogICAgICAgICAgICBpZihyeF9vcHRjb3VudCA9PSAxMDAwMDAwKQ0KICAgICAgICAgICAgICAgIHJ4X29wdGNvdW50ID0gMDsNCgkJfQ0KDQogICAgICAgIC8vcmVhZCBmcm9tIHBzDQoJCXJfc2l6ZSA9IHZvaWNlX2J1ZmZlcl9yZWFkKHZiX3JlYy5mZCwgYnVmLCBzaXplKTsNCiAgICAgICAgDQogICAgICAgIGlmKHJfc2l6ZSA8PSAwKXsNCiAgICAgICAgICAgIGZpcnN0X3JkZXJyX2ZsYWcrKzsNCgkJCQ0KCQkJVkJfSU5UX09WRVJGTE9XKGZpcnN0X3JkZXJyX2ZsYWcpOw0KICAgICAgICANCgkJCWlmKGZpcnN0X3JkZXJyX2ZsYWcgPT0gMSl7DQoJCQkJcHJpbnRmKCAiJXM6IGVycm9yIHJlYWRpbmcgZGF0YSFcbiIsIF9fZnVuY19fKTsNCgkJCX0NCgkJCWlmKChmaXJzdF9yZGVycl9mbGFnICUgNTAwKSA9PSAwKXsNCiAgICAgICAgICAgIAlwcmludGYoIiVzOiBmaXJzdF9yZGVycl9mbGFnPSVkIVxuIiwgX19mdW5jX18sIGZpcnN0X3JkZXJyX2ZsYWcpOw0KCQkJfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb250aW51ZSA7DQogICAgICAgIH0NCgkJZWxzZXsNCgkJCWZpcnN0X3JkZXJyX2ZsYWcgPSAwOw0KCQl9DQoJCQ0KI2lmZGVmIF9UWF9SWF9EQVRBX0ZST01fRklMRQ0KICAgICAgICBpZih2Yl9yZWMucnhfZmlsZSAhPSBOVUxMKSANCiAgICAgICAgew0KI2lmIDANCiAgICAgICAgICAgIHN0YXRpYyBpbnQgaT0wOw0KICAgICAgICAgICAgaSsrOw0KICAgICAgICAgICAgaWYgKGk9PTUwKSB7DQogICAgICAgICAgICAgICAgcHJpbnRmKCJ2Yl9yeF90aHJlYWRfZnVuYyBidWZbJWRdPSVkXG4iLGksYnVmW2ldKTsNCiAgICAgICAgICAgICAgICBpPTA7DQogICAgICAgICAgICB9DQojZW5kaWYNCiAgICAgICAgICAgIC8vaWYoZndyaXRlKGJ1ZiwgMSwgc2l6ZSwgdmJfcmVjLnJ4X2ZpbGUpICE9IHNpemUpey8vtaW49tfWvdrQtMjro6zOxLz+w7vK/b7dDQoJCSAgICBpZihmd3JpdGUoYnVmLCBzaXplLCAxLCB2Yl9yZWMucnhfZmlsZSkgIT0gMSl7DQoJCSAgICAgICAgcHJpbnRmKCIlczogRXJyb3IgZndyaXRlXG4iLCBfX2Z1bmNfXyk7DQoJCSAgICAgICAgLy9icmVhazsNCgkJICAgIH0NCgkJCWVsc2V7DQoJCSAgICAgICAgYnl0ZXNfcmVhZCArPSBzaXplOw0KICAgICAgICAgICAgICAgIA0KCQkJCWlmKGJ5dGVzX3JlYWQgPj0gdmJfcmVjLnJ4X2ZpbGVzaXplKXsNCgkJCQkJLy9mc2Vlayh2Yl9yZWMucnhfZmlsZSwgMCwgU0VFS19TRVQpOy8v0LTI67K7z97Wxs7EvP6089ChDQoJCQkJfQ0KCQkJfQ0KICAgICAgICB9DQojZW5kaWYNCiAgICB9DQogICAgDQogICAgcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgdmJfdHhfdGhyZWFkX2Z1bmModm9pZCAqYXJnKQ0Kew0KICAgIGludCByZXQgPSAwOw0KICAgIA0KICAgIGludCBudW1fcmVhZCA9IDA7DQogICAgY2hhciogYnVmID0gdmJfcmVjLnR4X2J1ZjsNCiAgICBpbnQgc2l6ZSA9IHZiX3JlYy5idWZfc2l6ZTsNCiAgICBpbnQgd19zaXplID0gMDsNCiAgICAgICANCiAgICBwcmludGYoIiVzOiBzdGFydCBzaXplPSVkIVxuIiwgX19mdW5jX18sIHNpemUpOw0KICAgIA0KI2lmbmRlZiBWQl9EQVRBX0xPU1NfVEVTVA0KICAgIG1lbXNldChidWYsIDAsIHNpemUpOw0KI2VuZGlmICAgDQoNCiAgICB3aGlsZSghdmJfcmVjLnF1aXQpew0KI2lmIGRlZmluZWQgKF9UWF9SWF9EQVRBX0ZST01fRklMRSkgJiYgIWRlZmluZWQgKFZCX0RBVEFfTE9TU19URVNUKQ0KCQkNCiAgICAgICAgaWYodmJfcmVjLnR4X2ZpbGUgIT0gTlVMTCkgDQogICAgICAgIHsNCgkgICAgICAgIC8vbnVtX3JlYWQgPSBmcmVhZChidWYsIDEsIHNpemUsIHZiX3JlYy50eF9maWxlKTsNCiAgICAgICAgICAgIG51bV9yZWFkID0gZnJlYWQoYnVmLCBzaXplLCAxLCB2Yl9yZWMudHhfZmlsZSk7DQoJICAgICAgICBpZiAobnVtX3JlYWQgPD0gMCkgew0KCQkJICAgIHByaW50ZigiJXM6IHZiX3JlYy50eF9maWxlIHJlYWQgZW5kXG4iLF9fZnVuY19fKTsNCgkJCSAgIC8vIG5vIGRhdGEgDQoJCQkJLy9mc2Vlayh2Yl9yZWMudHhfZmlsZSwgMCwgU0VFS19TRVQpOw0KCQkJfQ0KICAgICAgICB9DQojZW5kaWYJCQ0KDQoJCXR4X29wdGNvdW50ICsrOw0KCQlWQl9JTlRfT1ZFUkZMT1codHhfb3B0Y291bnQpOw0KICAgICAgICANCgkJaWYoKHR4X29wdGNvdW50JTEwMDApID09IDApew0KICAgICAgICAgICAgcHJpbnRmKCIlczogdHhfb3B0Y291bnQ9JWQhXG4iLCBfX2Z1bmNfXywgdHhfb3B0Y291bnQpOw0KDQogICAgICAgICAgICBpZih0eF9vcHRjb3VudCA9PSAxMDAwMDAwKQ0KICAgICAgICAgICAgICAgIHR4X29wdGNvdW50ID0gMDsNCgkJfQ0KDQoJCS8vd3JpdGUgdG8gcHMNCgkJd19zaXplID0gdm9pY2VfYnVmZmVyX3dyaXRlKHZiX3JlYy5mZCwgYnVmLCBzaXplKTsNCiAgICAgICAgDQogICAgICAgIGlmKHdfc2l6ZSA8PSAwKXsNCiAgICAgICAgCWZpcnN0X3dyZXJyX2ZsYWcrKzsNCgkJCVZCX0lOVF9PVkVSRkxPVyhmaXJzdF93cmVycl9mbGFnKTsNCiAgICAgICAgICAgIA0KCQkJaWYoZmlyc3Rfd3JlcnJfZmxhZyA9PTEpew0KICAgICAgICAgICAgCXByaW50ZigiJXM6IGVycm9yIHdyaXRpbmcgZGF0YSFcbiIsIF9fZnVuY19fKTsNCgkJCX0NCgkJCWlmKChmaXJzdF93cmVycl9mbGFnICUgNTAwKSA9PSAwKXsNCiAgICAgICAgICAgIAlwcmludGYoIiVzOiBmaXJzdF93cmVycl9mbGFnPSVkIVxuIiwgX19mdW5jX18sIGZpcnN0X3dyZXJyX2ZsYWcpOw0KCQkJfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgfQ0KCQllbHNlew0KCQkJZmlyc3Rfd3JlcnJfZmxhZyA9IDA7DQoJCX0NCiAgICB9DQogICAgDQogICAgcmV0dXJuIDA7DQp9DQoNCnN0YXRpYyBpbnQgdmJfdGhyZWFkX2NyZWF0ZSggY29uc3QgY2hhciAqbmFtZSxwdGhyZWFkX3QJKnRocmVhZF90LCB2Yl90aHJlYWRfcHJvYyAqcHJvYywgDQoJCQkJCQkJCWludCBzdGFja19zaXplLCB1bnNpZ25lZCBwcmlvcml0eSx2b2lkICphcmcgKQ0Kew0KICAgIHB0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRyOw0KICAgIGludCByZXQgPSAwOw0KCWludCBkZWZhdWx0X3NpemUgPSAwOw0KICAgIA0KICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsNCiAgICBpbnQgcG9saWN5ID0gU0NIRURfRklGTzsNCiAgICANCiAgICAvKiBTZXQgZGVmYXVsdCBzdGFjayBzaXplICovDQogICAgLy9zdGFja19zaXplID0gOCoxMDI0Oy8vMzIqMTAyNDsNCiAgICBwcmludGYoIiVzOiBzdGFydCFcbiIsIF9fZnVuY19fKTsNCiAgICANCiAgICAvKiBJbml0IHRocmVhZCBhdHRyaWJ1dGVzICovDQogICAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsNCgkvL3B0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsNCiAgIC8qIA0KICAgIHJldCA9IHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJnRocmVhZF9hdHRyLCBzdGFja19zaXplKTsNCiAgICBpZiAocmV0ICE9IDApDQogICAgew0KICAgIA0KICAgIAlwcmludGYoIiVzOiBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCVkKSBmYWlsLHJldD0lZCEgXG4iLF9fZnVuY19fLHN0YWNrX3NpemUscmV0KTsNCiAgICAJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZF9hdHRyKTsNCiAgICAgICAgcmV0dXJuIHJldDsNCiAgICB9DQogICAgKi8NCiAgICANCiAgICAvKiBDcmVhdGUgdGhlIHRocmVhZC4gKi8NCg0KICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCB0aHJlYWRfdCwgJnRocmVhZF9hdHRyLHByb2MsIGFyZyk7DQogICAgaWYocmV0ICE9IDApew0KICAgIAlwcmludGYoIiVzOiBwdGhyZWFkX2NyZWF0ZSBmYWlsLHJldD0lZCFcbiIsIF9fZnVuY19fLCByZXQpOw0KICAgIA0KICAgIAlwdGhyZWFkX2F0dHJfZGVzdHJveSgmdGhyZWFkX2F0dHIpOw0KICAgIA0KICAgICAgICByZXR1cm4gcmV0Ow0KICAgIH0NCgkNCiAgICBwdGhyZWFkX2F0dHJfZ2V0c3RhY2tzaXplKCZ0aHJlYWRfYXR0ciwgJmRlZmF1bHRfc2l6ZSk7DQogICAgcHJpbnRmKCIlczogcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSglZCkhXG4iLCBfX2Z1bmNfXywgZGVmYXVsdF9zaXplKTsNCiAgICANCiAgICAvL3B0aHJlYWRfZGV0YWNoKHJlYy0+dGhyZWFkKTsNCiAgICAvKiAgDQogICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHBhcmFtKSk7DQogICAgLy9wYXJhbS5zY2hlZF9wcmlvcml0eSA9MzY7DQogICAgcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSBwcmlvcml0eTsNCiAgICBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGhyZWFkX3QsIHBvbGljeSwgJnBhcmFtKTsNCiAgICovIA0KICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZ0aHJlYWRfYXR0cik7DQoJDQogICAgcHJpbnRmKCIlczogZW5kXG4iLCBfX2Z1bmNfXyk7DQogICAgDQogICAgcmV0dXJuIDA7DQp9DQoNCi8vU3RhcnQgc3RyZWFtDQppbnQgdmJ1ZmZlcl9zdHJlYW1fc3RhcnQodm9pZCkNCnsNCiAgICBpbnQgcmV0ID0gMDsNCiAgICANCiAgICAvL3ZvaWNlX2J1ZmZlcl9vcGVuDQogICAgaW50IGZzID0gMDsNCiAgICBpbnQgYnVmX3NpemUgPSAwOw0KIAlwcmludGYoIlN0YXJ0aW5nIHZiIHN0cmVhbVxuIik7DQoJdHhfb3B0Y291bnQgPSAwOw0KCXJ4X29wdGNvdW50ID0gMDsJDQogICAgaW50KiBidWZfaW50Ow0KCWludCBpID0gMDsNCg0KICAgIHZiX3JlYy5mZCA9IHZvaWNlX2J1ZmZlcl9vcGVuKCk7DQoJaWYodmJfcmVjLmZkIDwgMCl7DQoJCXByaW50ZigiJXM6IHZiIG9wZW4gZmFpbCwgZmQ9JWRcbiIsIF9fZnVuY19fLCB2Yl9yZWMuZmQpOw0KCQlyZXQgPSAtMTsNCgkJZ290byBlcnI7DQoJfQ0KDQogICAgcmV0ID0gaW9jdGwodmJfcmVjLmZkLCBWT0lDRV9JT0NUTF9HRVRfRlMsICZmcyk7DQoJaWYocmV0KXsNCgkJcHJpbnRmKCIlczogVk9JQ0VfSU9DVExfR0VUX0ZTIGZkPSVkLHJldD0lZC5cbiIsIF9fZnVuY19fLCB2Yl9yZWMuZmQsIHJldCk7DQoJCWdvdG8gZXJyOw0KCX0NCg0KICAgIGlmKDgwMDAgPT0gZnMpDQogICAgICAgIGJ1Zl9zaXplID0gMzIwOw0KICAgIGVsc2UgaWYoMTYwMDAgPT0gZnMpDQogICAgICAgIGJ1Zl9zaXplID0gNjQwOw0KICAgIGVsc2V7DQogICAgICAgIGJ1Zl9zaXplID0gMDsNCiAgICAgICAgcHJpbnRmKCIlczogZnMgaXMgZXJyb3IsIGJ1Zl9zaXplPSVkXG4iLCBfX2Z1bmNfXywgYnVmX3NpemUpOw0KICAgICAgICBnb3RvIGVycjsNCiAgICB9DQoNCiNpZmRlZiBfVFhfUlhfREFUQV9GUk9NX0ZJTEUNCiAJcHJpbnRmKCIlczogb3BlbiB0eCBhbmQgcnggZmlsZVxuIiwgX19mdW5jX18pOw0KDQogICAgaWYoODAwMCA9PSBmcykNCiAgICAgICAgdmJfcmVjLnR4X2ZpbGVuYW1lID0gIi9tbnQvdXNlcmRhdGEvdHg4LnBjbSI7DQogICAgZWxzZSBpZigxNjAwMCA9PSBmcykNCiAgICAgICAgdmJfcmVjLnR4X2ZpbGVuYW1lID0gIi9tbnQvdXNlcmRhdGEvdHgxNi5wY20iOw0KICAgIA0KICAgIHZiX3JlYy50eF9maWxlID0gZm9wZW4odmJfcmVjLnR4X2ZpbGVuYW1lLCAicmIiKTsNCiAgICBpZighdmJfcmVjLnR4X2ZpbGUpew0KICAgICAgICBwcmludGYoIlVuYWJsZSB0byBvcGVuIGZpbGUgJyVzJ1xuIiwgdmJfcmVjLnR4X2ZpbGVuYW1lKTsNCiAgICAgICAgLy9yZXR1cm4gMTsNCiAgICB9DQoNCiAgICBpZig4MDAwID09IGZzKQ0KICAgICAgICB2Yl9yZWMucnhfZmlsZW5hbWUgPSAiL21udC91c2VyZGF0YS9yeDgucGNtIjsNCiAgICBlbHNlIGlmKDE2MDAwID09IGZzKQ0KICAgICAgICB2Yl9yZWMucnhfZmlsZW5hbWUgPSAiL21udC91c2VyZGF0YS9yeDE2LnBjbSI7DQogICAgDQogICAgdmJfcmVjLnJ4X2ZpbGUgPSBmb3Blbih2Yl9yZWMucnhfZmlsZW5hbWUsICJ3YiIpOw0KICAgIGlmKCF2Yl9yZWMucnhfZmlsZSl7DQogICAgICAgIHByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGZpbGUgJyVzJ1xuIiwgdmJfcmVjLnJ4X2ZpbGVuYW1lKTsNCiAgICAgICAgLy9yZXR1cm4gMTsNCiAgICB9DQogICAgDQoJdmJfcmVjLnJ4X2ZpbGVzaXplID0gMHgxMDAwMDsNCgkvL3ZiX3JlYy5idWZfc2l6ZSA9IGJ1Zl9zaXplOyAgIA0KI2VuZGlmDQoNCiAgICB2Yl9yZWMucnhfYnVmID0gKGNoYXIqKW1hbGxvYyhidWZfc2l6ZSk7DQoJaWYoIXZiX3JlYy5yeF9idWYpew0KCQlwcmludGYoIiVzOiBtYWxsb2MgcnhfYnVmIGZhaWxcbiIsIF9fZnVuY19fKTsNCgkJZ290byBlcnI7DQoJfQkNCiAgICANCiAgICB2Yl9yZWMudHhfYnVmID0gKGNoYXIqKW1hbGxvYyhidWZfc2l6ZSk7ICANCglpZighdmJfcmVjLnR4X2J1Zil7DQoJCS8vZnJlZSh2Yl9yZWMucnhfYnVmKTsNCgkJcHJpbnRmKCIlczogbWFsbG9jIHR4X2J1ZiBmYWlsXG4iLCBfX2Z1bmNfXyk7DQoJCWdvdG8gZXJyOw0KCX0JDQogICAgDQoJdmJfcmVjLmJ1Zl9zaXplID0gYnVmX3NpemU7DQoNCiNpZmRlZiAgVkJfREFUQV9MT1NTX1RFU1QvL2ZvciB0ZXN0DQoJYnVmX2ludCA9IChpbnQqKXZiX3JlYy50eF9idWY7DQoNCglmb3IoaSA9IDA7IGkgPCAoYnVmX3NpemUgLyA0KTsgaSsrKXsNCiAgICAgICAgKihidWZfaW50ICsgaSkgPSBpOw0KCSAgICAvL2J1Zl9pbnRbaV0gPSBpOw0KICAgICAgICBpZihpID4gMHgxZikgIA0KICAgICAgICAgICAgcHJpbnRmKCJjYXAgdXNlcjogKihidWZfaW50KyVkKT0lZFxuIiwgaSwgKihidWZfaW50K2kpKTsNCgl9DQojZW5kaWYNCgkNCiAgICB2Yl9yZWMucXVpdCA9IDA7DQoJDQoJcHJpbnRmKCIlczogcnggdHggdmJfdGhyZWFkX2NyZWF0ZSBzdGFydFxuIiwgX19mdW5jX18pOw0KICAgIHJldCA9IHZiX3RocmVhZF9jcmVhdGUoInZiX3BsYXliYWNrIiwgJnZiX3JlYy5yeF90aHJlYWQsIHZiX3J4X3RocmVhZF9mdW5jLCANCiAgICAJCQkJCQkJNCoxMDI0LCAzNiwgTlVMTCk7DQogICAgaWYocmV0ICE9IDApew0KCQlwcmludGYoIiVzOiByeCB2Yl90aHJlYWRfY3JlYXRlIGZhaWwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsNCgkJZ290byBlcnI7DQogICAgfQ0KDQoJcHJpbnRmKCIlczogcnggdmJfdGhyZWFkX2NyZWF0ZSBlbmRcbiIsIF9fZnVuY19fKTsNCg0KICAgIHJldCA9IHZiX3RocmVhZF9jcmVhdGUoInZiX3JlY29yZCIsICZ2Yl9yZWMudHhfdGhyZWFkLCB2Yl90eF90aHJlYWRfZnVuYywNCiAgICAJCQkJCQkJNCoxMDI0LCAzNiwgTlVMTCk7DQogICAgaWYocmV0ICE9IDApew0KCQlwcmludGYoIiVzOiB0eCB2Yl90aHJlYWRfY3JlYXRlIGZhaWwgcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsNCiAgICAgICAgdmJfcmVjLnF1aXQgPSAxOw0KICAgICAgICBwdGhyZWFkX2pvaW4odmJfcmVjLnJ4X3RocmVhZCxOVUxMKTsNCiAgICAgICAgdmJfcmVjLnJ4X3RocmVhZCA9IE5VTEw7DQoJCWdvdG8gZXJyOw0KICAgIH0NCiAgICANCglwcmludGYoIiVzOiB0eCB2Yl90aHJlYWRfY3JlYXRlIGVuZFxuIiwgX19mdW5jX18pOw0KCQ0KICAgIC8vdmJfcmVjLnF1aXQgPSAwOyAgIA0KICAgIHJldHVybiAwOw0KDQplcnI6DQogICAgaWYodmJfcmVjLnJ4X2J1ZiAhPSBOVUxMKQ0KCSAgICBmcmVlKHZiX3JlYy5yeF9idWYpOw0KICAgIA0KICAgIGlmKHZiX3JlYy50eF9idWYgIT0gTlVMTCkNCgkgICAgZnJlZSh2Yl9yZWMudHhfYnVmKTsJDQogICAgDQogICAgaWYodmJfcmVjLmZkID49IDApDQogICAgICAgIHZvaWNlX2J1ZmZlcl9jbG9zZSh2Yl9yZWMuZmQpOw0KICAgIA0KICAgIHJldHVybiByZXQ7DQp9DQoNCi8vU3RvcCBzdHJlYW0NCmludCB2YnVmZmVyX3N0cmVhbV9zdG9wKHZvaWQpDQp7DQogICAgaW50IHJldCA9IDA7DQoJcHJpbnRmKCIlczogcnggdHggdGhyZWFkIGV4aXQgc3RhcnRcbiIsIF9fZnVuY19fKTsNCiAgICANCiAgICB2Yl9yZWMucXVpdCA9IDE7DQoJc2VtX3Bvc3QoJnZiX3JlYy5yZWFkX3NlbSk7DQoJc2VtX3Bvc3QoJnZiX3JlYy53cml0ZV9zZW0pOw0KICAgIA0KICAgIGlmKHZiX3JlYy50eF90aHJlYWQpew0KICAgICAgICBwdGhyZWFkX2pvaW4gKHZiX3JlYy50eF90aHJlYWQsTlVMTCk7DQogICAgICAgIHZiX3JlYy50eF90aHJlYWQgPSBOVUxMOw0KCQlwcmludGYoInR4X3RocmVhZCBleGl0IGVuZFxuIik7DQogICAgfQ0KICAgIA0KICAgIGlmKHZiX3JlYy5yeF90aHJlYWQpewkNCiAgICAgICAgcHRocmVhZF9qb2luICh2Yl9yZWMucnhfdGhyZWFkLE5VTEwpOw0KICAgICAgICB2Yl9yZWMucnhfdGhyZWFkID0gTlVMTDsNCgkJcHJpbnRmKCJyeF90aHJlYWQgZXhpdCBlbmRcbiIpOw0KICAgIH0NCiAgICANCiAgICBwcmludGYoIiVzOiB2b2ljZV9idWZmZXJfY2xvc2Ugc3RhcnRcbiIsIF9fZnVuY19fKTsNCiAgICByZXQgPSB2b2ljZV9idWZmZXJfY2xvc2UodmJfcmVjLmZkKTsgDQogICAgaWYocmV0ICE9IDApew0KCQlwcmludGYoIiVzOiB2YiBjbG9zZSBmYWlsXG4iLCBfX2Z1bmNfXyk7DQogICAgDQogICAgICAgIHJldHVybiAtMTsNCiAgICB9DQoNCiNpZmRlZiBfVFhfUlhfREFUQV9GUk9NX0ZJTEUNCglpZih2Yl9yZWMudHhfZmlsZSAhPSBOVUxMKXsNCgkJZmNsb3NlKHZiX3JlYy50eF9maWxlKTsNCgkJcHJpbnRmKCIlczogdmIgY2xvc2UsIGNsb3NlIHR4IGZpbGVcbiIsIF9fZnVuY19fKTsNCgl9DQoJCQ0KCWlmKHZiX3JlYy5yeF9maWxlICE9IE5VTEwpew0KCQlmY2xvc2UodmJfcmVjLnJ4X2ZpbGUpOw0KCQlwcmludGYoIiVzOiB2YiBjbG9zZSwgY2xvc2UgcnggZmlsZVxuIiwgX19mdW5jX18pOw0KCX0JDQojZW5kaWYJCQ0KDQogICAgcHJpbnRmKCJTdG9wcGluZyB2YiBzdHJlYW0gZW5kXG4iKTsNCg0KICAgIHJldHVybiAwOw0KfQ0KDQo=