LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBOb3RlOiBUaGlzIFhNUyBlbXVsYXRpb24gaXMgaG9va2VkIHRocm91Z2ggdGhlIERQTUkgaW50ZXJydXB0LgogKi8KCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luZS93aW5iYXNlMTYuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAidG9vbGhlbHAuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGludDMxKTsKCnR5cGVkZWYgc3RydWN0IHsKIFdPUkQgSGFuZGxlOwogRFdPUkQgT2Zmc2V0Owp9IFdJTkVfUEFDS0VEIE1PVkVPRlM7Cgp0eXBlZGVmIHN0cnVjdCB7CiBEV09SRCBMZW5ndGg7CiBNT1ZFT0ZTIFNvdXJjZTsKIE1PVkVPRlMgRGVzdDsKfSBXSU5FX1BBQ0tFRCBNT1ZFU1RSVUNUOwoKc3RhdGljIEJZVEUgKiBYTVNfT2Zmc2V0KCBNT1ZFT0ZTICpvZnMgKQp7CiAgICBpZiAob2ZzLT5IYW5kbGUpIHJldHVybiAoQllURSopR2xvYmFsTG9jazE2KG9mcy0+SGFuZGxlKStvZnMtPk9mZnNldDsKICAgICAgICBlbHNlIHJldHVybiAoQllURSopRE9TTUVNX01hcFJlYWxUb0xpbmVhcihvZnMtPk9mZnNldCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCSAgICBYTVNfSGFuZGxlcgogKi8KCnZvaWQgV0lOQVBJIFhNU19IYW5kbGVyKCBDT05URVhUODYgKmNvbnRleHQgKQp7CiAgICBzd2l0Y2goQUhfcmVnKGNvbnRleHQpKQogICAgewogICAgY2FzZSAweDAwOiAgIC8qIEdldCBYTVMgdmVyc2lvbiBudW1iZXIgKi8KICAgICAgICBUUkFDRSgiZ2V0IFhNUyB2ZXJzaW9uIG51bWJlclxuIik7CiAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMjAwOyAvKiAyLjAgKi8KICAgICAgICBCWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGludGVybmFsIHJldmlzaW9uICovCiAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwMDAxOyAvKiBITUEgZXhpc3RzICovCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDB4MDg6ICAgLyogUXVlcnkgRnJlZSBFeHRlbmRlZCBNZW1vcnkgKi8KICAgIHsKCU1FTU1BTklORk8gbW1pOwoKICAgICAgICBUUkFDRSgicXVlcnkgZnJlZSBleHRlbmRlZCBtZW1vcnlcbiIpOwoJbW1pLmR3U2l6ZSA9IHNpemVvZihtbWkpOwoJTWVtTWFuSW5mbzE2KCZtbWkpOwogICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IG1taS5kd0xhcmdlc3RGcmVlQmxvY2sgPj4gMTA7CiAgICAgICAgRFhfcmVnKGNvbnRleHQpID0gKG1taS5kd0ZyZWVQYWdlcyAqIG1taS53UGFnZVNpemUpID4+IDEwOwogICAgICAgIFRSQUNFKCJyZXR1cm5pbmcgbGFyZ2VzdCAlZEssIHRvdGFsICVkS1xuIiwgQVhfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgfQogICAgYnJlYWs7CiAgICBjYXNlIDB4MDk6ICAgLyogQWxsb2NhdGUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICAgICAgVFJBQ0UoImFsbG9jYXRlIGV4dGVuZGVkIG1lbW9yeSBibG9jayAoJWRLKVxuIiwKICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKTsKCURYX3JlZyhjb250ZXh0KSA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwKCSAgICAoRFdPUkQpRFhfcmVnKGNvbnRleHQpPDwxMCk7CglBWF9yZWcoY29udGV4dCkgPSBEWF9yZWcoY29udGV4dCkgPyAxIDogMDsKCWlmICghRFhfcmVnKGNvbnRleHQpKSBCTF9yZWcoY29udGV4dCkgPSAweEEwOyAvKiBvdXQgb2YgbWVtb3J5ICovCglicmVhazsKICAgIGNhc2UgMHgwYTogICAvKiBGcmVlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwoJVFJBQ0UoImZyZWUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrICUwNHhcbiIsRFhfcmVnKGNvbnRleHQpKTsKICAgICAgIGlmKCFEWF9yZWcoY29udGV4dCkgfHwgR2xvYmFsRnJlZTE2KERYX3JlZyhjb250ZXh0KSkpIHsKICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMDsgICAgLyogZmFpbHVyZSAqLwogICAgICAgICBCTF9yZWcoY29udGV4dCkgPSAweGEyOyAvKiBpbnZhbGlkIGhhbmRsZSAqLwogICAgICAgfSBlbHNlCiAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IDE7ICAgIC8qIHN1Y2Nlc3MgKi8KCWJyZWFrOwogICAgY2FzZSAweDBiOiAgIC8qIE1vdmUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICB7CglNT1ZFU1RSVUNUKm1vdmU9Q1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsCgkgICAgY29udGV4dC0+U2VnRHMsY29udGV4dC0+RXNpKTsKICAgICAgICBCWVRFKnNyYywqZHN0OwogICAgICAgIFRSQUNFKCJtb3ZlIGV4dGVuZGVkIG1lbW9yeSBibG9ja1xuIik7CiAgICAgICAgc3JjPVhNU19PZmZzZXQoJm1vdmUtPlNvdXJjZSk7CiAgICAgICAgZHN0PVhNU19PZmZzZXQoJm1vdmUtPkRlc3QpOwoJbWVtY3B5KGRzdCxzcmMsbW92ZS0+TGVuZ3RoKTsKCWlmIChtb3ZlLT5Tb3VyY2UuSGFuZGxlKSBHbG9iYWxVbmxvY2sxNihtb3ZlLT5Tb3VyY2UuSGFuZGxlKTsKCWlmIChtb3ZlLT5EZXN0LkhhbmRsZSkgR2xvYmFsVW5sb2NrMTYobW92ZS0+RGVzdC5IYW5kbGUpOwoJYnJlYWs7CiAgICB9CiAgICBkZWZhdWx0OgogICAgICAgIElOVF9CQVJGKCBjb250ZXh0LCAweDMxICk7CiAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gMHgwMDAwOyAvKiBmYWlsdXJlICovCiAgICAgICAgQkxfcmVnKGNvbnRleHQpID0gMHg4MDsgICAvKiBmdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQgKi8KICAgICAgICBicmVhazsKICAgIH0KfQo=