LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogR2VuZXJpYyBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24uIEludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlCiAqIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciBtb3JlIGFkdmFuY2VkIG1lbW9yeSBtYW5hZ2Vycy4KICoKICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gdXNlZCBpcyBxdWl0ZSBzaW1wbGUgYW5kIHRoZXJlIG1pZ2h0IGJlIHN1YnN0YW50aWFsCiAqIHBlcmZvcm1hbmNlIGdhaW5zIGlmIGEgc21hcnRlciBmcmVlIGxpc3QgaXMgaW1wbGVtZW50ZWQuIEN1cnJlbnRseSBpdCBpcyBqdXN0IGFuCiAqIHVub3JkZXJlZCBzdGFjayBvZiBmcmVlIHJlZ2lvbnMuIFRoaXMgY291bGQgZWFzaWx5IGJlIGltcHJvdmVkIGlmIGFuIFJCLXRyZWUKICogaXMgdXNlZCBpbnN0ZWFkLiBBdCBsZWFzdCBpZiB3ZSBleHBlY3QgaGVhdnkgZnJhZ21lbnRhdGlvbi4KICoKICogQWxpZ25lZCBhbGxvY2F0aW9ucyBjYW4gYWxzbyBzZWUgaW1wcm92ZW1lbnQuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KCnVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2UoZHJtX21tX3QgKm1tKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Cglkcm1fbW1fbm9kZV90ICplbnRyeTsKCgl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKCWlmICghZW50cnktPmZyZWUpCgkJcmV0dXJuIDA7CgkKCXJldHVybiBlbnRyeS0+c2l6ZTsKfQoKaW50IGRybV9tbV9yZW1vdmVfc3BhY2VfZnJvbV90YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Cglkcm1fbW1fbm9kZV90ICplbnRyeTsKCgl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKCWlmICghZW50cnktPmZyZWUpCgkJcmV0dXJuIC1FTk9NRU07CgkKCWlmIChlbnRyeS0+c2l6ZSA8PSBzaXplKQoJCXJldHVybiAtRU5PTUVNOwoKCWVudHJ5LT5zaXplIC09IHNpemU7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgZHJtX21tX2NyZWF0ZV90YWlsX25vZGUoZHJtX21tX3QgKm1tLAoJCQkgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJZHJtX21tX25vZGVfdCAqY2hpbGQ7CgkKCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKCQlkcm1fY3RsX2FsbG9jKHNpemVvZigqY2hpbGQpLCBEUk1fTUVNX01NKTsKCWlmICghY2hpbGQpCgkJcmV0dXJuIC1FTk9NRU07CgoJY2hpbGQtPmZyZWUgPSAxOwoJY2hpbGQtPnNpemUgPSBzaXplOwoJY2hpbGQtPnN0YXJ0ID0gc3RhcnQ7CgljaGlsZC0+bW0gPSBtbTsKCglsaXN0X2FkZF90YWlsKCZjaGlsZC0+bWxfZW50cnksICZtbS0+bWxfZW50cnkpOwoJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPmZsX2VudHJ5LCAmbW0tPmZsX2VudHJ5KTsKCglyZXR1cm4gMDsKfQoJCgppbnQgZHJtX21tX2FkZF9zcGFjZV90b190YWlsKGRybV9tbV90ICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Cglkcm1fbW1fbm9kZV90ICplbnRyeTsKCgl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKCWlmICghZW50cnktPmZyZWUpIHsKCQlyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIGVudHJ5LT5zdGFydCArIGVudHJ5LT5zaXplLCBzaXplKTsKCX0KCWVudHJ5LT5zaXplICs9IHNpemU7CglyZXR1cm4gMDsKfQoJCnN0YXRpYyBkcm1fbW1fbm9kZV90ICpkcm1fbW1fc3BsaXRfYXRfc3RhcnQoZHJtX21tX25vZGVfdCAqcGFyZW50LAoJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWRybV9tbV9ub2RlX3QgKmNoaWxkOwoJCgljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopCgkJZHJtX2N0bF9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CglpZiAoIWNoaWxkKQoJCXJldHVybiBOVUxMOwoKCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+ZmxfZW50cnkpOwoKCWNoaWxkLT5mcmVlID0gMDsKCWNoaWxkLT5zaXplID0gc2l6ZTsKCWNoaWxkLT5zdGFydCA9IHBhcmVudC0+c3RhcnQ7CgljaGlsZC0+bW0gPSBwYXJlbnQtPm1tOwoKCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJnBhcmVudC0+bWxfZW50cnkpOwoJSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mbF9lbnRyeSk7CgoJcGFyZW50LT5zaXplIC09IHNpemU7CglwYXJlbnQtPnN0YXJ0ICs9IHNpemU7CglyZXR1cm4gY2hpbGQ7Cn0KCQoJCgpkcm1fbW1fbm9kZV90ICpkcm1fbW1fZ2V0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBwYXJlbnQsCgkJCQl1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGFsaWdubWVudCkKewoKCWRybV9tbV9ub2RlX3QgKmFsaWduX3NwbGl0b2ZmID0gTlVMTDsKCWRybV9tbV9ub2RlX3QgKmNoaWxkOwoJdW5zaWduZWQgdG1wID0gMDsKCglpZiAoYWxpZ25tZW50KQoJCXRtcCA9IHNpemUgJSBhbGlnbm1lbnQ7CgkKCWlmICh0bXApIHsKCQlhbGlnbl9zcGxpdG9mZiA9IGRybV9tbV9zcGxpdF9hdF9zdGFydChwYXJlbnQsIGFsaWdubWVudCAtIHRtcCk7CgkJaWYgKCFhbGlnbl9zcGxpdG9mZikKCQkJcmV0dXJuIE5VTEw7Cgl9CgkJCglpZiAocGFyZW50LT5zaXplID09IHNpemUpIHsKCQlsaXN0X2RlbF9pbml0KCZwYXJlbnQtPmZsX2VudHJ5KTsKCQlwYXJlbnQtPmZyZWUgPSAwOwoJCXJldHVybiBwYXJlbnQ7Cgl9IGVsc2UgewoJCWNoaWxkID0gZHJtX21tX3NwbGl0X2F0X3N0YXJ0KHBhcmVudCwgc2l6ZSk7CgkJaWYgKCFjaGlsZCkgewoJCQlpZiAoYWxpZ25fc3BsaXRvZmYpIAoJCQkJZHJtX21tX3B1dF9ibG9jayhhbGlnbl9zcGxpdG9mZik7CgkJCXJldHVybiBOVUxMOwoJCX0KCX0KCWlmIChhbGlnbl9zcGxpdG9mZikKCQlkcm1fbW1fcHV0X2Jsb2NrKGFsaWduX3NwbGl0b2ZmKTsKCglyZXR1cm4gY2hpbGQ7Cn0KCi8qCiAqIFB1dCBhIGJsb2NrLiBNZXJnZSB3aXRoIHRoZSBwcmV2aW91cyBhbmQgLyBvciBuZXh0IGJsb2NrIGlmIHRoZXkgYXJlIGZyZWUuCiAqIE90aGVyd2lzZSBhZGQgdG8gdGhlIGZyZWUgc3RhY2suCiAqLwoKdm9pZCBkcm1fbW1fcHV0X2Jsb2NrKGRybV9tbV9ub2RlX3QgKiBjdXIpCnsKCglkcm1fbW1fdCAqbW0gPSBjdXItPm1tOwoJc3RydWN0IGxpc3RfaGVhZCAqY3VyX2hlYWQgPSAmY3VyLT5tbF9lbnRyeTsKCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZtbS0+bWxfZW50cnk7Cglkcm1fbW1fbm9kZV90ICpwcmV2X25vZGUgPSBOVUxMOwoJZHJtX21tX25vZGVfdCAqbmV4dF9ub2RlOwoKCWludCBtZXJnZWQgPSAwOwoKCWlmIChjdXJfaGVhZC0+cHJldiAhPSByb290X2hlYWQpIHsKCQlwcmV2X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5wcmV2LCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CgkJaWYgKHByZXZfbm9kZS0+ZnJlZSkgewoJCQlwcmV2X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwoJCQltZXJnZWQgPSAxOwoJCX0KCX0KCWlmIChjdXJfaGVhZC0+bmV4dCAhPSByb290X2hlYWQpIHsKCQluZXh0X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5uZXh0LCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CgkJaWYgKG5leHRfbm9kZS0+ZnJlZSkgewoJCQlpZiAobWVyZ2VkKSB7CgkJCQlwcmV2X25vZGUtPnNpemUgKz0gbmV4dF9ub2RlLT5zaXplOwoJCQkJbGlzdF9kZWwoJm5leHRfbm9kZS0+bWxfZW50cnkpOwoJCQkJbGlzdF9kZWwoJm5leHRfbm9kZS0+ZmxfZW50cnkpOwoJCQkJZHJtX2N0bF9mcmVlKG5leHRfbm9kZSwgc2l6ZW9mKCpuZXh0X25vZGUpLAoJCQkJCSAgICAgRFJNX01FTV9NTSk7CgkJCX0gZWxzZSB7CgkJCQluZXh0X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwoJCQkJbmV4dF9ub2RlLT5zdGFydCA9IGN1ci0+c3RhcnQ7CgkJCQltZXJnZWQgPSAxOwoJCQl9CgkJfQoJfQoJaWYgKCFtZXJnZWQpIHsKCQljdXItPmZyZWUgPSAxOwoJCWxpc3RfYWRkKCZjdXItPmZsX2VudHJ5LCAmbW0tPmZsX2VudHJ5KTsKCX0gZWxzZSB7CgkJbGlzdF9kZWwoJmN1ci0+bWxfZW50cnkpOwoJCWRybV9jdGxfZnJlZShjdXIsIHNpemVvZigqY3VyKSwgRFJNX01FTV9NTSk7Cgl9Cn0KCmRybV9tbV9ub2RlX3QgKmRybV9tbV9zZWFyY2hfZnJlZShjb25zdCBkcm1fbW1fdCAqIG1tLAoJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgaW50IGJlc3RfbWF0Y2gpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Cgljb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX3N0YWNrID0gJm1tLT5mbF9lbnRyeTsKCWRybV9tbV9ub2RlX3QgKmVudHJ5OwoJZHJtX21tX25vZGVfdCAqYmVzdDsKCXVuc2lnbmVkIGxvbmcgYmVzdF9zaXplOwoJdW5zaWduZWQgd2FzdGVkOwoKCWJlc3QgPSBOVUxMOwoJYmVzdF9zaXplID0gfjBVTDsKCglsaXN0X2Zvcl9lYWNoKGxpc3QsIGZyZWVfc3RhY2spIHsKCQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21tX25vZGVfdCwgZmxfZW50cnkpOwoJCXdhc3RlZCA9IDA7CgoJCWlmIChhbGlnbm1lbnQpIHsKCQkJcmVnaXN0ZXIgdW5zaWduZWQgdG1wID0gc2l6ZSAlIGFsaWdubWVudDsKCQkJaWYgKHRtcCkgCgkJCQl3YXN0ZWQgKz0gYWxpZ25tZW50IC0gdG1wOwoJCX0KCgoJCWlmIChlbnRyeS0+c2l6ZSA+PSBzaXplICsgd2FzdGVkKSB7CgkJCWlmICghYmVzdF9tYXRjaCkKCQkJCXJldHVybiBlbnRyeTsKCQkJaWYgKHNpemUgPCBiZXN0X3NpemUpIHsKCQkJCWJlc3QgPSBlbnRyeTsKCQkJCWJlc3Rfc2l6ZSA9IGVudHJ5LT5zaXplOwoJCQl9CgkJfQoJfQoKCXJldHVybiBiZXN0Owp9CgppbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICogbW0pCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbW0tPm1sX2VudHJ5OwoKCXJldHVybiAoaGVhZC0+bmV4dC0+bmV4dCA9PSBoZWFkKTsKfQoKaW50IGRybV9tbV9pbml0KGRybV9tbV90ICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbF9lbnRyeSk7CglJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKCglyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIHN0YXJ0LCBzaXplKTsKfQoKRVhQT1JUX1NZTUJPTChkcm1fbW1faW5pdCk7Cgp2b2lkIGRybV9tbV90YWtlZG93bihkcm1fbW1fdCAqIG1tKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpibm9kZSA9IG1tLT5mbF9lbnRyeS5uZXh0OwoJZHJtX21tX25vZGVfdCAqZW50cnk7CgoJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBkcm1fbW1fbm9kZV90LCBmbF9lbnRyeSk7CgoJaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+bWxfZW50cnkgfHwKCSAgICBlbnRyeS0+ZmxfZW50cnkubmV4dCAhPSAmbW0tPmZsX2VudHJ5KSB7CgkJRFJNX0VSUk9SKCJNZW1vcnkgbWFuYWdlciBub3QgY2xlYW4uIERlbGF5aW5nIHRha2Vkb3duXG4iKTsKCQlyZXR1cm47Cgl9CgoJbGlzdF9kZWwoJmVudHJ5LT5mbF9lbnRyeSk7CglsaXN0X2RlbCgmZW50cnktPm1sX2VudHJ5KTsKCWRybV9jdGxfZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fTU0pOwp9CgpFWFBPUlRfU1lNQk9MKGRybV9tbV90YWtlZG93bik7Cg==