LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgWE1TIGVtdWxhdGlvbiBpcyBob29rZWQgdGhyb3VnaCB0aGUgRFBNSSBpbnRlcnJ1cHQuCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAibW9kdWxlLmgiCiNpbmNsdWRlICJtaXNjZW11LmgiCiNpbmNsdWRlICJ0b29saGVscC5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGludDMxKTsKCnR5cGVkZWYgc3RydWN0IHsKIFdPUkQgSGFuZGxlOwogRFdPUkQgT2Zmc2V0Owp9IFdJTkVfUEFDS0VEIE1PVkVPRlM7Cgp0eXBlZGVmIHN0cnVjdCB7CiBEV09SRCBMZW5ndGg7CiBNT1ZFT0ZTIFNvdXJjZTsKIE1PVkVPRlMgRGVzdDsKfSBXSU5FX1BBQ0tFRCBNT1ZFU1RSVUNUOwoKc3RhdGljIEJZVEUgKiBYTVNfT2Zmc2V0KCBNT1ZFT0ZTICpvZnMgKQp7CiAgICBpZiAob2ZzLT5IYW5kbGUpIHJldHVybiAoQllURSopR2xvYmFsTG9jazE2KG9mcy0+SGFuZGxlKStvZnMtPk9mZnNldDsKICAgICAgICBlbHNlIHJldHVybiAoQllURSopRE9TTUVNX01hcFJlYWxUb0xpbmVhcihvZnMtPk9mZnNldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgICBYTVNfSGFuZGxlcgogKi8KCnZvaWQgV0lOQVBJIFhNU19IYW5kbGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBzd2l0Y2goQUhfcmVnKGNvbnRleHQpKQogICAgewogICAgY2FzZSAweDAwOiAgIC8qIEdldCBYTVMgdmVyc2lvbiBudW1iZXIgKi8KICAgICAgICBUUkFDRSgiZ2V0IFhNUyB2ZXJzaW9uIG51bWJlclxuIik7CiAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMjAwOyAvKiAyLjAgKi8KICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGludGVybmFsIHJldmlzaW9uICovCiAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwMDAxOyAvKiBITUEgZXhpc3RzICovCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDg6ICAgLyogUXVlcnkgRnJlZSBFeHRlbmRlZCBNZW1vcnkgKi8KICAgIHsKCU1FTU1BTklORk8gbW1pOwoKICAgICAgICBUUkFDRSgicXVlcnkgZnJlZSBleHRlbmRlZCBtZW1vcnlcbiIpOwoJbW1pLmR3U2l6ZSA9IHNpemVvZihtbWkpOwoJTWVtTWFuSW5mbzE2KCZtbWkpOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IG1taS5kd0xhcmdlc3RGcmVlQmxvY2sgPj4gMTA7CiAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gKG1taS5kd0ZyZWVQYWdlcyAqIG1taS53UGFnZVNpemUpID4+IDEwOwogICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbGFyZ2VzdCAlZEssIHRvdGFsICVkS1xuIiwgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgfQogICAgYnJlYWs7CiAgICBjYXNlIDB4MDk6ICAgLyogQWxsb2NhdGUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICAgICAgVFJBQ0UoImFsbG9jYXRlIGV4dGVuZGVkIG1lbW9yeSBibG9jayAoJWRLKVxuIiwKICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKTsKCURYX3JlZyhjb250ZXh0KSA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwKCSAgICAoRFdPUkQpRFhfcmVnKGNvbnRleHQpPDwxMCk7CglBWF9yZWcoY29udGV4dCkgPSBEWF9yZWcoY29udGV4dCkgPyAxIDogMDsKCWlmICghRFhfcmVnKGNvbnRleHQpKSBCTF9yZWcoY29udGV4dCkgPSAweEEwOyAvKiBvdXQgb2YgbWVtb3J5ICovCglicmVhazsKICAgIGNhc2UgMHgwYTogICAvKiBGcmVlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwoJVFJBQ0UoImZyZWUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrICUwNHhcbiIsRFhfcmVnKGNvbnRleHQpKTsKCUdsb2JhbEZyZWUxNihEWF9yZWcoY29udGV4dCkpOwoJYnJlYWs7CiAgICBjYXNlIDB4MGI6ICAgLyogTW92ZSBFeHRlbmRlZCBNZW1vcnkgQmxvY2sgKi8KICAgIHsKCU1PVkVTVFJVQ1QqbW92ZT1DVFhfU0VHX09GRl9UT19MSU4oY29udGV4dCwKCSAgICBjb250ZXh0LT5TZWdEcyxjb250ZXh0LT5Fc2kpOwogICAgICAgIEJZVEUqc3JjLCpkc3Q7CiAgICAgICAgVFJBQ0UoIm1vdmUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrXG4iKTsKICAgICAgICBzcmM9WE1TX09mZnNldCgmbW92ZS0+U291cmNlKTsKICAgICAgICBkc3Q9WE1TX09mZnNldCgmbW92ZS0+RGVzdCk7CgltZW1jcHkoZHN0LHNyYyxtb3ZlLT5MZW5ndGgpOwoJaWYgKG1vdmUtPlNvdXJjZS5IYW5kbGUpIEdsb2JhbFVubG9jazE2KG1vdmUtPlNvdXJjZS5IYW5kbGUpOwoJaWYgKG1vdmUtPkRlc3QuSGFuZGxlKSBHbG9iYWxVbmxvY2sxNihtb3ZlLT5EZXN0LkhhbmRsZSk7CglicmVhazsKICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MzEgKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGZhaWx1cmUgKi8KICAgICAgICBCTF9yZWcoY29udGV4dCkgPSAweDgwOyAgIC8qIGZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogICAgICAgIGJyZWFrOwogICAgfQp9Cg==