LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQogKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwogKiBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQogKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6IFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlICJ3c2JtX3Bvb2wuaCIKI2luY2x1ZGUgIndzYm1fbWFuYWdlci5oIgoKc3RydWN0IF9Xc2JtTWFsbG9jQnVmZmVyCnsKICAgIHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgYnVmOwogICAgc2l6ZV90IHNpemU7CiAgICB2b2lkICptZW07Cn07CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBfV3NibU1hbGxvY0J1ZmZlciAqCm1hbGxvY0J1ZihzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYpCnsKICAgIHJldHVybiBjb250YWluZXJPZihidWYsIHN0cnVjdCBfV3NibU1hbGxvY0J1ZmZlciwgYnVmKTsKfQoKc3RhdGljIHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKgpwb29sX2NyZWF0ZShzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sLAogICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdWludDMyX3QgcGxhY2VtZW50LCB1bnNpZ25lZCBhbGlnbm1lbnQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQp7CiAgICBzdHJ1Y3QgX1dzYm1NYWxsb2NCdWZmZXIgKm1CdWYgPSBtYWxsb2Moc2l6ZSArIHNpemVvZigqbUJ1ZikgKyAxNik7CgogICAgaWYgKCFtQnVmKQoJcmV0dXJuIE5VTEw7CgogICAgd3NibUJ1ZlN0b3JhZ2VJbml0KCZtQnVmLT5idWYsIHBvb2wpOwogICAgbUJ1Zi0+c2l6ZSA9IHNpemU7CiAgICBtQnVmLT5tZW0gPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyltQnVmICsgc2l6ZW9mKCptQnVmKSk7CiAgICBpZiAoKHBsYWNlbWVudCAmIFdTQk1fUExfTUFTS19NRU0pICE9IFdTQk1fUExfRkxBR19TWVNURU0pCglhYm9ydCgpOwoKICAgIHJldHVybiAmbUJ1Zi0+YnVmOwp9CgpzdGF0aWMgdm9pZApwb29sX2Rlc3Ryb3koc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqKmJ1ZikKewogICAgZnJlZShtYWxsb2NCdWYoKmJ1ZikpOwogICAgKmJ1ZiA9IE5VTEw7Cn0KCnN0YXRpYyBpbnQKcG9vbF93YWl0SWRsZShzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCBpbnQgbGF6eSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CnBvb2xfbWFwKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiwgdW5zaWduZWQgbW9kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHZvaWQgKip2aXJ0dWFsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgKnZpcnR1YWwgPSBtYWxsb2NCdWYoYnVmKS0+bWVtOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnBvb2xfdW5tYXAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgOwp9CgpzdGF0aWMgaW50CnBvb2xfc3luY2ZvcmNwdShzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLCB1bnNpZ25lZCBtb2RlIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnBvb2xfcmVsZWFzZWZyb21jcHUoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSwgdW5zaWduZWQgbW9kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIDsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcKcG9vbF9vZmZzZXQoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgLyoKICAgICAqIEJVRwogICAgICovCiAgICBhYm9ydCgpOwogICAgcmV0dXJuIDBVTDsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcKcG9vbF9wb29sT2Zmc2V0KHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIC8qCiAgICAgKiBCVUcKICAgICAqLwogICAgYWJvcnQoKTsKfQoKc3RhdGljIHVpbnQzMl90CnBvb2xfcGxhY2VtZW50KHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIHJldHVybiBXU0JNX1BMX0ZMQUdfU1lTVEVNIHwgV1NCTV9QTF9GTEFHX0NBQ0hFRDsKfQoKc3RhdGljIHVuc2lnbmVkIGxvbmcKcG9vbF9zaXplKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZikKewogICAgcmV0dXJuIG1hbGxvY0J1ZihidWYpLT5zaXplOwp9CgpzdGF0aWMgdm9pZApwb29sX2ZlbmNlKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHN0cnVjdCBfV3NibUZlbmNlT2JqZWN0ICpmZW5jZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIGFib3J0KCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgX1dzYm1LZXJuZWxCdWYgKgpwb29sX2tlcm5lbChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpKQp7CiAgICBhYm9ydCgpOwogICAgcmV0dXJuIE5VTEw7Cn0KCnN0YXRpYyB2b2lkCnBvb2xfdGFrZWRvd24oc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbCkKewogICAgZnJlZShwb29sKTsKfQoKc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqCndzYm1NYWxsb2NQb29sSW5pdCh2b2lkKQp7CiAgICBzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sOwoKICAgIHBvb2wgPSAoc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqKWNhbGxvYygxLCBzaXplb2YoKnBvb2wpKTsKICAgIGlmICghcG9vbCkKCXJldHVybiBOVUxMOwoKICAgIHBvb2wtPmZkID0gLTE7CiAgICBwb29sLT5tYXAgPSAmcG9vbF9tYXA7CiAgICBwb29sLT51bm1hcCA9ICZwb29sX3VubWFwOwogICAgcG9vbC0+c3luY2ZvcmNwdSA9ICZwb29sX3N5bmNmb3JjcHU7CiAgICBwb29sLT5yZWxlYXNlZnJvbWNwdSA9ICZwb29sX3JlbGVhc2Vmcm9tY3B1OwogICAgcG9vbC0+ZGVzdHJveSA9ICZwb29sX2Rlc3Ryb3k7CiAgICBwb29sLT5vZmZzZXQgPSAmcG9vbF9vZmZzZXQ7CiAgICBwb29sLT5wb29sT2Zmc2V0ID0gJnBvb2xfcG9vbE9mZnNldDsKICAgIHBvb2wtPnBsYWNlbWVudCA9ICZwb29sX3BsYWNlbWVudDsKICAgIHBvb2wtPnNpemUgPSAmcG9vbF9zaXplOwogICAgcG9vbC0+Y3JlYXRlID0gJnBvb2xfY3JlYXRlOwogICAgcG9vbC0+ZmVuY2UgPSAmcG9vbF9mZW5jZTsKICAgIHBvb2wtPmtlcm5lbCA9ICZwb29sX2tlcm5lbDsKICAgIHBvb2wtPnZhbGlkYXRlID0gTlVMTDsKICAgIHBvb2wtPndhaXRJZGxlID0gJnBvb2xfd2FpdElkbGU7CiAgICBwb29sLT50YWtlRG93biA9ICZwb29sX3Rha2Vkb3duOwogICAgcmV0dXJuIHBvb2w7Cn0K