ZGlmZiAtLWdpdCBhL21jdS9kcml2ZXIvZGV2ZHJ2L2VjdC9zcmMvZWN0LmMgYi9tY3UvZHJpdmVyL2RldmRydi9lY3Qvc3JjL2VjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDE2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvZHJpdmVyL2RldmRydi9lY3Qvc3JjL2VjdC5jCkBAIC0wLDAgKzEsMTAwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb3B5cmlnaHQgU3RhdGVtZW50OgorKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogIFRoaXMgc29mdHdhcmUgaXMgcHJvdGVjdGVkIGJ5IENvcHlyaWdodCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZAorKiAgaGVyZWluIGlzIGNvbmZpZGVudGlhbC4gVGhlIHNvZnR3YXJlIG1heSBub3QgYmUgY29waWVkIGFuZCB0aGUgaW5mb3JtYXRpb24KKyogIGNvbnRhaW5lZCBoZXJlaW4gbWF5IG5vdCBiZSB1c2VkIG9yIGRpc2Nsb3NlZCBleGNlcHQgd2l0aCB0aGUgd3JpdHRlbgorKiAgcGVybWlzc2lvbiBvZiBNZWRpYVRlayBJbmMuIChDKSAyMDA1CisqCisqICBCWSBPUEVOSU5HIFRISVMgRklMRSwgQlVZRVIgSEVSRUJZIFVORVFVSVZPQ0FMTFkgQUNLTk9XTEVER0VTIEFORCBBR1JFRVMKKyogIFRIQVQgVEhFIFNPRlRXQVJFL0ZJUk1XQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTlMgKCJNRURJQVRFSyBTT0ZUV0FSRSIpCisqICBSRUNFSVZFRCBGUk9NIE1FRElBVEVLIEFORC9PUiBJVFMgUkVQUkVTRU5UQVRJVkVTIEFSRSBQUk9WSURFRCBUTyBCVVlFUiBPTgorKiAgQU4gIkFTLUlTIiBCQVNJUyBPTkxZLiBNRURJQVRFSyBFWFBSRVNTTFkgRElTQ0xBSU1TIEFOWSBBTkQgQUxMIFdBUlJBTlRJRVMsCisqICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBOT05JTkZSSU5HRU1FTlQuCisqICBORUlUSEVSIERPRVMgTUVESUFURUsgUFJPVklERSBBTlkgV0FSUkFOVFkgV0hBVFNPRVZFUiBXSVRIIFJFU1BFQ1QgVE8gVEhFCisqICBTT0ZUV0FSRSBPRiBBTlkgVEhJUkQgUEFSVFkgV0hJQ0ggTUFZIEJFIFVTRUQgQlksIElOQ09SUE9SQVRFRCBJTiwgT1IKKyogIFNVUFBMSUVEIFdJVEggVEhFIE1FRElBVEVLIFNPRlRXQVJFLCBBTkQgQlVZRVIgQUdSRUVTIFRPIExPT0sgT05MWSBUTyBTVUNICisqICBUSElSRCBQQVJUWSBGT1IgQU5ZIFdBUlJBTlRZIENMQUlNIFJFTEFUSU5HIFRIRVJFVE8uIE1FRElBVEVLIFNIQUxMIEFMU08KKyogIE5PVCBCRSBSRVNQT05TSUJMRSBGT1IgQU5ZIE1FRElBVEVLIFNPRlRXQVJFIFJFTEVBU0VTIE1BREUgVE8gQlVZRVInUworKiAgU1BFQ0lGSUNBVElPTiBPUiBUTyBDT05GT1JNIFRPIEEgUEFSVElDVUxBUiBTVEFOREFSRCBPUiBPUEVOIEZPUlVNLgorKgorKiAgQlVZRVInUyBTT0xFIEFORCBFWENMVVNJVkUgUkVNRURZIEFORCBNRURJQVRFSydTIEVOVElSRSBBTkQgQ1VNVUxBVElWRQorKiAgTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUgTUVESUFURUsgU09GVFdBUkUgUkVMRUFTRUQgSEVSRVVOREVSIFdJTEwgQkUsCisqICBBVCBNRURJQVRFSydTIE9QVElPTiwgVE8gUkVWSVNFIE9SIFJFUExBQ0UgVEhFIE1FRElBVEVLIFNPRlRXQVJFIEFUIElTU1VFLAorKiAgT1IgUkVGVU5EIEFOWSBTT0ZUV0FSRSBMSUNFTlNFIEZFRVMgT1IgU0VSVklDRSBDSEFSR0UgUEFJRCBCWSBCVVlFUiBUTworKiAgTUVESUFURUsgRk9SIFNVQ0ggTUVESUFURUsgU09GVFdBUkUgQVQgSVNTVUUuIAorKgorKiAgVEhFIFRSQU5TQUNUSU9OIENPTlRFTVBMQVRFRCBIRVJFVU5ERVIgU0hBTEwgQkUgQ09OU1RSVUVEIElOIEFDQ09SREFOQ0UKKyogIFdJVEggVEhFIExBV1MgT0YgVEhFIFNUQVRFIE9GIENBTElGT1JOSUEsIFVTQSwgRVhDTFVESU5HIElUUyBDT05GTElDVCBPRgorKiAgTEFXUyBQUklOQ0lQTEVTLiAgQU5ZIERJU1BVVEVTLCBDT05UUk9WRVJTSUVTIE9SIENMQUlNUyBBUklTSU5HIFRIRVJFT0YgQU5ECisqICBSRUxBVEVEIFRIRVJFVE8gU0hBTEwgQkUgU0VUVExFRCBCWSBBUkJJVFJBVElPTiBJTiBTQU4gRlJBTkNJU0NPLCBDQSwgVU5ERVIKKyogIFRIRSBSVUxFUyBPRiBUSEUgSU5URVJOQVRJT05BTCBDSEFNQkVSIE9GIENPTU1FUkNFIChJQ0MpLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOgorICogLS0tLS0tLS0tCisgKiAgIGVjdC5oCisgKgorICogUHJvamVjdDoKKyAqIC0tLS0tLS0tCisgKiAgIE1hdWlfU29mdHdhcmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIC0tLS0tLS0tLS0tLQorICogICBUaGlzIE1vZHVsZSBkZWZpbmVzIHRoZSBIVyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBBdXRob3I6CisgKiAtLS0tLS0tCisgKiAtLS0tLS0tCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgICAgICAgICAgICBISVNUT1JZCisgKiBCZWxvdyB0aGlzIGxpbmUsIHRoaXMgcGFydCBpcyBjb250cm9sbGVkIGJ5IFBWQ1MgVk0uIERPIE5PVCBNT0RJRlkhIQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKgorICoKKyAqIHJlbW92ZWQhCisgKiByZW1vdmVkIQorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFVwcGVyIHRoaXMgbGluZSwgdGhpcyBwYXJ0IGlzIGNvbnRyb2xsZWQgYnkgUFZDUyBWTS4gRE8gTk9UIE1PRElGWSEhCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluY2x1ZGUgaGVhZGVyIGZpbGVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZWN0LmgiCisjaW5jbHVkZSAiaW5pdC5oIgorI2luY2x1ZGUgImludHJDdHJsLmgiCisjaW5jbHVkZSAicmVnX2Jhc2UuaCIKKyNpbmNsdWRlICJzbGVlcGRydl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJleF9wdWJsaWMuaCIKKyNpbmNsdWRlICJrYWxfaXJhbV9zZWN0aW9uX2RlZnMuaCIKKyNpbmNsdWRlICJjcHVfaW5mby5oIgorCisKKworLy8jaWZkZWYgX19MMUNPUkVfXworLy8jaW5jbHVkZSAiUk1fcHVibGljLmgiCisvLyNpbmNsdWRlICJ1c190aW1lci5oIgorLy8jZW5kaWYgLyogX19MMUNPUkVfXyAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYWNybworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFQ1QgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBDVElSRUdTWiAgICAgICAgICAgICAoMHgxMDAwKQorI2RlZmluZSBDVElDT05UUk9MICAgICAgICAgICAoMHgwMCkKKyNkZWZpbmUgQ1RJSU5UQUNLICAgICAgICAgICAgKDB4MTApCisjZGVmaW5lIENUSUlORU4wICAgICAgICAgICAgICgweDIwKQorI2RlZmluZSBDVElJTkVOMSAgICAgICAgICAgICAoMHgyNCkKKyNkZWZpbmUgQ1RJSU5FTjIgICAgICAgICAgICAgKDB4MjgpCisjZGVmaW5lIENUSUlORU4zICAgICAgICAgICAgICgweDJDKQorI2RlZmluZSBDVElJTkVONCAgICAgICAgICAgICAoMHgzMCkKKyNkZWZpbmUgQ1RJSU5FTjUgICAgICAgICAgICAgKDB4MzQpCisjZGVmaW5lIENUSUlORU42ICAgICAgICAgICAgICgweDM4KQorI2RlZmluZSBDVElJTkVONyAgICAgICAgICAgICAoMHgzQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIENUSU9VVEVOMCAgICAgICAgICAgICgweEEwKQorI2RlZmluZSBDVElPVVRFTjEgICAgICAgICAgICAoMHhBNCkKKyNkZWZpbmUgQ1RJT1VURU4yICAgICAgICAgICAgKDB4QTgpCisjZGVmaW5lIENUSU9VVEVOMyAgICAgICAgICAgICgweEFDKQorI2RlZmluZSBDVElPVVRFTjQgICAgICAgICAgICAoMHhiMCkKKyNkZWZpbmUgQ1RJT1VURU41ICAgICAgICAgICAgKDB4QjQpCisjZGVmaW5lIENUSU9VVEVONiAgICAgICAgICAgICgweEI4KQorI2RlZmluZSBDVElPVVRFTjcgICAgICAgICAgICAoMHhCQykKKworI2RlZmluZSBDVElUUklHSU5TVEFUVVMgICAgICAoMHgxMzApCisjZGVmaW5lIENUSVRSSUdPVVRTVEFUVVMgICAgICgweDEzNCkKKyNkZWZpbmUgTEFSICAgICAgICAgICAgICAgICAgKDB4RkIwKQorI2RlZmluZSBMU1IgICAgICAgICAgICAgICAgICAoMHhGQjQpCisjZGVmaW5lIERFVklEICAgICAgICAgICAgICAgICgweEZDOCkKKworI2RlZmluZSBVU0lQX0NUSV9TVEEgICAgICAgICAoMHgxNCkKKyNkZWZpbmUgRFNQX0NUSV9TVEEgICAgICAgICAgKDB4MEMpCisjZGVmaW5lIE1DT1JFX0NUSV9TVEEgICAgICAgICgweDM0KQorI2RlZmluZSBWQ09SRV9DVElfU1RBICAgICAgICAoMHg0NCkKKworLypVU0lQIENUSSBTdGF0dXMqLworI2RlZmluZSBVU0lQMF8wX0NUSV9FVkVOVCAgICAoMTYpCisjZGVmaW5lIFVTSVAwXzFfQ1RJX0VWRU5UICAgICgxNykKKyNkZWZpbmUgVVNJUDFfMF9DVElfRVZFTlQgICAgKDE4KQorI2RlZmluZSBVU0lQMV8xX0NUSV9FVkVOVCAgICAoMTkpCisKKyNkZWZpbmUgVVNJUDBfMF9DVElfRVZFTlRfTUFTSyAgICgxIDw8IFVTSVAwXzBfQ1RJX0VWRU5UKQorI2RlZmluZSBVU0lQMF8xX0NUSV9FVkVOVF9NQVNLICAgKDEgPDwgVVNJUDBfMV9DVElfRVZFTlQpCisjZGVmaW5lIFVTSVAxXzBfQ1RJX0VWRU5UX01BU0sgICAoMSA8PCBVU0lQMV8wX0NUSV9FVkVOVCkKKyNkZWZpbmUgVVNJUDFfMV9DVElfRVZFTlRfTUFTSyAgICgxIDw8IFVTSVAxXzFfQ1RJX0VWRU5UKQorCisvKkRTUCBDVEkgU3RhdHVzKi8KKyNkZWZpbmUgU0NRMF9DVElfRVZFTlQgICAgICAgKDE2KQorI2RlZmluZSBTQ1ExX0NUSV9FVkVOVCAgICAgICAoMTcpCisjZGVmaW5lIFJBS0VfQ1RJX0VWRU5UICAgICAgICgxOCkKKworI2RlZmluZSBSQUtFX0NUSV9FVkVOVF9NQVNLICgxIDw8IFJBS0VfQ1RJX0VWRU5UKQorI2RlZmluZSBTQ1EwX0NUSV9FVkVOVF9NQVNLICgxIDw8IFNDUTBfQ1RJX0VWRU5UKQorI2RlZmluZSBTQ1ExX0NUSV9FVkVOVF9NQVNLICgxIDw8IFNDUTFfQ1RJX0VWRU5UKQorCisjZGVmaW5lIE1DT1JFMF9DVElfRVZFTlQgICAgICgxNikKKyNkZWZpbmUgTUNPUkUxX0NUSV9FVkVOVCAgICAgKDE3KQorCisjZGVmaW5lIE1DT1JFMF9DVElfRVZFTlRfTUFTSyAoMSA8PCBNQ09SRTBfQ1RJX0VWRU5UKQorI2RlZmluZSBNQ09SRTFfQ1RJX0VWRU5UX01BU0sgKDEgPDwgTUNPUkUxX0NUSV9FVkVOVCkKKworI2RlZmluZSBWQ09SRTBfQ1RJX0VWRU5UICAgICAoMTYpCisKKyNkZWZpbmUgVkNPUkUwX0NUSV9FVkVOVF9NQVNLICgxIDw8IFZDT1JFMF9DVElfRVZFTlQpCisKKy8qdGhlIGZvbGxvd2luZyByZWdpc3RlcnMgc2hvdWxkIGJlIDB4MDYsIDB4QjksIDB4NEIsIDB4MCovCisvKiNkZWZpbmUgQ1RJUEVSSVBISUQwICAgICgweEZFMCkqLworLyojZGVmaW5lIENUSVBFUklQSElEMSAgICAoMHhGRTQpKi8KKy8qI2RlZmluZSBDVElQRVJJUEhJRDIgICAgKDB4RkU4KSovCisvKiNkZWZpbmUgQ1RJUEVSSVBISUQzICAgICgweEZFQykqLworCisjZGVmaW5lIENUSV9NQUdJQyAgICAgICAgICgweEM1QUNDRTU1KQorCisvKiBQbGF0Zm9ybSBkZXBlbmRlbnQgc2V0dGluZyAqLworLyogQ1RJIGV2ZW50cyAqLworI2RlZmluZSBJQV9UUklHR0VSX0NUSV9FVkVOVCAgICAgICAgICgweEEwMDYwMUY0KQorCisjaWYgKGRlZmluZWQgKF9fTUQ5N19fKSB8fCBkZWZpbmVkIChfX01EOTdQX18pICkKKyNkZWZpbmUgVVNJUDBfVFJJR0dFUl9DVElfRVZFTlQgICAgICAoMHhBMEUzMDgwMCkKKyNkZWZpbmUgVVNJUDFfVFJJR0dFUl9DVElfRVZFTlQgICAgICAoMHhBMEUzMDgwNCkKKyNkZWZpbmUgVVNJUDJfVFJJR0dFUl9DVElfRVZFTlQgICAgICAoMHhBMEUzMDgwOCkKKyNkZWZpbmUgVVNJUDNfVFJJR0dFUl9DVElfRVZFTlQgICAgICAoMHhBMEUzMDgwQykKKworLy8jZGVmaW5lIFJBS0VfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUMzNTgwMDgpCisjZGVmaW5lIFNDUTBfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUJFMDkwMDgpCisjZGVmaW5lIFNDUTFfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUJGMDkwMDgpCisjZGVmaW5lIFNDUTJfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUMwMDkwMDgpCisjZGVmaW5lIFNDUTNfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUMxMDkwMDgpCisKKworI2RlZmluZSBNQ09SRTBfVFJJR0dFUl9DVElfRVZFTlQgICAgICgweEE0MEM2QzAwKQorI2RlZmluZSBNQ09SRTFfVFJJR0dFUl9DVElfRVZFTlQgICAgICgweEE0NEM2QzAwKQorI2RlZmluZSBWQ09SRTBfVFJJR0dFUl9DVElfRVZFTlQgICAgICgweEE1MEM2QzAwKQorCisjZWxzZSAgLy9HZW45My9HZW45NQorI2RlZmluZSBVU0lQMF9UUklHR0VSX0NUSV9FVkVOVCAgICAgICgweEExNjMwODAwKQorI2RlZmluZSBVU0lQMV9UUklHR0VSX0NUSV9FVkVOVCAgICAgICgweEExNjMwODA0KQorI2RlZmluZSBVU0lQMl9UUklHR0VSX0NUSV9FVkVOVCAgICAgICgweEExNjMwODA4KQorI2RlZmluZSBVU0lQM19UUklHR0VSX0NUSV9FVkVOVCAgICAgICgweEExNjMwODBDKQorCisjZGVmaW5lIFJBS0VfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUMzNTgwMDgpCisjZGVmaW5lIFNDUTBfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUJBMTAwMDgpCisjZGVmaW5lIFNDUTFfVFJJR0dFUl9DVElfRVZFTlQgICAgICAgKDB4QUJCMTAwMDgpCisKKyNlbmRpZiAgLy9pZiBHZW45NworCisjZGVmaW5lIEVDVF9WUEVfTlVNUyAgICBTWVNfTUNVX05VTV9WUEUKKworI2lmIGRlZmluZWQgKF9fTUQ5M19fKSAgIAorIAorI2RlZmluZSBFQ1RfU1dfSVJRX0NPREUgSVJRX1NXX0xJU1IzMF9DT0RFCisKKyNlbGlmIGRlZmluZWQgKF9fTUQ5NV9fKSAKKworI2RlZmluZSBFQ1RfU1dfSVJRX0NPREUgU1dfVFJJR0dFUl9DT0RFMjEKKworI2VsaWYgKGRlZmluZWQgKF9fTUQ5N19fKSB8fCBkZWZpbmVkIChfX01EOTdQX18pICkKKworI2RlZmluZSBFQ1RfU1dfSVJRX0NPREUgTURfSVJRSURfU1dfVFJJR0dFUl9SRVNFUlZFRF8yNgorCisjZWxzZQorICAgI2Vycm9yIKGndW5zdXBwb3J0ZWQgR2VuZXJhdGlvbqGoCisjZW5kaWYgIC8vaWYgZGVmaW5lZCAoX19NRDkzX18pICAgCisKKworLyogUkVHIFJXICovCisjZGVmaW5lIFJFR19XUklURTMyKGFkZHIsIHZhbCkgIGRveyAqKHZvbGF0aWxlIGthbF91aW50MzIgKikoYWRkcikgPSAodmFsKTsgfXdoaWxlKDApCisjZGVmaW5lIFJFR19SRUFEMzIodmFyLCBhZGRyKSAgIGRveyAodmFyKSA9ICoodm9sYXRpbGUga2FsX3VpbnQzMiAqKShhZGRyKTsgfXdoaWxlKDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5zdGFuY2UKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29udHJvbCB2YXJpYWJsZXMgKi8KKy8qIGdfZWN0X2RiZ19lbiBpcyB1c2VkIHRvIGNvbnRyb2wgaWYgRFNQcyBzaG91ZGwgYnJlYWsgd2hlbiBDUjRzIGJyZWFrICovCisvKiBkZWZhdWx0IHZhbHVlIGlzIDB4MSwgd2hpY2ggbWVhbnMgRFNQcyBkb3NlIG5vdCBicmVhayBpZiBDUjRzIGJyZWFrICovCisvKiBpdCBjb3VsZCBiZSBjaGFuZ2VkIGJ5IENWRCBidXR0b24gKi8KKy8qIDB4MSAtLT4gZG8gbm90IGJyZWFrIERTUHMgd2hlbiBDUjRzIGJyZWFrIChkZWZhdWx0KSAqLworLyogMHgyIC0tPiBicmVhayBEU1BzIHdoZW4gQ1I0cyBicmVhayAoY29uZmlndXJlZCBieSAuY21tKSAqLworX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCJEUkFNX0VYX1JPQ09ERSIpKSkgdm9sYXRpbGUgY29uc3Qga2FsX3VpbnQzMiBnX2VjdF9kYmdfZW4gPSAwOwordHlwZWRlZiBlbnVtIAoreworICAgIElBX1VTSVBfRUNUID0gMCwKKyAgICBEU1BfRUNULAorICAgIFVTSVBfQ1RJX1NUQV9FUkcsCisgICAgRFNQX0NUSV9TVEFfUkVHLAorI2lmIChkZWZpbmVkIChfX01EOTdfXykgfHwgZGVmaW5lZCAoX19NRDk3UF9fKSApCisgICAgTUNPUkVfQ1RJX1NUQV9SRUcsCisgICAgVkNPUkVfQ1RJX1NUQV9SRUcsCisjZW5kaWYgLy8gaWZkZWYgX19NRDk3X18KKyAgICAKKyAgICBFQ1RfRFVNUF9OVU1TCit9RUNUX0RVTVBfSU5ERVg7CisKKyNkZWZpbmUgSUFfREJHX0VOICAgICgxIDw8IDApCisjZGVmaW5lIFVTSVBfREJHX0VOICAoMSA8PCAxKQorI2RlZmluZSBEU1BfREJHX0VOICAgKDEgPDwgMikKKworCitFWF9CQlJFR19EVU1QIGN0aV9kdW1wOworRVhfQkJSRUdfRFVNUCBjc3lzcHdydXByZXFfZHVtcDsKKworLyogcG9pbnRlciB0byBhbiBhcnJheTogYmFzZV8xLCBsZW5fMSwgdHlwZV8xLCBiYXNlXzIsIGxlbl8yLCB0eXBlXzIsIC4uLiAqLworY29uc3Qga2FsX3VpbnQzMiBjdGlfZHVtcF9yZWdpb25zW0VDVF9EVU1QX05VTVNdWzNdID0geworICAgIHtJQV9VU0lQX0NUSSwgICAgICAgICAgICAgICAgICAgICAgQ1RJUkVHU1osIDQsfSwgICAgICAgIC8vIElBX1VTSVAgQ1RJCisgICAge0RTUF9DVEksICAgICAgICAgICAgICAgICAgICAgICAgICBDVElSRUdTWiwgNCx9LCAgICAgICAgLy8gRFNQIENUSQorCXtEQkdfQU9fTUlTQyArIFVTSVBfQ1RJX1NUQSwJICAgICAgICAgIDQsIDQsfSwJCSAvLyBVU0lQIENUSSBTVEEKKwl7REJHX0FPX01JU0MgKyBEU1BfQ1RJX1NUQSwJICAgICAgICAgICAgICA0LCA0LH0sCQkgLy8gRFNQIENUSSBTVEEKKyNpZiAoZGVmaW5lZCAoX19NRDk3X18pIHx8IGRlZmluZWQgKF9fTUQ5N1BfXykgKQorCXtEQkdfQU9fTUlTQyArIE1DT1JFX0NUSV9TVEEsICAgICAgICAgICAgIDQsIDQsfSwJCSAvLyBEU1AgQ1RJIFNUQQorCXtEQkdfQU9fTUlTQyArIFZDT1JFX0NUSV9TVEEsICAgICAgICAgICAgIDQsIDQsfSwJCSAvLyBEU1AgQ1RJIFNUQQorI2VuZGlmIC8vIGlmZGVmIF9fTUQ5N19fCisJCit9OworCitjb25zdCBrYWxfdWludDMyIGNzeXNwd3J1cHJlcV9kdW1wX3JlZ2lvbnNbM10gPSB7REVNX0JBU0UrMHgwOCw0LDR9OworCit2b2xhdGlsZSBrYWxfdWludDMyIEVDVF9WUEVfVHJpZ2dlcl9TdGF0dXNbRUNUX1ZQRV9OVU1TXSA9IHswfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRm93YXJkIGRlY2xhcmF0aW9uIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitrYWxfYm9vbCBFQ1RfRHVtcENhbGxiYWNrKHZvaWQpOwora2FsX3VpbnQzMiBFQ1RfUXVlcnlfVHJpZ2dlckluX1N0YXR1cyh2b2lkKTsKK3ZvaWQgRUNUX1JlZ2lzdGVyX1NXX0lSUSh2b2lkKTsKK3ZvaWQgRUNUX1NXX0lSUV9IZGxyKGthbF91aW50MzIgdmVjdG9yKTsKKworI2lmIChkZWZpbmVkIChfX01EOTNfXykgfHwgZGVmaW5lZCAoX19NRDk1X18pICkKK2V4dGVybiB2b2lkIE1EX1RPUFNNX1BMTF9TV19Db250cm9sKFBTX1BMTF9GT1JDRU9OX1VTRVIgVVNFUiwgUFNfVE9QU01fUExMIFBMTCwga2FsX2Jvb2wgZk9uKTsKKyNlbmRpZiAvL2lmbmRlZiBfX01EOTdfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9ucyAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9FbmFibGVfRGJnU3lzX0Nsb2NrCisqCisqIERFU0NSSVBUSU9OCisqICBFQ1QgZW5hYmxlIGRiZ3N5cyBjbG9jaworKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCQordm9pZCBFQ1RfRW5hYmxlX0RiZ1N5c19DbG9jayh2b2lkKQoreworLyoKKyAgICB2b2xhdGlsZSBrYWxfdWludDMyIHBsbDsKKyAgICBSRUdfUkVBRDMyKHBsbCwweEEwMEQwYTA0KTsKKyAgICBSRUdfV1JJVEUzMigweEEwMEQwYTA0LCBwbGwgfCAoMSA8PCAzKSk7CisqLworI2lmIChkZWZpbmVkIChfX01EOTNfXykgfHwgZGVmaW5lZCAoX19NRDk1X18pICkKKyAgICBNRF9UT1BTTV9QTExfU1dfQ29udHJvbChQU19QTExfRk9SQ0VPTl9VU0VSX0NUSSwgUFNfVE9QU01fREJHX1BMTCwgS0FMX1RSVUUpOworI2VuZGlmIC8vaWZuZGVmIF9fTUQ5N19fICAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX0Rpc2FibGVfRGJnU3lzX0Nsb2NrCisqCisqIERFU0NSSVBUSU9OCisqICBFQ1QgZW5hYmxlIGRiZ3N5cyBjbG9jaworKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8JCQordm9pZCBFQ1RfRGlzYWJsZV9EYmdTeXNfQ2xvY2sodm9pZCkKK3sKKy8qCisgICAgdm9sYXRpbGUga2FsX3VpbnQzMiBwbGw7CisgICAgUkVHX1JFQUQzMihwbGwsMHhBMDBEMGEwNCk7CisgICAgUkVHX1dSSVRFMzIoMHhBMDBEMGEwNCwgcGxsICYgKH4oMSA8PCAzKSkpOworKi8gICAgCisjaWYgKGRlZmluZWQgKF9fTUQ5M19fKSB8fCBkZWZpbmVkIChfX01EOTVfXykgKQorICAgIE1EX1RPUFNNX1BMTF9TV19Db250cm9sKFBTX1BMTF9GT1JDRU9OX1VTRVJfQ1RJLCBQU19UT1BTTV9EQkdfUExMLCBLQUxfRkFMU0UpOworI2VuZGlmIC8vaWZuZGVmIF9fTUQ5N19fICAgIAorICAgIAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZVTkNUSU9OCisqICBFQ1RfUmVnaXN0ZXJfR0lDX0lSUQorKgorKiBERVNDUklQVElPTgorKiAgRUNUIHJlZ2lzdGVyIGdpYyBsaXNyCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCit2b2lkIEVDVF9SZWdpc3Rlcl9TV19JUlEodm9pZCkKK3sKKy8vbWlwcyBTVyBJUlEKKyAgICAvL0lSUV9SZWdpc3Rlcl9MSVNSKEVDVF9TV19JUlFfQ09ERSwgRUNUX1NXX0lSUV9IZGxyLCJFQ1QgU1cgSVJRIik7CisgICAgLy9JUlFTZW5zaXRpdml0eShFQ1RfU1dfSVJRX0NPREUsIExFVkVMX1NFTlNJVElWRSk7CisgICAgSVJRVW5tYXNrKEVDVF9TV19JUlFfQ09ERSk7CisgICAgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9Jbml0CisqCisqIERFU0NSSVBUSU9OCisqICBFQ1QgaW5pdGlhbGl6YXRpb24KKyoKKyogUEFSQU1FVEVSUworKiAgCisqCisqIFJFVFVSTlMKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCQkKK3ZvaWQgRUNUX0luaXQodm9pZCkKK3sKKyAgICAvKiBlbmFibGUgREJHIEFQQiBjbG9jayAqLworICAgIEVDVF9FbmFibGVfRGJnU3lzX0Nsb2NrKCk7CisgICAgCisgICAgUkVHX1dSSVRFMzIoMHhBMDYwMTExQywgMHg4MDAxRTg0OCk7CisKKyAgICAvKiBlbnRlciBtYWdpYyBrZXkgKi8gCisgICAgUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBMQVIsIENUSV9NQUdJQyk7CisgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIExBUiwgQ1RJX01BR0lDKTsKKworICAgIC8qIHNldHRpbmcgZXhjZXB0aW9uIHByb3BhZ2F0aW9uICovCisgICAgLyogTUQmdVNpcCBDVEkgcGFydCAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKipJQV9VU0lQX0NUSSoqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgSSAgICAgICAgICAgICAgICAgICAgICAgICAgTworICAgICAgICA3ICAgbWRtY3VfYXNzZXJ0X3RyaWdnZXIgICA3ICAgdXNpcF9maXEKKyAgICAgICAgNiAgIDEnYjEgICAgICAgICAgICAgICAgICAgNiAgIHVzaXBfcmVzdGFydAorICAgICAgICA1ICAgdXNpcF9jdGlfZXZlbnQgICAgICAgICA1ICAgdXNpcF9kYmdycQorICAgICAgICA0ICAgdXNpcF9kYmdhY2sgICAgICAgICAgICA0CisgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICBtZG1jdV9lY3RfaXJxCisgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAwICAgSUFfRGVidWdNICAgICAgICAgICAgICAwICAgRUpfRElOVAorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCQorCQorICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJSU5FTjUsIENIX0VYUCk7CisgICAgUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBDVElJTkVONywgQ0hfRVhQKTsKKworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJT1VURU4zLCBDSF9FWFApOworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJT1VURU43LCBDSF9FWFApOworICAgIAorICAgIC8vRGVmYXVsdCBnX2VjdF9kYmdfZW4gPSAwIHNvIElBIGRlYnVnIGNoYW5uZWwgaXMgZGlzYWxiZS4KKyAgICBpZihnX2VjdF9kYmdfZW4mSUFfREJHX0VOKQorICAgIHsKKwkJUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBDVElJTkVOMCwgQ0hfREJHKTsKKwkJUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBDVElPVVRFTjAsIENIX0RCRyk7CisgICAgfQorCisgICAgLy9EZWZhdWx0IGdfZWN0X2RiZ19lbiA9IDAgc28gdXNpcCBkZWJ1ZyBjaGFubmVsIGlzIGRpc2FsYmUuCisgICAgaWYoZ19lY3RfZGJnX2VuJlVTSVBfREJHX0VOKQorICAgIHsKKyAgICAgICAgUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBDVElJTkVONCwgQ0hfREJHKTsKKyAgICAgICAgUkVHX1dSSVRFMzIoSUFfVVNJUF9DVEkgKyBDVElPVVRFTjUsIENIX0RCRyk7CisgICAgfQorICAgIAorICAgIC8qIHJlc3RhcnQgKi8KKyAgICAvL1JFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJSU5FTjYsICBDSF9SU1QpOworICAgIC8vIE5vdGU6IHRvIHJlc3VtZSBQU0NPUkUsIHdyaXRlIDB4RjAwQTgwQkMgdG8gMHgxCisKKworICAgIC8vR2VuOTUKKyAgICAvKiBEU1AgQ1RJIHBhcnQgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqSUFfVVNJUF9DVEkqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgTworICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgICAKKyAgICAgICAgNiAgIDEnYjEgICAgICAgICAgICAgICAgICAgICA2ICAgCisgICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgIHJha2VfZmlxCisgICAgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgIHNjcV9maXEKKyAgICAgICAgMyAgIHJha2VfbWQzMl9jdGlfZXZlbnQgICAgICAzICAgcmFrZV9yZXN0YXJ0CisgICAgICAgIDIgICBzY3FfY3RpX2V2ZW50ICAgICAgICAgICAyICAgc2NxX3Jlc3RhcnQKKyAgICAgICAgMSAgIHJha2VfbWQzMl9kYmdhY2sgICAgICAgICAxICAgcmFrZV9kYmdycQorICAgICAgICAwICAgc2NxX2RiZ2FjayAgICAgICAgICAgICAgMCAgIHNjcV9kYmdycQorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgICAgLy9HZW45NyAgICAKKyAgICAvKiBEU1AgQ1RJIHBhcnQgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqSUFfVVNJUF9DVEkqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgIEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgTworICAgICAgICA3ICAgbWNvcmVfY3RpX2V2ZW50ICAgICAgICAgIDcgICBtY29yZV9maXEKKyAgICAgICAgNiAgIG1jb3JlX2N0aV9kYmdhY2sgICAgICAgICA2ICAgdmNvcmVfZmlxCisgICAgICAgIDUgICB2Y29yZV9jdGlfZXZlbnQgICAgICAgICAgNSAgIHJha2VfZmlxCisgICAgICAgIDQgICB2Y29yZV9jdGlfZGJnYWNrICAgICAgICAgNCAgIHZkc3BfZmlxCisgICAgICAgIDMgICByYWtlX21kMzJfY3RpX2V2ZW50ICAgICAgMyAgIG1jb3JlX2RiZ3JxCisgICAgICAgIDIgICB2ZHNwX2N0aV9ldmVudCAgICAgICAgICAgMiAgIHZjb3JlX2RiZ3JxCisgICAgICAgIDEgICByYWtlX21kMzJfZGJnYWNrICAgICAgICAgMSAgIHJha2VfZGJncnEKKyAgICAgICAgMCAgIHNjcV9kYmdhY2sgICAgICAgICAgICAgICAwICAgdmRzcF9kYmdycQorICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBSRUdfV1JJVEUzMihEU1BfQ1RJICsgQ1RJSU5FTjIsIENIX0VYUCk7CisgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSUlORU4zLCBDSF9FWFApOworICAgIFJFR19XUklURTMyKERTUF9DVEkgKyBDVElPVVRFTjQsIENIX0VYUCk7CisgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSU9VVEVONSwgQ0hfRVhQKTsKKworI2lmIChkZWZpbmVkIChfX01EOTdfXykgfHwgZGVmaW5lZCAoX19NRDk3UF9fKSApCisgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSUlORU41LCBDSF9FWFApOworICAgIFJFR19XUklURTMyKERTUF9DVEkgKyBDVElJTkVONywgQ0hfRVhQKTsKKyAgICBSRUdfV1JJVEUzMihEU1BfQ1RJICsgQ1RJT1VURU43LCBDSF9FWFApOworICAgIFJFR19XUklURTMyKERTUF9DVEkgKyBDVElPVVRFTjYsIENIX0VYUCk7CisjZW5kaWYgIC8vIGlmIGRlZmluZWQgKF9fTUQ5N19fKSAgIAorICAgIAorICAgIC8vRGVmYXVsdCBnX2VjdF9kYmdfZW4gPSAwIHNvIERTUCBkZWJ1ZyBjaGFubmVsIGlzIGRpc2FsYmUuCisgICAgaWYoZ19lY3RfZGJnX2VuJkRTUF9EQkdfRU4pCisgICAgeworCQlSRUdfV1JJVEUzMihEU1BfQ1RJICsgQ1RJSU5FTjAsIENIX0RCRyk7CisJCVJFR19XUklURTMyKERTUF9DVEkgKyBDVElJTkVOMSwgQ0hfREJHKTsKKyAgICAgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSU9VVEVOMCwgQ0hfREJHKTsKKyAgICAgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSU9VVEVOMSwgQ0hfREJHKTsKKworI2lmIChkZWZpbmVkIChfX01EOTdfXykgfHwgZGVmaW5lZCAoX19NRDk3UF9fKSApCisgICAgICAgIFJFR19XUklURTMyKERTUF9DVEkgKyBDVElJTkVONCwgQ0hfREJHKTsKKyAgICAgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSUlORU42LCBDSF9EQkcpOworICAgICAgICBSRUdfV1JJVEUzMihEU1BfQ1RJICsgQ1RJT1VURU4zLCBDSF9EQkcpOworICAgICAgICBSRUdfV1JJVEUzMihEU1BfQ1RJICsgQ1RJT1VURU4yLCBDSF9EQkcpOworI2VuZGlmICAvLyBpZiBkZWZpbmVkIChfX01EOTdfXykgICAKKworCisgICAgfQorICAgIAorICAgIC8qIHJlc3RhcnQgKi8KKyAgICAvL1JFR19XUklURTMyKERTUF9DVEkgKyBDVElJTkVONiwgQ0hfUlNUKTsKKyAgICAvLyBOb3RlOiB0byByZXN1bWUgQ1MsIHdyaXRlIDB4RjAwOUMwQUMgdG8gMHgxCisgICAgLy8gTm90ZTogdG8gcmVzdW1lIE1EMzIsIHdyaXRlIDB4RjAwOUMwQTggdG8gMHgxICAgIAorCisgICAgCisgICAKKwkvKiBlbmFibGluZyBDVEkgKi8KKyAgICBSRUdfV1JJVEUzMihJQV9VU0lQX0NUSSArIENUSUNPTlRST0wsIDB4MSk7CisgICAgUkVHX1dSSVRFMzIoRFNQX0NUSSArIENUSUNPTlRST0wsIDB4MSk7CisgICAgCisgICAgLyogdHVybiBvZmYgZGVidWcgc3lzIGNsb2NrICovCisgICAgRUNUX0Rpc2FibGVfRGJnU3lzX0Nsb2NrKCk7CisKKyAgICAvKiBMSVNSIHJlZ2lzdHJhdGlvbiAqLworICAgIC8vSVJRX1JlZ2lzdGVyX0xJU1IoKElSUV9FQ1RfQ09ERSksIEVDVF9IZGxyLCAiRW1iZWRkZWQgQ3Jvc3MgVHJpZ2dlciIpOyAgICAKKyAgICAvL0lSUVNlbnNpdGl2aXR5KElSUV9FQ1RfQ09ERSwgTEVWRUxfU0VOU0lUSVZFKTsKKyAgICBJUlFDbGVhckludChJUlFfRUNUX0NPREUpOworICAgIElSUVVubWFzayhJUlFfRUNUX0NPREUpOworCisgICAgLyogYmJyZWcgZHVtcCBzZXR0aW5nICovCisgICAgY3RpX2R1bXAucmVnaW9ucyA9IChrYWxfdWludDMyICopY3RpX2R1bXBfcmVnaW9uczsKKyAgICBjdGlfZHVtcC5udW0gPSBFQ1RfRFVNUF9OVU1TOworICAgIGN0aV9kdW1wLmJicmVnX2R1bXBfY2FsbGJhY2sgPSBOVUxMOworICAgIEVYX1JFR0lTVEVSX0JCUkVHX0RVTVAoJmN0aV9kdW1wKTsKKworICAgIGNzeXNwd3J1cHJlcV9kdW1wLnJlZ2lvbnMgPSAoa2FsX3VpbnQzMiAqKWNzeXNwd3J1cHJlcV9kdW1wX3JlZ2lvbnM7CisgICAgY3N5c3B3cnVwcmVxX2R1bXAubnVtID0gMTsKKyAgICBjc3lzcHdydXByZXFfZHVtcC5iYnJlZ19kdW1wX2NhbGxiYWNrID0gTlVMTDsKKyAgICBFWF9SRUdJU1RFUl9CQlJFR19EVU1QKCZjc3lzcHdydXByZXFfZHVtcCk7CisKKworLy8gICAgRUNUX1JlZ2lzdGVyX1NXX0lSUSgpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZVTkNUSU9OCisqICBFQ1RfU1dfSVJRX0hkbHIKKyoKKyogREVTQ1JJUFRJT04KKyogIEVDVCBTVyBJU1JzCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFQ1RfU1dfSVJRX0hkbHIoa2FsX3VpbnQzMiB2ZWN0b3IpCit7CisgICAga2FsX3VpbnQzMiB2cGVfbnVtID0ga2FsX2dldF9jdXJyZW50X3ZwZV9pZCgpOworICAgIEVDVF9WUEVfVHJpZ2dlcl9TdGF0dXNbdnBlX251bV0gfD0gRUNUX1NSQ19JQTsKKwkKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX0hkbHIKKyoKKyogREVTQ1JJUFRJT04KKyogIEVDVCBJU1JzCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFQ1RfSGRscihrYWxfdWludDMyIHZlY3RvcikKK3sKKwora2FsX3VpbnQzMiB2cGVfbnVtID0ga2FsX2dldF9jdXJyZW50X3ZwZV9pZCgpOworI2lmZGVmIEFURVNUX0RSVl9FQ1QKK0VDVF9WUEVfVHJpZ2dlcl9TdGF0dXNbdnBlX251bV0gKz0gKHZwZV9udW0rMSk7CitkYmdfcHJpbnQoIkVDVCBUcmlnZ2VyLCBWUEU6ICVkICIsdnBlX251bSk7CitJUlFNYXNrKElSUV9FQ1RfQ09ERSk7CisgCisgCisKKyNlbHNlCisKK0VDVF9WUEVfVHJpZ2dlcl9TdGF0dXNbdnBlX251bV0gPSBFQ1RfUXVlcnlfVHJpZ2dlckluX1N0YXR1cygpOworCisjZW5kaWYgIC8vICAgQVRFU1RfRFJWX0VDVCAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX1RyZ0V4Y3AKKyoKKyogREVTQ1JJUFRJT04KKyogIEV4Y2VwdGlvbiBwcm9wYWdhdGlvbgorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRUNUX1RyZ0V4Y3Aodm9pZCkKK3sgIAorICAgIAorCS8vQWN0aXZhdGVfTElTUihFQ1RfU1dfSVJRX0NPREUpOyAKKyAgICBSRUdfV1JJVEUzMihJQV9UUklHR0VSX0NUSV9FVkVOVCwgMSk7CisgICAgTU9fU3luYygpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZVTkNUSU9OCisqICBFQ1RfUXVlcnlfVHJpZ2dlckluX1N0YXR1cworKgorKiBERVNDUklQVElPTgorKiAgCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwora2FsX3VpbnQzMiBFQ1RfUXVlcnlfVHJpZ2dlckluX1N0YXR1cyh2b2lkKQoreworICAgIGthbF91aW50MzIgZWN0X3N0ID0gRUNUX1NSQ19OT05FOworICAgIGthbF91aW50MzIgaWFfdXNpcF9jdGk7CisgICAga2FsX3VpbnQzMiBkc3BfY3RpOyAgICAKKyAgICBrYWxfdWludDMyIHVzaXBfY3RpOyAgICAKKyAgICBrYWxfdWludDMyIHNjcV9jdGk7ICAgIAorCisgICAgLyogZW5hYmxlIERCRyBBUEIgY2xvY2sgKi8KKyAgICAKKyAgICBFQ1RfRW5hYmxlX0RiZ1N5c19DbG9jaygpOworCisgICAgUkVHX1JFQUQzMihpYV91c2lwX2N0aSwgSUFfVVNJUF9DVEkgKyBDVElUUklHSU5TVEFUVVMpOworICAgIFJFR19SRUFEMzIoZHNwX2N0aSwgRFNQX0NUSSArIENUSVRSSUdJTlNUQVRVUyk7CisgICAgCisgICAgaWYoaWFfdXNpcF9jdGkmSUFfVFJJR0dFUklOX01BU0spCisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX0lBOworCisgICAgaWYoaWFfdXNpcF9jdGkmVVNJUF9UUklHR0VSSU5fTUFTSykKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1VTSVA7CisgICAgICAgIHVzaXBfY3RpID0gRUNUX0dldF9Vc2lwX0NUSV9TdGF0dXMoKTsKKyAgICAgICAgZWN0X3N0IHw9IHVzaXBfY3RpOworICAgIH0KKyAgICAgICAgICAKKworICAgICAgICAKKyAgICBpZihkc3BfY3RpJlJBS0VfVFJJR0dFUklOX01BU0spCisgICAgeworCQllY3Rfc3QgfD0gRUNUX1NSQ19SQUtFOworCX0KKyAgICAgICAgCisgICAgaWYoZHNwX2N0aSZTQ1FfVFJJR0dFUklOX01BU0spCisgICAgeworCQllY3Rfc3QgfD0gRUNUX1NSQ19TQ1E7CisJCXNjcV9jdGkgPSBFQ1RfR2V0X1NjcTE2X0NUSV9TdGF0dXMoKTsKKwkJZWN0X3N0IHw9IHNjcV9jdGk7CisJfQorI2lmIChkZWZpbmVkIChfX01EOTdfXykgfHwgZGVmaW5lZCAoX19NRDk3UF9fKSApCisKKyAgICBrYWxfdWludDMyIG1jb3JlX2N0aTsgICAgCisgICAga2FsX3VpbnQzMiB2Y29yZV9jdGk7ICAgIAorCQorICAgIGlmKGRzcF9jdGkmTUNPUkVfVFJJR0dFUklOX01BU0spCisgICAgeworCQllY3Rfc3QgfD0gRUNUX1NSQ19NQ09SRTsKKwkJbWNvcmVfY3RpID0gRUNUX0dldF9NQ09SRV9DVElfU3RhdHVzKCk7CisJCWVjdF9zdCB8PSBtY29yZV9jdGk7CisJfQorCisgICAgaWYoZHNwX2N0aSZWQ09SRV9UUklHR0VSSU5fTUFTSykKKyAgICB7CisJCWVjdF9zdCB8PSBFQ1RfU1JDX1ZDT1JFOworCQl2Y29yZV9jdGkgPSBFQ1RfR2V0X1ZDT1JFX0NUSV9TdGF0dXMoKTsKKwkJZWN0X3N0IHw9IHZjb3JlX2N0aTsKKwl9CisjZW5kaWYgIC8vIGlmIEdlbjk3CisJCisKKyAgICByZXR1cm4gZWN0X3N0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZVTkNUSU9OCisqICBFQ1RfUXVlcnkKKyoKKyogREVTQ1JJUFRJT04KKyogIAorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2thbF91aW50MzIgRUNUX1F1ZXJ5KHZvaWQpCit7CisJa2FsX3VpbnQzMiB2cGVfbnVtID0ga2FsX2dldF9jdXJyZW50X3ZwZV9pZCgpOworICAgIHJldHVybiBFQ1RfVlBFX1RyaWdnZXJfU3RhdHVzW3ZwZV9udW1dOworCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9RdWVyeUJ5VlBFCisqCisqIERFU0NSSVBUSU9OCisqICAKKyogIFF1ZXJ5IEVDVCBzdGF0dXMgdmFsdWUgYnkgaW5wdXQgVlBFCisqCisqIFBBUkFNRVRFUlMKKyogIAorKiAgdnBlX251bTogdmVwIG51bWJlcgorKgorKiBSRVRVUk5TCisqCisqICBFQ1Qgc3RhdHVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwora2FsX3VpbnQzMiBFQ1RfUXVlcnlCeVZQRShrYWxfdWludDMyIHZwZV9udW0pCit7CisgICAgaWYodnBlX251bSA8IEVDVF9WUEVfTlVNUykKKwkgICAgcmV0dXJuIEVDVF9WUEVfVHJpZ2dlcl9TdGF0dXNbdnBlX251bV07CisJZWxzZQorCQlyZXR1cm4gRUNUX1NSQ19JTlZBTElEX1ZQRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX0lzRW5hYmxlZAorKgorKiBERVNDUklQVElPTgorKiAgCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwora2FsX3VpbnQzMiBFQ1RfSXNFbmFibGVkKHZvaWQpCit7CisJa2FsX3VpbnQzMiBpYV91c2lwX2N0aV9zdGEsIGRzcF9jdGlfc3RhOyAKKwkKKwlSRUdfUkVBRDMyKGlhX3VzaXBfY3RpX3N0YSwgSUFfVVNJUF9DVEkgKyBDVElDT05UUk9MKTsKKwlSRUdfUkVBRDMyKGRzcF9jdGlfc3RhLCBEU1BfQ1RJICsgQ1RJQ09OVFJPTCk7CisJCisJcmV0dXJuIGlhX3VzaXBfY3RpX3N0YSAmJiBkc3BfY3RpX3N0YTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX0R1bXBDYWxsYmFjayAKKyoKKyogREVTQ1JJUFRJT04KKyogIEVDVCBjYWxsYmFjayBmb3IgcmVnaXN0ZXIgZHVtcCwgaXQgdHVybnMgb24gdGhlIGRiZyBhcGIgY2xvY2sgCisqCisqIFBBUkFNRVRFUlMKKyogIAorKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwora2FsX2Jvb2wgRUNUX0R1bXBDYWxsYmFjayh2b2lkKQoreworICAgIC8vIHRvZG86IHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGNvZGUgb25jZSBFTEJSVVMgVE9QU00gQVBJIGlzIHJlYWR5CisgICAgRUNUX0VuYWJsZV9EYmdTeXNfQ2xvY2soKTsKKworICAgIHJldHVybiBLQUxfVFJVRTsKK30KKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9HZXRNRFRyaWdnZXJPdXQKKyoKKyogREVTQ1JJUFRJT04KKyogIAorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2thbF91aW50MzIgRUNUX0dldE1EVHJpZ2dlck91dCh2b2lkKQoreworCWthbF91aW50MzIgdHJpZ2dlcl9vdXQ7IAorCQorCVJFR19SRUFEMzIodHJpZ2dlcl9vdXQsIElBX1VTSVBfQ1RJICsgQ1RJVFJJR09VVFNUQVRVUyk7CisJCisJcmV0dXJuIHRyaWdnZXJfb3V0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBGVU5DVElPTgorKiAgRUNUX0dldERTUFRyaWdnZXJPdXQKKyoKKyogREVTQ1JJUFRJT04KKyogIAorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2thbF91aW50MzIgRUNUX0dldERTUFRyaWdnZXJPdXQodm9pZCkKK3sKKwlrYWxfdWludDMyIHRyaWdnZXJfb3V0OyAKKwkKKwlSRUdfUkVBRDMyKHRyaWdnZXJfb3V0LCBEU1BfQ1RJICsgQ1RJVFJJR09VVFNUQVRVUyk7CisJCisJcmV0dXJuIHRyaWdnZXJfb3V0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEZVTkNUSU9OCisqICBFQ1RfR2V0TURUcmlnZ2VySW4KKyoKKyogREVTQ1JJUFRJT04KKyogIAorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2thbF91aW50MzIgRUNUX0dldE1EVHJpZ2dlckluKHZvaWQpCit7CisJa2FsX3VpbnQzMiB0cmlnZ2VyX2luOyAKKwkKKwlSRUdfUkVBRDMyKHRyaWdnZXJfaW4sIElBX1VTSVBfQ1RJICsgQ1RJVFJJR0lOU1RBVFVTKTsKKwkKKwlyZXR1cm4gdHJpZ2dlcl9pbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9HZXREU1BUcmlnZ2VySW4KKyoKKyogREVTQ1JJUFRJT04KKyogIAorKgorKiBQQVJBTUVURVJTCisqICAKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2thbF91aW50MzIgRUNUX0dldERTUFRyaWdnZXJJbih2b2lkKQoreworCWthbF91aW50MzIgdHJpZ2dlcl9pbjsgCisJCisJUkVHX1JFQUQzMih0cmlnZ2VyX2luLCBEU1BfQ1RJICsgQ1RJVFJJR0lOU1RBVFVTKTsKKwkKKwlyZXR1cm4gdHJpZ2dlcl9pbjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9UcmdBY2sKKyoKKyogREVTQ1JJUFRJT04KKyogIEVDVCBUcmlnZ2VyIEFjaworKgorKiBQQVJBTUVURVJTCisqIGthbF91aW50MzIgc3JjOiB0cmlnZ2VyIGluIHN0YXR1cworKgorKiBSRVRVUk5TCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBFQ1RfVHJnQWNrKGthbF91aW50MzIgc3JjKQoreworICAgIHZvbGF0aWxlIGthbF91aW50MzIgZXZlbnRfYWRkcjsKKworICAgIGlmKChzcmMgJiBFQ1RfU1JDX0lBKSA9PSBFQ1RfU1JDX0lBKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IElBX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgaWYoKHNyYyAmIEVDVF9TUkNfVVNJUDBfMCkgPT0gRUNUX1NSQ19VU0lQMF8wKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFVTSVAwX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgaWYoKHNyYyAmIEVDVF9TUkNfVVNJUDBfMSkgPT0gRUNUX1NSQ19VU0lQMF8xKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFVTSVAxX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgaWYoKHNyYyAmIEVDVF9TUkNfVVNJUDFfMCkgPT0gRUNUX1NSQ19VU0lQMV8wKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFVTSVAyX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgaWYoKHNyYyAmIEVDVF9TUkNfVVNJUDFfMSkgPT0gRUNUX1NSQ19VU0lQMV8xKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFVTSVAzX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgCisKKyNpZiAoZGVmaW5lZCAoX19NRDk3X18pIHx8IGRlZmluZWQgKF9fTUQ5N1BfXykgKQorCisgICAgaWYoKHNyYyAmIEVDVF9TUkNfU0NRMF8wKSA9PSBFQ1RfU1JDX1NDUTBfMCkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBTQ1EwX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgCisgICAgaWYoKHNyYyAmIEVDVF9TUkNfU0NRMF8xKSA9PSBFQ1RfU1JDX1NDUTBfMSkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBTQ1ExX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisKKyAgICBpZigoc3JjICYgRUNUX1NSQ19TQ1ExXzApID09IEVDVF9TUkNfU0NRMV8wKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFNDUTJfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKyAgICAKKyAgICBpZigoc3JjICYgRUNUX1NSQ19TQ1ExXzEpID09IEVDVF9TUkNfU0NRMV8xKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFNDUTNfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKworICAgIGlmKChzcmMgJiBFQ1RfU1JDX01DT1JFMCkgIT0gMCkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBNQ09SRTBfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKworICAgIGlmKChzcmMgJiBFQ1RfU1JDX01DT1JFMSkgIT0gMCkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBNQ09SRTFfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKworICAgIGlmKChzcmMgJiBFQ1RfU1JDX1ZDT1JFMCkgIT0gMCkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBWQ09SRTBfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKyAgICAKKyAgICAKKyNlbHNlCisKKworICAgIGlmKChzcmMgJiBFQ1RfU1JDX1NDUTApID09IEVDVF9TUkNfU0NRMCkKKyAgICB7CisgICAgICAgIGV2ZW50X2FkZHIgPSBTQ1EwX1RSSUdHRVJfQ1RJX0VWRU5UOworICAgICAgICBSRUdfV1JJVEUzMihldmVudF9hZGRyLCAwKTsKKyAgICB9CisgICAgaWYoKHNyYyAmIEVDVF9TUkNfU0NRMSkgPT0gRUNUX1NSQ19TQ1ExKQorICAgIHsKKyAgICAgICAgZXZlbnRfYWRkciA9IFNDUTFfVFJJR0dFUl9DVElfRVZFTlQ7CisgICAgICAgIFJFR19XUklURTMyKGV2ZW50X2FkZHIsIDApOworICAgIH0KKyAgICAKKyNlbmRpZiAvLyBpZiBkZWZpbmVkIChfX01EOTdfXykKKworCisgICAgUkVHX1dSSVRFMzIoZXZlbnRfYWRkciwgMCk7CisgICAgTU9fU3luYygpOworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJK0NUSUlOVEFDSywgKElBX1RSSUdHRVJPVVRfTUFTSytVU0lQX1RSSUdHRVJPVVRfTUFTSykpOworICAgIFJFR19XUklURTMyKERTUF9DVEkrQ1RJSU5UQUNLLCAoUkFLRV9UUklHR0VST1VUX01BU0srU0NRX1RSSUdHRVJPVVRfTUFTSykpOworICAgIE1PX1N5bmMoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRlVOQ1RJT04KKyogIEVDVF9EaXNhYmxlUk1QVVRyaWdnZXJPdXQKKyoKKyogREVTQ1JJUFRJT04KKyogIERpc2FibGUgUk1QVSBjaGFubmVsIHRyaWdnZXIgb3V0CisqCisqIFBBUkFNRVRFUlMKKyoKKyoKKyogUkVUVVJOUworKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRUNUX0Rpc2FibGVSTVBVVHJpZ2dlck91dCh2b2lkKQoreworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJT1VURU4zLCBDSF9FWFApOworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJICsgQ1RJT1VURU43LCBDSF9FWFApOworICAgIE1PX1N5bmMoKTsKKworICAgIFJFR19XUklURTMyKElBX1VTSVBfQ1RJK0NUSUlOVEFDSywgKElBX1RSSUdHRVJPVVRfTUFTSytVU0lQX1RSSUdHRVJPVVRfTUFTSykpOworICAgIFJFR19XUklURTMyKERTUF9DVEkrQ1RJSU5UQUNLLCAoUkFLRV9UUklHR0VST1VUX01BU0srU0NRX1RSSUdHRVJPVVRfTUFTSykpOworICAgIE1PX1N5bmMoKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWN1L2RyaXZlci9kZXZkcnYvZWN0L3NyYy9lY3RfZHNwX2N0aV9zdGF0dXMuYyBiL21jdS9kcml2ZXIvZGV2ZHJ2L2VjdC9zcmMvZWN0X2RzcF9jdGlfc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwMzZkOAotLS0gL2Rldi9udWxsCisrKyBiL21jdS9kcml2ZXIvZGV2ZHJ2L2VjdC9zcmMvZWN0X2RzcF9jdGlfc3RhdHVzLmMKQEAgLTAsMCArMSwzNjMgQEAKKyNpbmNsdWRlICJlY3QuaCIKKyNpbmNsdWRlICJyZWdfYmFzZS5oIgorCisjaWYgZGVmaW5lZChfX01EOTdfXykgJiYgKGRlZmluZWQoX19GUEdBX18pICYmICFkZWZpbmVkKFVNT0xZRV9DT1NJTSkpCisjaW5jbHVkZSAiaW5pdF9jb21tLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hY3JvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBFQ1RfQklUX01BU0soYml0KSAgICAgICAgICAgICAgICAgICAgKDEgPDwgKGJpdCkpCisKKyNpZiBkZWZpbmVkIChfX01EOTdfXykKKworI2lmIGRlZmluZWQoTVQ2Mjk3KSB8fCBkZWZpbmVkKE1UNjg4NSkgfHwgZGVmaW5lZChNVDY4NzMpIHx8IGRlZmluZWQoTVQ2ODUzKSB8fCBkZWZpbmVkKE1UNjgzMykgfHwgZGVmaW5lZChNVDY4NzcpIHx8IGRlZmluZWQoQ0hJUDEwOTkyKQorCisjZGVmaW5lIEVDVF9DVElfU1RBVFVTX0JBU0VfQUREUiAgICAgICAgICAgICAoREJHX0FPX01JU0MpCisKKyNkZWZpbmUgRUNUX1NDUTBfQ09SRTBfQ1RJX0VWRU5UX0JBU0VfQUREUiAgIChCQVNFX01BRERSX0lOUjBfU0NRX1ZVX0NSKQorI2RlZmluZSBFQ1RfU0NRMF9DT1JFMV9DVElfRVZFTlRfQkFTRV9BRERSICAgKEJBU0VfTUFERFJfSU5SMF9TQ1FfVlVfQ1JfMSkKKyNkZWZpbmUgRUNUX1NDUTFfQ09SRTBfQ1RJX0VWRU5UX0JBU0VfQUREUiAgIChCQVNFX01BRERSX0lOUjBfU0NRX1ZVX0NSXzIpCisjZGVmaW5lIEVDVF9TQ1ExX0NPUkUxX0NUSV9FVkVOVF9CQVNFX0FERFIgICAoQkFTRV9NQUREUl9JTlIwX1NDUV9WVV9DUl8zKQorCisjZGVmaW5lIEVDVF9VU0lQX0NUSV9TVEFUVVNfUkVHX09GU1QgICAgICAgICAoMHgxNCkKKyNkZWZpbmUgRUNUX1NDUTE2X0NUSV9FVkVOVF9SRUdfT0ZTVCAgICAgICAgICgweDgpCisKKyNkZWZpbmUgRUNUX1VTSVBfQ1RJX1NUQVRVU19SRUdfQUREUiAgICAgICAgIChFQ1RfQ1RJX1NUQVRVU19CQVNFX0FERFIgKyBFQ1RfVVNJUF9DVElfU1RBVFVTX1JFR19PRlNUKQorCisjZGVmaW5lIEVDVF9TQ1EwX0NPUkUwX0NUSV9FVkVOVF9SRUdfQUREUiAgICAoQkFTRV9NQUREUl9JTlIwX1NDUV9WVV9DUiArIEVDVF9TQ1ExNl9DVElfRVZFTlRfUkVHX09GU1QpCisjZGVmaW5lIEVDVF9TQ1EwX0NPUkUxX0NUSV9FVkVOVF9SRUdfQUREUiAgICAoQkFTRV9NQUREUl9JTlIwX1NDUV9WVV9DUl8xICsgRUNUX1NDUTE2X0NUSV9FVkVOVF9SRUdfT0ZTVCkKKyNkZWZpbmUgRUNUX1NDUTFfQ09SRTBfQ1RJX0VWRU5UX1JFR19BRERSICAgIChCQVNFX01BRERSX0lOUjBfU0NRX1ZVX0NSXzIgKyBFQ1RfU0NRMTZfQ1RJX0VWRU5UX1JFR19PRlNUKQorI2RlZmluZSBFQ1RfU0NRMV9DT1JFMV9DVElfRVZFTlRfUkVHX0FERFIgICAgKEJBU0VfTUFERFJfSU5SMF9TQ1FfVlVfQ1JfMyArIEVDVF9TQ1ExNl9DVElfRVZFTlRfUkVHX09GU1QpCisKKyNkZWZpbmUgRUNUX01DT1JFMF9DVElfRVZFTlRfUkVHX0FERFIgICAgICAgIChCQVNFX01BRERSX01DT1JFMF9TTVRfQ1RJKQorI2lmIGRlZmluZWQoTVQ2Mjk3KQorI2RlZmluZSBFQ1RfTUNPUkUxX0NUSV9FVkVOVF9SRUdfQUREUiAgICAgICAgKEJBU0VfTUFERFJfTUNPUkUxX1NNVF9DVEkpCisjZW5kaWYgLy8gZGVmaW5lZChNVDYyOTcpCisjZGVmaW5lIEVDVF9WQ09SRV9DVElfRVZFTlRfUkVHX0FERFIgICAgICAgICAoQkFTRV9NQUREUl9WQ09SRV9TTVRfQ1RJKQorCisjZGVmaW5lIEVDVF9VU0lQMF9USDBfQ1RJX1NUQV9CSVQgICAgICAgICAgICAoMTYpCisjZGVmaW5lIEVDVF9VU0lQMF9USDFfQ1RJX1NUQV9CSVQgICAgICAgICAgICAoMTcpCisjZGVmaW5lIEVDVF9VU0lQMV9USDBfQ1RJX1NUQV9CSVQgICAgICAgICAgICAoMTgpCisjZGVmaW5lIEVDVF9VU0lQMV9USDFfQ1RJX1NUQV9CSVQgICAgICAgICAgICAoMTkpCisKKyNkZWZpbmUgRUNUX1NPTklDX0NUSV9FVkVOVF9USDBfQklUICAgICAgICAgICgwKQorI2RlZmluZSBFQ1RfU09OSUNfQ1RJX0VWRU5UX1RIMV9CSVQgICAgICAgICAgKDQpCisjZGVmaW5lIEVDVF9TT05JQ19DVElfRVZFTlRfVEgyX0JJVCAgICAgICAgICAoOCkKKyNkZWZpbmUgRUNUX1NPTklDX0NUSV9FVkVOVF9USDNfQklUICAgICAgICAgICgxMikKKworI2Vsc2UgIC8vIGlmIGRlZmluZWQoTVQ2Mjk3KQorICAgI2Vycm9yICJQbGVhc2UgcG9ydGluZyBmb3IgbmV3IHByb2plY3QiCisjZW5kaWYgLy8gZGVmaW5lZChNVDYyOTcpIHx8IGRlZmluZWQoTVQ2ODg1KSB8fCBkZWZpbmVkKE1UNjg3MykgfHwgZGVmaW5lZChNVDY4NTMpIHx8IGRlZmluZWQoTVQ2ODMzKSB8fCBkZWZpbmVkKE1UNjg3NykgfHwgZGVmaW5lZChDSElQMTA5OTIpCisKKyNlbGlmIGRlZmluZWQgKF9fTUQ5NV9fKSB8fCBkZWZpbmVkIChfX01EOTNfXykKKworI2RlZmluZSBFQ1RfQ1RJX1NUQVRVU19CQVNFX0FERFIgICAgICAgICAgICAgKERCR19BT19NSVNDKQorCisjZGVmaW5lIEVDVF9VU0lQX0NUSV9TVEFUVVNfUkVHX09GU1QgICAgICAgICAoMHgxNCkKKyNkZWZpbmUgRUNUX1NDUTE2X0NUSV9TVEFUVVNfUkVHX09GU1QgICAgICAgICgweDBDKQorCisKKyNkZWZpbmUgRUNUX1VTSVBfQ1RJX1NUQVRVU19SRUdfQUREUiAgICAgICAgIChFQ1RfQ1RJX1NUQVRVU19CQVNFX0FERFIgKyBFQ1RfVVNJUF9DVElfU1RBVFVTX1JFR19PRlNUKQorI2RlZmluZSBFQ1RfU0NRMTZfQ1RJX1NUQVRVU19SRUdfQUREUiAgICAgICAgKEVDVF9DVElfU1RBVFVTX0JBU0VfQUREUiArIEVDVF9TQ1ExNl9DVElfU1RBVFVTX1JFR19PRlNUKQorCisKKyNkZWZpbmUgRUNUX1VTSVAwX1RIMF9DVElfU1RBX0JJVCAgICAgICAgICAgICgxNikKKyNkZWZpbmUgRUNUX1VTSVAwX1RIMV9DVElfU1RBX0JJVCAgICAgICAgICAgICgxNykKKyNkZWZpbmUgRUNUX1VTSVAxX1RIMF9DVElfU1RBX0JJVCAgICAgICAgICAgICgxOCkKKyNkZWZpbmUgRUNUX1VTSVAxX1RIMV9DVElfU1RBX0JJVCAgICAgICAgICAgICgxOSkKKworCisjZGVmaW5lIEVDVF9TQ1ExNl8wX0NUSV9TVEFfQklUICAgICAgICAgICAgICAoMTYpCisjZGVmaW5lIEVDVF9TQ1ExNl8xX0NUSV9TVEFfQklUICAgICAgICAgICAgICAoMTcpCisKKyNlbGlmIGRlZmluZWQgKF9fTUQ5N1BfXykKKyNkZWZpbmUgRUNUX1VTSVBfQ1RJX0VWRU5UX0JBU0VfQUREUiAgICAgICAgIChCQVNFX01BRERSX1VTSVBfQ1JPU1NfQ09SRV9DVFJMKQorI2RlZmluZSBFQ1RfVVNJUDBfVEgwX0NUSV9FVkVOVF9SRUdfT0ZTVCAgICAgKDB4ODAwKQorI2RlZmluZSBFQ1RfVVNJUDBfVEgxX0NUSV9FVkVOVF9SRUdfT0ZTVCAgICAgKDB4ODA0KQorI2RlZmluZSBFQ1RfVVNJUDFfVEgwX0NUSV9FVkVOVF9SRUdfT0ZTVCAgICAgKDB4ODA4KQorI2RlZmluZSBFQ1RfVVNJUDFfVEgxX0NUSV9FVkVOVF9SRUdfT0ZTVCAgICAgKDB4ODBDKQorCisjZGVmaW5lIEVDVF9VU0lQMF9USDBfQ1RJX0VWRU5UX1JFR19BRERSICAgICAoRUNUX1VTSVBfQ1RJX0VWRU5UX0JBU0VfQUREUiArIEVDVF9VU0lQMF9USDBfQ1RJX0VWRU5UX1JFR19PRlNUKQorI2RlZmluZSBFQ1RfVVNJUDBfVEgxX0NUSV9FVkVOVF9SRUdfQUREUiAgICAgKEVDVF9VU0lQX0NUSV9FVkVOVF9CQVNFX0FERFIgKyBFQ1RfVVNJUDBfVEgxX0NUSV9FVkVOVF9SRUdfT0ZTVCkKKyNkZWZpbmUgRUNUX1VTSVAxX1RIMF9DVElfRVZFTlRfUkVHX0FERFIgICAgIChFQ1RfVVNJUF9DVElfRVZFTlRfQkFTRV9BRERSICsgRUNUX1VTSVAxX1RIMF9DVElfRVZFTlRfUkVHX09GU1QpCisjZGVmaW5lIEVDVF9VU0lQMV9USDFfQ1RJX0VWRU5UX1JFR19BRERSICAgICAoRUNUX1VTSVBfQ1RJX0VWRU5UX0JBU0VfQUREUiArIEVDVF9VU0lQMV9USDFfQ1RJX0VWRU5UX1JFR19PRlNUKQorCisjZWxzZSAvLyBpZiBkZWZpbmVkIChfX01EOTVfXykgfHwgZGVmaW5lZCAoX19NRDkzX18pCisgICAjZXJyb3IgInVuc3VwcG9ydGVkIEdlbmVyYXRpb24iCisjZW5kaWYgIC8vaWYgZGVmaW5lZCAoX19NRDk3X18pICAgCisKKworLyogUkVHIHJlYWQgKi8KKyNkZWZpbmUgUkVHX1JFQUQzMih2YXIsIGFkZHIpICAgZG97ICh2YXIpID0gKih2b2xhdGlsZSBrYWxfdWludDMyICopKGFkZHIpOyB9d2hpbGUoMCkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVBJcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkIChfX01EOTdfXykKKwora2FsX3VpbnQzMiBFQ1RfR2V0X1VzaXBfQ1RJX1N0YXR1cygpCit7CisgICAga2FsX3VpbnQzMiBlY3Rfc3QgPSAwOworICAgIGthbF91aW50MzIgdXNpcF9jdGkgPSAwOworCisjaWYgZGVmaW5lZChfX0ZQR0FfXykgJiYgIWRlZmluZWQoVU1PTFlFX0NPU0lNKQorICAgIEhXX1BVUlBPU0UgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBQVVJQT1NFX05vdFN1cHBvcnQ7CisgICAgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBJTlRfRlBHQV9QVVJQT1NFKCk7CisgICAgaWYoZWN0X3BsYXRmb3JtX3ZlcnNpb24gPT0gRlBHQV9IMSkgLy8gbm90IHN1cHBvcnQKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZiAvLyBkZWZpbmVkKF9fRlBHQV9fKSAmJiAhZGVmaW5lZChVTU9MWUVfQ09TSU0pCisgICAgUkVHX1JFQUQzMih1c2lwX2N0aSwgRUNUX1VTSVBfQ1RJX1NUQVRVU19SRUdfQUREUik7CisKKyAgICBpZiAodXNpcF9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1VTSVAwX1RIMF9DVElfU1RBX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19VU0lQMF8wOworICAgIH0KKyAgICBpZiAodXNpcF9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1VTSVAwX1RIMV9DVElfU1RBX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19VU0lQMF8xOworICAgIH0KKyAgICBpZiAodXNpcF9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1VTSVAxX1RIMF9DVElfU1RBX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19VU0lQMV8wOworICAgIH0KKyAgICBpZiAodXNpcF9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1VTSVAxX1RIMV9DVElfU1RBX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19VU0lQMV8xOworICAgIH0KKyAgICByZXR1cm4gZWN0X3N0OworfQorCitrYWxfdWludDMyIEVDVF9HZXRfU2NxMTZfQ1RJX1N0YXR1cygpCit7CisgICAga2FsX3VpbnQzMiBlY3Rfc3QgPSAwOworICAgIGthbF91aW50MzIgc2NxMF9jb3JlMF9jdGkgPSAwOworICAgIGthbF91aW50MzIgc2NxMF9jb3JlMV9jdGkgPSAwOworICAgIGthbF91aW50MzIgc2NxMV9jb3JlMF9jdGkgPSAwOworICAgIGthbF91aW50MzIgc2NxMV9jb3JlMV9jdGkgPSAwOworCisjaWYgZGVmaW5lZChfX0ZQR0FfXykgJiYgIWRlZmluZWQoVU1PTFlFX0NPU0lNKQorICAgIEhXX1BVUlBPU0UgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBQVVJQT1NFX05vdFN1cHBvcnQ7CisgICAgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBJTlRfRlBHQV9QVVJQT1NFKCk7CisgICAgaWYoZWN0X3BsYXRmb3JtX3ZlcnNpb24gPT0gRlBHQV9IMSkgLy8gbm90IHN1cHBvcnQKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZiAvLyBkZWZpbmVkKF9fRlBHQV9fKSAmJiAhZGVmaW5lZChVTU9MWUVfQ09TSU0pCisKKyAgICBSRUdfUkVBRDMyKHNjcTBfY29yZTBfY3RpLCBFQ1RfU0NRMF9DT1JFMF9DVElfRVZFTlRfUkVHX0FERFIpOworICAgIFJFR19SRUFEMzIoc2NxMF9jb3JlMV9jdGksIEVDVF9TQ1EwX0NPUkUxX0NUSV9FVkVOVF9SRUdfQUREUik7CisgICAgUkVHX1JFQUQzMihzY3ExX2NvcmUwX2N0aSwgRUNUX1NDUTFfQ09SRTBfQ1RJX0VWRU5UX1JFR19BRERSKTsKKyAgICBSRUdfUkVBRDMyKHNjcTFfY29yZTFfY3RpLCBFQ1RfU0NRMV9DT1JFMV9DVElfRVZFTlRfUkVHX0FERFIpOworCisgICAgaWYgKHNjcTBfY29yZTBfY3RpKQorICAgIHsKKyAgICAgICAgZWN0X3N0IHw9IEVDVF9TUkNfU0NRMF8wOworICAgIH0KKyAgICBpZiAoc2NxMF9jb3JlMV9jdGkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19TQ1EwXzE7CisgICAgfQorICAgIGlmIChzY3ExX2NvcmUwX2N0aSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1NDUTFfMDsKKyAgICB9CisgICAgaWYgKHNjcTFfY29yZTFfY3RpKQorICAgIHsKKyAgICAgICAgZWN0X3N0IHw9IEVDVF9TUkNfU0NRMV8xOworICAgIH0KKworICAgIHJldHVybiBlY3Rfc3Q7Cit9CisKK2thbF91aW50MzIgRUNUX0dldF9NQ09SRV9DVElfU3RhdHVzKCkKK3sKKyAgICBrYWxfdWludDMyIGVjdF9zdCA9IDA7CisgICAga2FsX3VpbnQzMiBtY29yZTBfY3RpID0gMDsKKyNpZiBkZWZpbmVkKE1UNjI5NykKKyAgICBrYWxfdWludDMyIG1jb3JlMV9jdGkgPSAwOworI2VuZGlmCisgICAgCisjaWYgZGVmaW5lZChfX0ZQR0FfXykgJiYgIWRlZmluZWQoVU1PTFlFX0NPU0lNKQorICAgIEhXX1BVUlBPU0UgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBQVVJQT1NFX05vdFN1cHBvcnQ7CisgICAgZWN0X3BsYXRmb3JtX3ZlcnNpb24gPSBJTlRfRlBHQV9QVVJQT1NFKCk7CisgICAgaWYoZWN0X3BsYXRmb3JtX3ZlcnNpb24gPT0gRlBHQV9IMSB8fCBlY3RfcGxhdGZvcm1fdmVyc2lvbiA9PSBGUEdBX0gzKSAvLyBubyBtY29yZTAKKyAgICB7CisgICAgICAgIG1jb3JlMF9jdGkgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBSRUdfUkVBRDMyKG1jb3JlMF9jdGksIEVDVF9NQ09SRTBfQ1RJX0VWRU5UX1JFR19BRERSKTsKKyAgICB9CisjaWYgZGVmaW5lZChNVDYyOTcpCisgICAgaWYoZWN0X3BsYXRmb3JtX3ZlcnNpb24gPT0gRlBHQV9IMSB8fCBlY3RfcGxhdGZvcm1fdmVyc2lvbiA9PSBGUEdBX0gzIHx8IGVjdF9wbGF0Zm9ybV92ZXJzaW9uID09IEZQR0FfSDUpIC8vIG5vIG1jb3JlMQorICAgIHsKKyAgICAgICAgbWNvcmUxX2N0aSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFJFR19SRUFEMzIobWNvcmUxX2N0aSwgRUNUX01DT1JFMV9DVElfRVZFTlRfUkVHX0FERFIpOworICAgIH0KKyNlbmRpZiAvLyBkZWZpbmVkKE1UNjI5NykKKyNlbHNlIC8vIGRlZmluZWQoX19GUEdBX18pICYmICFkZWZpbmVkKFVNT0xZRV9DT1NJTSkKKyAgICBSRUdfUkVBRDMyKG1jb3JlMF9jdGksIEVDVF9NQ09SRTBfQ1RJX0VWRU5UX1JFR19BRERSKTsKKyNpZiBkZWZpbmVkKE1UNjI5NykKKyAgICBSRUdfUkVBRDMyKG1jb3JlMV9jdGksIEVDVF9NQ09SRTFfQ1RJX0VWRU5UX1JFR19BRERSKTsKKyNlbmRpZiAvLyBkZWZpbmVkKE1UNjI5NykKKyNlbmRpZiAvLyBkZWZpbmVkKF9fRlBHQV9fKSAmJiAhZGVmaW5lZChVTU9MWUVfQ09TSU0pCisKKyAgICAvLyBtY29yZTAgcGFydAorICAgIGlmIChtY29yZTBfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TT05JQ19DVElfRVZFTlRfVEgwX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19NQ09SRTBfMDsKKyAgICB9CisgICAgaWYgKG1jb3JlMF9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1NPTklDX0NUSV9FVkVOVF9USDFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX01DT1JFMF8xOworICAgIH0KKyAgICBpZiAobWNvcmUwX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfU09OSUNfQ1RJX0VWRU5UX1RIMl9CSVQpKQorICAgIHsKKyAgICAgICAgZWN0X3N0IHw9IEVDVF9TUkNfTUNPUkUwXzI7CisgICAgfQorICAgIGlmIChtY29yZTBfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TT05JQ19DVElfRVZFTlRfVEgzX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19NQ09SRTBfMzsKKyAgICB9CisKKyNpZiBkZWZpbmVkKE1UNjI5NykKKyAgICAvLyBtY29yZTEgcGFydAorICAgIGlmIChtY29yZTFfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TT05JQ19DVElfRVZFTlRfVEgwX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19NQ09SRTFfMDsKKyAgICB9CisgICAgaWYgKG1jb3JlMV9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1NPTklDX0NUSV9FVkVOVF9USDFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX01DT1JFMV8xOworICAgIH0KKyAgICBpZiAobWNvcmUxX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfU09OSUNfQ1RJX0VWRU5UX1RIMl9CSVQpKQorICAgIHsKKyAgICAgICAgZWN0X3N0IHw9IEVDVF9TUkNfTUNPUkUxXzI7CisgICAgfQorICAgIGlmIChtY29yZTFfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TT05JQ19DVElfRVZFTlRfVEgzX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19NQ09SRTFfMzsKKyAgICB9CisjZW5kaWYgLy8gZGVmaW5lZChNVDYyOTcpCisgICAgcmV0dXJuIGVjdF9zdDsKK30KKwora2FsX3VpbnQzMiBFQ1RfR2V0X1ZDT1JFX0NUSV9TdGF0dXMoKQoreworICAgIGthbF91aW50MzIgZWN0X3N0ID0gMDsKKyAgICBrYWxfdWludDMyIHZjb3JlX2N0aSA9IDA7CisKKyNpZiBkZWZpbmVkKF9fRlBHQV9fKSAmJiAhZGVmaW5lZChVTU9MWUVfQ09TSU0pCisgICAgSFdfUFVSUE9TRSBlY3RfcGxhdGZvcm1fdmVyc2lvbiA9IFBVUlBPU0VfTm90U3VwcG9ydDsKKyAgICBlY3RfcGxhdGZvcm1fdmVyc2lvbiA9IElOVF9GUEdBX1BVUlBPU0UoKTsKKyAgICBpZihlY3RfcGxhdGZvcm1fdmVyc2lvbiA9PSBGUEdBX0gxIHx8IGVjdF9wbGF0Zm9ybV92ZXJzaW9uID09IEZQR0FfSDMpIC8vIG5vIHZjb3JlCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLy8gZGVmaW5lZChfX0ZQR0FfXykgJiYgIWRlZmluZWQoVU1PTFlFX0NPU0lNKQorICAgIFJFR19SRUFEMzIodmNvcmVfY3RpLCBFQ1RfVkNPUkVfQ1RJX0VWRU5UX1JFR19BRERSKTsKKworICAgIGlmICh2Y29yZV9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1NPTklDX0NUSV9FVkVOVF9USDBfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1ZDT1JFMF8wOworICAgIH0KKyAgICBpZiAodmNvcmVfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TT05JQ19DVElfRVZFTlRfVEgxX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19WQ09SRTBfMTsKKyAgICB9CisgICAgaWYgKHZjb3JlX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfU09OSUNfQ1RJX0VWRU5UX1RIMl9CSVQpKQorICAgIHsKKyAgICAgICAgZWN0X3N0IHw9IEVDVF9TUkNfVkNPUkUwXzI7CisgICAgfQorI2lmIGRlZmluZWQoTVQ2Mjk3KQorICAgIGlmICh2Y29yZV9jdGkgJiBFQ1RfQklUX01BU0soRUNUX1NPTklDX0NUSV9FVkVOVF9USDNfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1ZDT1JFMF8zOworICAgIH0KKyNlbmRpZiAvLyBkZWZpbmVkKE1UNjI5NykKKyAgICByZXR1cm4gZWN0X3N0OworfQorCisjZWxpZiBkZWZpbmVkIChfX01EOTdQX18pCisKK2thbF91aW50MzIgRUNUX0dldF9Vc2lwX0NUSV9TdGF0dXMoKQoreyAgICAKKyAgICByZXR1cm4gMDsKK30KKwora2FsX3VpbnQzMiBFQ1RfR2V0X1NjcTE2X0NUSV9TdGF0dXMoKQoreworICAgICByZXR1cm4gMDsKK30KKwora2FsX3VpbnQzMiBFQ1RfR2V0X01DT1JFX0NUSV9TdGF0dXMoKQoreworICAgIHJldHVybiAwOworfQorCitrYWxfdWludDMyIEVDVF9HZXRfVkNPUkVfQ1RJX1N0YXR1cygpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbGlmIGRlZmluZWQgKF9fTUQ5NV9fKSB8fCBkZWZpbmVkIChfX01EOTNfXykKKwora2FsX3VpbnQzMiBFQ1RfR2V0X1VzaXBfQ1RJX1N0YXR1cygpCit7CisgICAga2FsX3VpbnQzMiBlY3Rfc3QgPSAwOworICAgIGthbF91aW50MzIgdXNpcF9jdGk7CisKKyAgICBSRUdfUkVBRDMyKHVzaXBfY3RpLCBFQ1RfVVNJUF9DVElfU1RBVFVTX1JFR19BRERSKTsKKworICAgIGlmICh1c2lwX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfVVNJUDBfVEgwX0NUSV9TVEFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1VTSVAwXzA7CisgICAgfQorICAgIGlmICh1c2lwX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfVVNJUDBfVEgxX0NUSV9TVEFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1VTSVAwXzE7CisgICAgfQorICAgIGlmICh1c2lwX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfVVNJUDFfVEgwX0NUSV9TVEFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1VTSVAxXzA7CisgICAgfQorICAgIGlmICh1c2lwX2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfVVNJUDFfVEgxX0NUSV9TVEFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1VTSVAxXzE7CisgICAgfQorICAgIHJldHVybiBlY3Rfc3Q7Cit9CisKK2thbF91aW50MzIgRUNUX0dldF9TY3ExNl9DVElfU3RhdHVzKCkKK3sKKyAgICBrYWxfdWludDMyIGVjdF9zdCA9IDA7CisgICAga2FsX3VpbnQzMiBzY3ExNl9jdGk7CisKKyAgICBSRUdfUkVBRDMyKHNjcTE2X2N0aSwgRUNUX1NDUTE2X0NUSV9TVEFUVVNfUkVHX0FERFIpOworCisgICAgaWYgKHNjcTE2X2N0aSAmIEVDVF9CSVRfTUFTSyhFQ1RfU0NRMTZfMF9DVElfU1RBX0JJVCkpCisgICAgeworICAgICAgICBlY3Rfc3QgfD0gRUNUX1NSQ19TQ1EwOworICAgIH0KKyAgICBpZiAoc2NxMTZfY3RpICYgRUNUX0JJVF9NQVNLKEVDVF9TQ1ExNl8xX0NUSV9TVEFfQklUKSkKKyAgICB7CisgICAgICAgIGVjdF9zdCB8PSBFQ1RfU1JDX1NDUTE7CisgICAgfQorCisgICAgcmV0dXJuIGVjdF9zdDsKK30KKworI2Vsc2UgLy8gaWYgZGVmaW5lZCAoX19NRDk1X18pIHx8IGRlZmluZWQgKF9fTUQ5M19fKQorICAgI2Vycm9yICJ1bnN1cHBvcnRlZCBHZW5lcmF0aW9uIgorI2VuZGlmICAvL2lmIGRlZmluZWQgKF9fTUQ5N19fKSAgIAorCg==