LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA4IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBDZWRhciBQYXJrLCBUWC4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiBDb3B5cmlnaHQgMjAwOSBWTXdhcmUsIEluYy4sIFBhbG8gQWx0bywgQ0EuLCBVU0EKICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICogZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQogKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwogKiBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAogKiBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IKICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRQogKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmZGVmIEhBVkVfQ09ORklHX0gKI2luY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgIndzYm1fZHJpdmVyLmgiCgpzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqd3NibUN1clRocmVhZEZ1bmMgPSBOVUxMOwpzdHJ1Y3QgX1dzYm1WTm9kZUZ1bmNzICp3c2JtQ3VyVk5vZGVGdW5jID0gTlVMTDsKCi8qCiAqIFNpbmdsZS10aHJlYWRlZCBpbXBsZW1lbnRhdGlvbi4KICovCgpzdGF0aWMgaW50Cm5fbXV0ZXhJbml0KHN0cnVjdCBfV3NibU11dGV4ICptdXRleCwgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmMpCnsKICAgIG11dGV4LT5mdW5jID0gZnVuYzsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cm5fY29uZEluaXQoc3RydWN0IF9Xc2JtQ29uZCAqY29uZCwgc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKmZ1bmMpCnsKICAgIGNvbmQtPmZ1bmMgPSBmdW5jOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCm5fbXV0ZXhOb25lKHN0cnVjdCBfV3NibU11dGV4ICptdXRleCkKewogICAgOwp9CgpzdGF0aWMgdm9pZApuX2NvbmROb25lKHN0cnVjdCBfV3NibUNvbmQgKmNvbmQpCnsKICAgIDsKfQoKc3RhdGljIHZvaWQKbl9jb25kV2FpdChzdHJ1Y3QgX1dzYm1Db25kICpjb25kLCBzdHJ1Y3QgX1dzYm1NdXRleCAqbXV0ZXgpCnsKICAgIDsKfQoKc3RhdGljIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzIG51bGxGdW5jID0gewogICAgLm11dGV4SW5pdCA9IG5fbXV0ZXhJbml0LAogICAgLm11dGV4RnJlZSA9IG5fbXV0ZXhOb25lLAogICAgLm11dGV4TG9jayA9IG5fbXV0ZXhOb25lLAogICAgLm11dGV4VW5sb2NrID0gbl9tdXRleE5vbmUsCiAgICAuY29uZEluaXQgPSBuX2NvbmRJbml0LAogICAgLmNvbmRGcmVlID0gbl9jb25kTm9uZSwKICAgIC5jb25kV2FpdCA9IG5fY29uZFdhaXQsCiAgICAuY29uZEJyb2FkY2FzdCA9IG5fY29uZE5vbmUKfTsKCnN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICoKd3NibU51bGxUaHJlYWRGdW5jcyh2b2lkKQp7CiAgICByZXR1cm4gJm51bGxGdW5jOwp9CgojaWYgKEhBVkVfUFRIUkVBRFMgPT0gMSkKI2luY2x1ZGUgInB0aHJlYWQuaCIKCi8qCiAqIHB0aHJlYWRzIGltcGxlbWVudGF0aW9uOgogKi8KCnN0cnVjdCBfV3NibVBNdXRleAp7CiAgICBzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqZnVuYzsKICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKfTsKCnN0cnVjdCBfV3NibVBDb25kCnsKICAgIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICpmdW5jOwogICAgcHRocmVhZF9jb25kX3QgY29uZDsKfTsKCnN0YXRpYyBpbmxpbmUgc3RydWN0IF9Xc2JtUE11dGV4ICoKcE11dGV4Q29udmVydChzdHJ1Y3QgX1dzYm1NdXRleCAqbSkKewogICAgdW5pb24gX1BNdXRleENvbnZlcnRlcgogICAgewoJc3RydWN0IF9Xc2JtTXV0ZXggd207CglzdHJ1Y3QgX1dzYm1QTXV0ZXggcG07CiAgICB9ICAqdW0gPSBjb250YWluZXJPZihtLCB1bmlvbiBfUE11dGV4Q29udmVydGVyLCB3bSk7CgogICAgcmV0dXJuICZ1bS0+cG07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IF9Xc2JtUENvbmQgKgpwQ29uZENvbnZlcnQoc3RydWN0IF9Xc2JtQ29uZCAqYykKewogICAgdW5pb24gX1BDb25kQ29udmVydGVyCiAgICB7CglzdHJ1Y3QgX1dzYm1Db25kIHdjOwoJc3RydWN0IF9Xc2JtUENvbmQgcGM7CiAgICB9ICAqdWMgPSBjb250YWluZXJPZihjLCB1bmlvbiBfUENvbmRDb252ZXJ0ZXIsIHdjKTsKCiAgICByZXR1cm4gJnVjLT5wYzsKfQoKc3RhdGljIGludApwX211dGV4SW5pdChzdHJ1Y3QgX1dzYm1NdXRleCAqbXV0ZXgsIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICpmdW5jKQp7CiAgICBzdHJ1Y3QgX1dzYm1QTXV0ZXggKnBNdXRleCA9IHBNdXRleENvbnZlcnQobXV0ZXgpOwoKICAgIGlmIChzaXplb2Yoc3RydWN0IF9Xc2JtTXV0ZXgpIDwgc2l6ZW9mKHN0cnVjdCBfV3NibVBNdXRleCkpCglyZXR1cm4gLUVJTlZBTDsKCiAgICBwTXV0ZXgtPmZ1bmMgPSBmdW5jOwogICAgcHRocmVhZF9tdXRleF9pbml0KCZwTXV0ZXgtPm11dGV4LCBOVUxMKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZApwX211dGV4RnJlZShzdHJ1Y3QgX1dzYm1NdXRleCAqbXV0ZXgpCnsKICAgIHN0cnVjdCBfV3NibVBNdXRleCAqcE11dGV4ID0gcE11dGV4Q29udmVydChtdXRleCk7CgogICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZwTXV0ZXgtPm11dGV4KTsKfQoKc3RhdGljIHZvaWQKcF9tdXRleExvY2soc3RydWN0IF9Xc2JtTXV0ZXggKm11dGV4KQp7CiAgICBzdHJ1Y3QgX1dzYm1QTXV0ZXggKnBNdXRleCA9IHBNdXRleENvbnZlcnQobXV0ZXgpOwoKICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcE11dGV4LT5tdXRleCk7Cn0KCnN0YXRpYyB2b2lkCnBfbXV0ZXhVbmxvY2soc3RydWN0IF9Xc2JtTXV0ZXggKm11dGV4KQp7CiAgICBzdHJ1Y3QgX1dzYm1QTXV0ZXggKnBNdXRleCA9IHBNdXRleENvbnZlcnQobXV0ZXgpOwoKICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwTXV0ZXgtPm11dGV4KTsKfQoKc3RhdGljIGludApwX2NvbmRJbml0KHN0cnVjdCBfV3NibUNvbmQgKmNvbmQsIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzICpmdW5jKQp7CiAgICBzdHJ1Y3QgX1dzYm1QQ29uZCAqcENvbmQgPSBwQ29uZENvbnZlcnQoY29uZCk7CgogICAgaWYgKHNpemVvZihzdHJ1Y3QgX1dzYm1Db25kKSA8IHNpemVvZihzdHJ1Y3QgX1dzYm1QQ29uZCkpCglyZXR1cm4gLUVJTlZBTDsKCiAgICBwQ29uZC0+ZnVuYyA9IGZ1bmM7CiAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcENvbmQtPmNvbmQsIE5VTEwpOwogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnBfY29uZEZyZWUoc3RydWN0IF9Xc2JtQ29uZCAqY29uZCkKewogICAgc3RydWN0IF9Xc2JtUENvbmQgKnBDb25kID0gcENvbmRDb252ZXJ0KGNvbmQpOwoKICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZwQ29uZC0+Y29uZCk7Cn0KCnN0YXRpYyB2b2lkCnBfY29uZEJyb2FkY2FzdChzdHJ1Y3QgX1dzYm1Db25kICpjb25kKQp7CiAgICBzdHJ1Y3QgX1dzYm1QQ29uZCAqcENvbmQgPSBwQ29uZENvbnZlcnQoY29uZCk7CgogICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcENvbmQtPmNvbmQpOwp9CgpzdGF0aWMgdm9pZApwX2NvbmRXYWl0KHN0cnVjdCBfV3NibUNvbmQgKmNvbmQsIHN0cnVjdCBfV3NibU11dGV4ICptdXRleCkKewogICAgc3RydWN0IF9Xc2JtUENvbmQgKnBDb25kID0gcENvbmRDb252ZXJ0KGNvbmQpOwogICAgc3RydWN0IF9Xc2JtUE11dGV4ICpwTXV0ZXggPSBwTXV0ZXhDb252ZXJ0KG11dGV4KTsKCiAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcENvbmQtPmNvbmQsICZwTXV0ZXgtPm11dGV4KTsKfQoKc3RhdGljIHN0cnVjdCBfV3NibVRocmVhZEZ1bmNzIHB0aHJlYWRGdW5jID0gewogICAgLm11dGV4SW5pdCA9IHBfbXV0ZXhJbml0LAogICAgLm11dGV4RnJlZSA9IHBfbXV0ZXhGcmVlLAogICAgLm11dGV4TG9jayA9IHBfbXV0ZXhMb2NrLAogICAgLm11dGV4VW5sb2NrID0gcF9tdXRleFVubG9jaywKICAgIC5jb25kSW5pdCA9IHBfY29uZEluaXQsCiAgICAuY29uZEZyZWUgPSBwX2NvbmRGcmVlLAogICAgLmNvbmRXYWl0ID0gcF9jb25kV2FpdCwKICAgIC5jb25kQnJvYWRjYXN0ID0gcF9jb25kQnJvYWRjYXN0Cn07CgpzdHJ1Y3QgX1dzYm1UaHJlYWRGdW5jcyAqCndzYm1QVGhyZWFkRnVuY3Modm9pZCkKewogICAgcmV0dXJuICZwdGhyZWFkRnVuYzsKfQoKI2Vsc2UKI3dhcm5pbmcgUHRocmVhZHMgaXMgbm90IHByZXNlbnQuIENvbXBpbGluZyB3aXRob3V0LgoKc3RydWN0IF9Xc2JtVGhyZWFkRnVuY3MgKgp3c2JtUFRocmVhZEZ1bmNzKHZvaWQpCnsKICAgIHJldHVybiAmcHRocmVhZEZ1bmM7Cn0KCiNlbmRpZgo=