LyoKICogRE9TIFZpcnR1YWwgTWFjaGluZQogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4KICovCgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCi8qIGFwcGFyZW50bHkgRUxGIGltYWdlcyBhcmUgdXN1YWxseSBsb2FkZWQgaGlnaCBhbnl3YXkgKi8KI2lmbmRlZiBfX0VMRl9fCi8qIGlmIG5vdCwgZm9yY2UgZG9zbW9kIGF0IGhpZ2ggYWRkcmVzc2VzICovCmFzbSgiLm9yZyAweDExMDAwMCIpOwojZW5kaWYgX19FTEZfXwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNpbmNsdWRlIDxzeXMvdm04Ni5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUgImRvc21vZC5oIgoKIC8qIEZJWE1FOiBoYWNrIGJlY2F1c2UgbGliYyB2bTg2IG1heSBiZSB0aGUgb2xkIHN5c2NhbGwgdmVyc2lvbiAqLwoKI2RlZmluZSBTWVNfdm04NiAgIDE2NgoKc3RhdGljIF9faW5saW5lX18gaW50IHZtODZwbHVzKCBpbnQgZnVuYywgc3RydWN0IHZtODZwbHVzX3N0cnVjdCAqcHRyICkKewogICAgaW50IHJlczsKI2lmZGVmIF9fUElDX18KICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCAicHVzaGwgJSVlYnhcblx0IgogICAgICAgICAgICAgICAgICAgICAgICAgICJtb3ZsICUyLCUlZWJ4XG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ICQweDgwXG5cdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wbCAlJWVieCIKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHJlcykKICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIiAoU1lTX3ZtODYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImciIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjIiAocHRyKSApOwojZWxzZQogICAgX19hc21fXyBfX3ZvbGF0aWxlX18oImludCAkMHg4MCIKICAgICAgICAgICAgICAgICAgICAgICAgIDogIj1hIiAocmVzKQogICAgICAgICAgICAgICAgICAgICAgICAgOiAiMCIgKFNZU192bTg2KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImIiIChmdW5jKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgImMiIChwdHIpICk7CiNlbmRpZiAgLyogX19QSUNfXyAqLwogICAgaWYgKHJlcyA+PSAwKSByZXR1cm4gcmVzOwogICAgZXJybm8gPSAtcmVzOwogICAgcmV0dXJuIC0xOwp9CgppbnQgWFJFQUQoaW50IGZkLHZvaWQqYnVmLGludCBzaXplKSB7CiBpbnQgcmVzOwoKIHdoaWxlICgxKSB7CiAgcmVzID0gcmVhZChmZCwgYnVmLCBzaXplKTsKICBpZiAocmVzPT1zaXplKQogICByZXR1cm4gcmVzOwogIGlmIChyZXM9PS0xKSB7CiAgIGlmIChlcnJubz09RUlOVFIpCiAgICBjb250aW51ZTsKICAgcGVycm9yKCJkb3Ntb2QgcmVhZCIpOwogICByZXR1cm4gLTE7CiAgfQogIGZwcmludGYoc3RkZXJyLCJkb3Ntb2QgcmVhZCBvbmx5ICVkIG9mICVkIGJ5dGVzLlxuIixyZXMsc2l6ZSk7CiAgcmV0dXJuIHJlczsKIH0KfQppbnQgWFdSSVRFKGludCBmZCx2b2lkKmJ1ZixpbnQgc2l6ZSkgewogaW50IHJlczsKCiB3aGlsZSAoMSkgewogIHJlcyA9IHdyaXRlKGZkLCBidWYsIHNpemUpOwogIGlmIChyZXM9PXNpemUpCiAgIHJldHVybiByZXM7CiAgaWYgKHJlcz09LTEpIHsKICAgaWYgKGVycm5vPT1FSU5UUikKICAgIGNvbnRpbnVlOwogICBwZXJyb3IoImRvc21vZCB3cml0ZSIpOwogICByZXR1cm4gLTE7CiAgfQogIGZwcmludGYoc3RkZXJyLCJkb3Ntb2Qgd3JpdGUgb25seSAlZCBvZiAlZCBieXRlcy5cbiIscmVzLHNpemUpOwogIHJldHVybiByZXM7CiB9Cn0KCnZvaWQgc2V0X3RpbWVyKHN0cnVjdCB0aW1ldmFsKnRpbSkKewogc3RydWN0IGl0aW1lcnZhbCBjdXI7CgogY3VyLml0X2ludGVydmFsPSp0aW07CiBjdXIuaXRfdmFsdWU9KnRpbTsKIHNldGl0aW1lcihJVElNRVJfUkVBTCwmY3VyLE5VTEwpOwp9Cgp2b2lkIGdldF90aW1lcihzdHJ1Y3QgdGltZXZhbCp0aW0pCnsKIHN0cnVjdCBpdGltZXJ2YWwgY3VyOwoKIGdldGl0aW1lcihJVElNRVJfUkVBTCwmY3VyKTsKICp0aW09Y3VyLml0X3ZhbHVlOwp9Cgp2b2xhdGlsZSBpbnQgc2lnX3BlbmQsc2lnX2ZhdGFsPTAsc2lnX2Fscm09MDsKdm9pZCppbWc7CnN0cnVjdCB2bTg2cGx1c19zdHJ1Y3QgVk04NjsKCnZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZykKewogaWYgKHNpZ19wZW5kKSBmcHJpbnRmKHN0ZGVyciwiRE9TTU9EIHByZXZpb3VzIHNpZ25hbCAlZCBsb3N0XG4iLHNpZ19wZW5kKTsKIHNpZ19wZW5kPXNpZzsKIHNpZ25hbChzaWcsc2lnX2hhbmRsZXIpOwp9Cgp2b2lkIGJhZF9oYW5kbGVyKGludCBzaWcpCnsKIGZwcmludGYoc3RkZXJyLCJET1NNT0QgY2F1Z2h0IGZhdGFsIHNpZ25hbCAlZFxuIixzaWcpOwogZnByaW50ZihzdGRlcnIsIihMYXN0IGtub3duIFZNODYgQ1M6SVAgd2FzICUwNHg6JTA0bHgpXG4iLFZNODYucmVncy5jcyxWTTg2LnJlZ3MuZWlwKTsKIHNpZ19wZW5kPXNpZzsgc2lnX2ZhdGFsKys7CiBzaWduYWwoc2lnLGJhZF9oYW5kbGVyKTsKfQoKdm9pZCBhbGFybV9oYW5kbGVyKGludCBzaWcpCnsKIHNpZ19hbHJtKys7CiBzaWduYWwoc2lnLGFsYXJtX2hhbmRsZXIpOwp9CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyKiphcmd2KQp7CiBpbnQgbWZkPW9wZW4oYXJndlswXSxPX1JEV1IpOwogc3RydWN0IHRpbWV2YWwgdGltOwogaW50IGZ1bmMscmV0Owogb2ZmX3QgZm9mcz0wOwogcGlkX3QgcHBpZD1nZXRwcGlkKCk7CiAKLyogZnByaW50ZihzdGRlcnIsIm1haW4gaXMgYXQgJTA4bHgsIGZpbGUgaXMgJXMsIGZkPSVkXG4iLCh1bnNpZ25lZCBsb25nKSZtYWluLGFyZ3ZbMF0sbWZkKTsgKi8KIGlmIChtZmQ8MCkgcmV0dXJuIDE7Ci8qIE1hcCBpbiBvdXIgRE9TIGltYWdlIGF0IHRoZSBzdGFydCBvZiB0aGUgcHJvY2VzcyBhZGRyZXNzIHNwYWNlICovCiBpZiAoYXJndlsxXSkgewogIC8qIFVscmljaCBXZWlnYW5kIHN1Z2dlc3RlZCBtYXBwaW5nIGluIHRoZSBET1MgaW1hZ2UgZGlyZWN0bHkgZnJvbSB0aGUgV2luZQogICAgIGFkZHJlc3Mgc3BhY2UgKi8KICBmb2ZzPWF0b2woYXJndlsxXSk7CiAgLyogbGludXggY3VycmVudGx5IG9ubHkgYWxsb3dzIG1hcHBpbmcgYSBwcm9jZXNzIG1lbW9yeSBpZiBpdCdzIGJlaW5nIHB0cmFjZWQgKi8KICAvKiBMaW51cyBkb2Vzbid0IGxpa2UgaXQsIHNvIHRoaXMgcHJvYmFibHkgd29uJ3Qgd29yayBpbiB0aGUgZnV0dXJlICovCiAgLyogaXQgZG9lc24ndCBldmVuIHdvcmsgZm9yIG1lIHJpZ2h0IG5vdyAqLwogIGtpbGwocHBpZCxTSUdTVE9QKTsKICBwdHJhY2UoUFRSQUNFX0FUVEFDSCxwcGlkLDAsMCk7CiAgd2FpdHBpZChwcGlkLE5VTEwsMCk7CiB9CiBpbWc9bW1hcChOVUxMLDB4MTEwMDAwLFBST1RfRVhFQ3xQUk9UX1JFQUR8UFJPVF9XUklURSxNQVBfRklYRUR8TUFQX1NIQVJFRCxtZmQsZm9mcyk7CiBpZiAoYXJndlsxXSkgewogIHB0cmFjZShQVFJBQ0VfREVUQUNILHBwaWQsMCwwKTsKICBraWxsKHBwaWQsU0lHQ09OVCk7CiB9CiBpZiAoaW1nPT0odm9pZCopLTEpIHsKICBmcHJpbnRmKHN0ZGVyciwiRE9TIG1lbW9yeSBtYXAgZmFpbGVkLCBlcnJvcj0lc1xuIixzdHJlcnJvcihlcnJubykpOwogIGZwcmludGYoc3RkZXJyLCJpbiBhdHRlbXB0IHRvIG1hcCAlcywgb2Zmc2V0ICUwOGxYLCBsZW5ndGggMTEwMDAwLCB0byBvZmZzZXQgMFxuIixhcmd2WzBdLGZvZnMpOwogIHJldHVybiAxOwogfQovKiBpbml0aWFsaXplIHNpZ25hbHMgYW5kIHN5c3RlbSB0aW1lciAqLwogc2lnbmFsKFNJR0hVUCxzaWdfaGFuZGxlcik7CiBzaWduYWwoU0lHSU5ULHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdVU1IxLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdVU1IyLHNpZ19oYW5kbGVyKTsKIHNpZ25hbChTSUdBTFJNLGFsYXJtX2hhbmRsZXIpOwoKIHNpZ25hbChTSUdRVUlULGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdJTEwsYmFkX2hhbmRsZXIpOwogc2lnbmFsKFNJR0JVUyxiYWRfaGFuZGxlcik7CiBzaWduYWwoU0lHRlBFLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdTRUdWLGJhZF9oYW5kbGVyKTsKIHNpZ25hbChTSUdURVJNLGJhZF9oYW5kbGVyKTsKI2lmIDAKIHRpbS50dl9zZWM9MDsgdGltLnR2X3VzZWM9NTQ5MjU7CiBzZXRfdGltZXIoJnRpbSk7CiNlbmRpZgovKiByZXBvcnQgYmFjayB0byB0aGUgbWFpbiBwcm9ncmFtIHRoYXQgd2UncmUgcmVhZHkgKi8KIHJldD0xOyAvKiBkb3Ntb2QgcHJvdG9jb2wgcmV2aXNpb24gMSAqLwogWFdSSVRFKDEsJnJldCxzaXplb2YocmV0KSk7Ci8qIGNvbnRleHQgZXhjaGFuZ2UgbG9vcCAqLwogZG8gewogIGlmIChYUkVBRCgwLCZmdW5jLHNpemVvZihmdW5jKSkhPXNpemVvZihmdW5jKSkgcmV0dXJuIDE7CiAgaWYgKGZ1bmM8MCkgYnJlYWs7CiAgc3dpdGNoIChmdW5jKSB7CiAgIGNhc2UgRE9TTU9EX1NFVF9USU1FUjoKICAgIGlmIChYUkVBRCgwLCZ0aW0sc2l6ZW9mKHRpbSkpIT1zaXplb2YodGltKSkgcmV0dXJuIDE7CiAgICBzZXRfdGltZXIoJnRpbSk7CiAgICAvKiBubyByZXNwb25zZSAqLwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX0dFVF9USU1FUjoKICAgIGdldF90aW1lcigmdGltKTsKICAgIGlmIChYV1JJVEUoMSwmdGltLHNpemVvZih0aW0pKSE9c2l6ZW9mKHRpbSkpIHJldHVybiAxOwogICAgYnJlYWs7CiAgIGNhc2UgRE9TTU9EX0VOVEVSOgogICBkZWZhdWx0OgogICAgaWYgKFhSRUFEKDAsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIGlmIChzaWdfcGVuZHx8c2lnX2Fscm0pIHJldD1ET1NNT0RfU0lHTkFMOyBlbHNlCiAgICAgcmV0PXZtODZwbHVzKGZ1bmMsJlZNODYpOwogICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgICBpZiAoWFdSSVRFKDEsJlZNODYsc2l6ZW9mKFZNODYpKSE9c2l6ZW9mKFZNODYpKSByZXR1cm4gMTsKICAgIHN3aXRjaCAocmV0JjB4ZmYpIHsKICAgICBjYXNlIERPU01PRF9TSUdOQUw6CiAgICAgIHJldD1zaWdfcGVuZDsgc2lnX3BlbmQ9MDsKICAgICAgaWYgKCFyZXQpIHsgcmV0PVNJR0FMUk07IHNpZ19hbHJtLS07IH0KICAgICAgaWYgKFhXUklURSgxLCZyZXQsc2l6ZW9mKHJldCkpIT1zaXplb2YocmV0KSkgcmV0dXJuIDE7CiAgICAgIGlmIChzaWdfZmF0YWwpIHJldHVybiAxOwogICAgICBicmVhazsKICAgIH0KICB9CiB9IHdoaWxlICgxKTsKIHJldHVybiAwOwp9CgojZWxzZSAvKiAhbGludXgtaTM4NiAqLwppbnQgbWFpbih2b2lkKSB7cmV0dXJuIDE7fQojZW5kaWYK