LyoKICogSUJNIEFTTSBTZXJ2aWNlIFByb2Nlc3NvciBEZXZpY2UgRHJpdmVyCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAqCiAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA0CiAqCiAqIEF1dGhvcjogTWF4IEFzYvZjayA8YW1heEB1cy5pYm0uY29tPgogKgogKi8KCiNpbmNsdWRlICJpYm1hc20uaCIKI2luY2x1ZGUgImxvd2xldmVsLmgiCiNpbmNsdWRlICJpMm8uaCIKI2luY2x1ZGUgImRvdF9jb21tYW5kLmgiCiNpbmNsdWRlICJyZW1vdGUuaCIKCnN0YXRpYyBzdHJ1Y3QgaTJvX2hlYWRlciBoZWFkZXIgPSBJMk9fSEVBREVSX1RFTVBMQVRFOwoKCmludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKQp7Cgl1MzIgbWZhOwoJdW5zaWduZWQgaW50IGNvbW1hbmRfc2l6ZTsKCXN0cnVjdCBpMm9fbWVzc2FnZSAqbWVzc2FnZTsKCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gc3AtPmN1cnJlbnRfY29tbWFuZDsKCgltZmEgPSBnZXRfbWZhX2luYm91bmQoc3AtPmJhc2VfYWRkcmVzcyk7CglpZiAoIW1mYSkKCQlyZXR1cm4gMTsKCgljb21tYW5kX3NpemUgPSBnZXRfZG90X2NvbW1hbmRfc2l6ZShjb21tYW5kLT5idWZmZXIpOwoJaGVhZGVyLm1lc3NhZ2Vfc2l6ZSA9IG91dGdvaW5nX21lc3NhZ2Vfc2l6ZShjb21tYW5kX3NpemUpOwoKCW1lc3NhZ2UgPSBnZXRfaTJvX21lc3NhZ2Uoc3AtPmJhc2VfYWRkcmVzcywgbWZhKTsKCgltZW1jcHlfdG9pbygmbWVzc2FnZS0+aGVhZGVyLCAmaGVhZGVyLCBzaXplb2Yoc3RydWN0IGkyb19oZWFkZXIpKTsKCW1lbWNweV90b2lvKCZtZXNzYWdlLT5kYXRhLCBjb21tYW5kLT5idWZmZXIsIGNvbW1hbmRfc2l6ZSk7CgoJc2V0X21mYV9pbmJvdW5kKHNwLT5iYXNlX2FkZHJlc3MsIG1mYSk7CgoJcmV0dXJuIDA7Cn0KCmlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKQp7Cgl1MzIJbWZhOwoJc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCA9IChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKilkZXZfaWQ7Cgl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcyA9IHNwLT5iYXNlX2FkZHJlc3M7CgljaGFyIHRzYnVmWzMyXTsKCglpZiAoIXNwX2ludGVycnVwdF9wZW5kaW5nKGJhc2VfYWRkcmVzcykpCgkJcmV0dXJuIElSUV9OT05FOwoKCWRiZygicmVzcG9uZCB0byBpbnRlcnJ1cHQgYXQgJXNcbiIsIGdldF90aW1lc3RhbXAodHNidWYpKTsKCglpZiAobW91c2VfaW50ZXJydXB0X3BlbmRpbmcoc3ApKSB7CgkJaWJtYXNtX2hhbmRsZV9tb3VzZV9pbnRlcnJ1cHQoc3ApOwoJCWNsZWFyX21vdXNlX2ludGVycnVwdChzcCk7Cgl9CgoJbWZhID0gZ2V0X21mYV9vdXRib3VuZChiYXNlX2FkZHJlc3MpOwoJaWYgKHZhbGlkX21mYShtZmEpKSB7CgkJc3RydWN0IGkyb19tZXNzYWdlICptc2cgPSBnZXRfaTJvX21lc3NhZ2UoYmFzZV9hZGRyZXNzLCBtZmEpOwoJCWlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3AsICZtc2ctPmRhdGEsIGluY29taW5nX2RhdGFfc2l6ZShtc2cpKTsKCX0gZWxzZQoJCWRiZygiZGlkbid0IGdldCBhIHZhbGlkIE1GQVxuIik7CgoJc2V0X21mYV9vdXRib3VuZChiYXNlX2FkZHJlc3MsIG1mYSk7CglkYmcoImZpbmlzaGVkIGludGVycnVwdCBhdCAgICVzXG4iLCBnZXRfdGltZXN0YW1wKHRzYnVmKSk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9Cg==