LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gc3lzdGVtIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaHJfc3lzdGVtLmMKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CgojaW5jbHVkZSAiaG9zdC5oIgojaW5jbHVkZSAiaG9zdF9yZXMuaCIKI2luY2x1ZGUgImhyX3N5c3RlbS5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgoKI2lmZGVmIEhBVkVfU1lTX1BST0NfSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlICJzeXMvcHJvYy5oIgojZW5kaWYKI2lmbmRlZiBtaW5ndzMyCiNpZiBIQVZFX1VUTVBYX0gKI2luY2x1ZGUgPHV0bXB4Lmg+CiNlbHNlCiNpbmNsdWRlIDx1dG1wLmg+CiNlbmRpZgojZW5kaWYgLyogbWluZ3czMiAqLwojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDxsbS5oPgojZW5kaWYKCiNpZmRlZiBsaW51eAojaWZkZWYgSEFWRV9MSU5VWF9UQVNLU19ICiNpbmNsdWRlIDxsaW51eC90YXNrcy5oPgojZWxzZQovKgogKiBJZiB0aGlzIGZpbGUgZG9lc24ndCBleGlzdCwgdGhlbiB0aGVyZSBpcyBubyBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIKICogb2YgcHJvY2Vzc2VzLCBzbyByZXR1cm4gMCBmb3IgaHJTeXN0ZW1NYXhQcm9jZXNzZXMuICAKICovCiNkZWZpbmUgTlJfVEFTS1MJMAojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQojaW5jbHVkZSA8c3lzL3BzdGF0Lmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoc29sYXJpczIpCiNpbmNsdWRlIDxrc3RhdC5oPgojaW5jbHVkZSA8c3lzL3Zhci5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvb3BlbnByb21pby5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TWVNDVExfSAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCiNpZiAhZGVmaW5lZChVVE1QX0ZJTEUpICYmIGRlZmluZWQoX1BBVEhfVVRNUCkKI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAojZW5kaWYKCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAp2b2lkICAgICAgICAgICAgc2V0dXRlbnQodm9pZCk7CnZvaWQgICAgICAgICAgICBlbmR1dGVudCh2b2lkKTsKc3RydWN0IHV0bXAgICAgKmdldHV0ZW50KHZvaWQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlcihpbnQgYWN0aW9uLCB1X2NoYXIgKiB2YXJfdmFsLCB1X2NoYXIgdmFyX3ZhbF90eXBlLCBzaXplX3QgdmFyX3ZhbF9sZW4sIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pOwpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwgc2l6ZV90IHZhbHVlX2xlbik7CnN0YXRpYyBpbnQgZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICpwYXJhbWV0ZXIsIGNoYXIgKm91dHB1dCk7CnN0YXRpYyBsb25nICAgICBnZXRfbWF4X3NvbGFyaXNfcHJvY2Vzc2VzKHZvaWQpOwojZW5kaWYKc3RhdGljIGludCAgICAgIGdldF9sb2FkX2Rldih2b2lkKTsKc3RhdGljIGludCAgICAgIGNvdW50X3VzZXJzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY291bnRfcHJvY2Vzc2VzKHZvaWQpOwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbml0aWFsaXNhdGlvbiAmIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2RlZmluZQlIUlNZU19VUFRJTUUJCTEKI2RlZmluZQlIUlNZU19EQVRFCQkyCiNkZWZpbmUJSFJTWVNfTE9BRF9ERVYJCTMKI2RlZmluZQlIUlNZU19MT0FEX1BBUkFNCTQKI2RlZmluZQlIUlNZU19VU0VSUwkJNQojZGVmaW5lCUhSU1lTX1BST0NTCQk2CiNkZWZpbmUJSFJTWVNfTUFYUFJPQ1MJCTcKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgUk9OTFksIHZhcl9ocnN5cywgMSwgezF9fSwKICAgIHtIUlNZU19EQVRFLCBBU05fT0NURVRfU1RSLCBSV1JJVEUsIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHszfX0sCiAgICB7SFJTWVNfTE9BRF9QQVJBTSwgQVNOX09DVEVUX1NUUiwgUldSSVRFLCB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgUk9OTFksIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7Nn19LAogICAge0hSU1lTX01BWFBST0NTLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZWxzZQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgUk9OTFksIHZhcl9ocnN5cywgMSwgezF9fSwKICAgIHtIUlNZU19EQVRFLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7Mn19LAogICAge0hSU1lTX0xPQURfREVWLCBBU05fSU5URUdFUiwgUk9OTFksIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBST05MWSwgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHs1fX0sCiAgICB7SFJTWVNfUFJPQ1MsIEFTTl9HQVVHRSwgUk9OTFksIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIFJPTkxZLCB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2VuZGlmCm9pZCAgICAgICAgICAgICBocnN5c3RlbV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAxIH07CgoKdm9pZAppbml0X2hyX3N5c3RlbSh2b2lkKQp7CiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N5c3RlbSIsIGhyc3lzdGVtX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGhyc3lzdGVtX3ZhcmlhYmxlc19vaWQpOwp9IC8qIGVuZCBpbml0X2hyX3N5c3RlbSAqLwoKLyoKICogaGVhZGVyX2hyc3lzKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqLwoKaW50CmhlYWRlcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTWVNfTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zeXN0ZW0iLCAidmFyX2hyc3lzOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3lzdGVtIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N5c3RlbSIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTWVNfTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nKTsgICAgLyogZGVmYXVsdCB0byAnbG9uZycgcmVzdWx0cyAqLwogICAgcmV0dXJuIChNQVRDSF9TVUNDRUVERUQpOwp9IC8qIGVuZCBoZWFkZXJfaHJzeXMgKi8KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgU3lzdGVtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgp1X2NoYXIgICAgICAgICAqCnZhcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMjldOyAvKiBwZXIgTUlCLCBtYXggc2l6ZSBpcyAxMjggKi8KI2lmIGRlZmluZWQoc29sYXJpczIpCiAgICAvKiBtYXggc2l6ZSBvZiBudnJhbSBwcm9wZXJ0eSAqLwogICAgY2hhciBib290cGFyYW1bODE5Ml07CiNlbmRpZgogICAgdGltZV90ICAgICAgICAgIG5vdzsKI2lmICEoZGVmaW5lZChOUl9UQVNLUykgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKSkKICAgIGludCAgICAgICAgICAgICBucHJvYyA9IDA7CiNlbmRpZgojaWZkZWYgbGludXgKICAgIEZJTEUgICAgICAgICAgICpmcDsKI2VuZGlmCiNpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICYmIGRlZmluZWQoQ1RMX0tFUk4pICYmIGRlZmluZWQoS0VSTl9NQVhQUk9DKQogICAgc3RhdGljIGludCAgICAgIG1heHByb2NfbWliW10gPSB7IENUTF9LRVJOLCBLRVJOX01BWFBST0MgfTsKICAgIHNpemVfdCAgICAgICAgICBidWZfc2l6ZTsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICBzdHJ1Y3QgcHN0X3N0YXRpYyBwc3RfYnVmOwojZW5kaWYKCiAgICBpZiAoaGVhZGVyX2hyc3lzKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpID09CiAgICAgICAgTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEhSU1lTX1VQVElNRToKICAgICAgICBsb25nX3JldHVybiA9IGdldF91cHRpbWUoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19EQVRFOgojaWYgZGVmaW5lZChIQVZFX01LVElNRSkgJiYgZGVmaW5lZChIQVZFX1NUSU1FKQogICAgICAgICp3cml0ZV9tZXRob2Q9bnNfc2V0X3RpbWU7CiNlbmRpZgogICAgICAgICh2b2lkICopIHRpbWUoJm5vdyk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgZGF0ZV9uX3RpbWUoJm5vdywgdmFyX2xlbik7CiAgICBjYXNlIEhSU1lTX0xPQURfREVWOgogICAgICAgIGxvbmdfcmV0dXJuID0gZ2V0X2xvYWRfZGV2KCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTWVNfTE9BRF9QQVJBTToKI2lmZGVmIGxpbnV4CiAgICAgICAgaWYoKGZwID0gZm9wZW4oIi9wcm9jL2NtZGxpbmUiLCAiciIpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZnZXRzKHN0cmluZywgc2l6ZW9mKHN0cmluZyksIGZwKTsKICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiAgICAgICAgKndyaXRlX21ldGhvZD1zZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXI7CiAgICAgICAgaWYgKCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKCJib290LWNvbW1hbmQiLGJvb3RwYXJhbSkgKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBsb29rdXAgYm9vdC1jb21tYW5kIGZyb20gZWVwcm9tXG4iKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHN0cmxjcHkoc3RyaW5nLGJvb3RwYXJhbSxzaXplb2Yoc3RyaW5nKSk7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBzcHJpbnRmKHN0cmluZywgImFzayBEYXZlIik7ICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJTWVNfVVNFUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBjb3VudF91c2VycygpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX1BST0NTOgojaWYgVVNJTkdfSE9TVF9IUl9TV1JVTl9NT0RVTEUKICAgICAgICBsb25nX3JldHVybiA9IGNvdW50X3Byb2Nlc3NlcygpOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19NQVhQUk9DUzoKI2lmIGRlZmluZWQoTlJfVEFTS1MpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBOUl9UQVNLUzsgLyogPGxpbnV4L3Rhc2tzLmg+ICovCiNlbGlmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgJiYgZGVmaW5lZChDVExfS0VSTikgJiYgZGVmaW5lZChLRVJOX01BWFBST0MpCiAgICAgICAgYnVmX3NpemUgPSBzaXplb2YobnByb2MpOwogICAgICAgIGlmIChzeXNjdGwobWF4cHJvY19taWIsIDIsICZucHJvYywgJmJ1Zl9zaXplLCBOVUxMLCAwKSA8IDApCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGxvbmdfcmV0dXJuID0gbnByb2M7CiNlbGlmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBwc3RhdF9nZXRzdGF0aWMoJnBzdF9idWYsIHNpemVvZihzdHJ1Y3QgcHN0X3N0YXRpYyksIDEsIDApOwogICAgICAgIGxvbmdfcmV0dXJuID0gcHN0X2J1Zi5tYXhfcHJvYzsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIGxvbmdfcmV0dXJuPWdldF9tYXhfc29sYXJpc19wcm9jZXNzZXMoKTsKICAgIGlmKGxvbmdfcmV0dXJuID09IC0xKSByZXR1cm4gTlVMTDsKI2VsaWYgZGVmaW5lZChOUFJPQ19TWU1CT0wpCiAgICAgICAgYXV0b19ubGlzdChOUFJPQ19TWU1CT0wsIChjaGFyICopICZucHJvYywgc2l6ZW9mKGludCkpOwogICAgICAgIGxvbmdfcmV0dXJuID0gbnByb2M7CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaHJzeXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfSAvKiBlbmQgdmFyX2hyc3lzICovCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKI2lmIGRlZmluZWQoc29sYXJpczIpCgovKiBmdW5jdGlvbnMgZm9yIG1hbGxvYyBhbmQgZnJlZWluZyBvcGVucHJvbWlvIHN0cnVjdHVyZSAqLwpzdGF0aWMgc3RydWN0IG9wZW5wcm9taW8gKiBvcF9tYWxsb2Moc2l6ZV90IHNpemUpCnsKICAgIHN0cnVjdCBvcGVucHJvbWlvICpvcDsKICAgIG9wPW1hbGxvYyhzaXplb2Yoc3RydWN0IG9wZW5wcm9taW8pICsgc2l6ZSk7CiAgICBpZihvcCA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwidW5hYmxlIHRvIG1hbGxvYyBtZW1vcnlcbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG1lbXNldChvcCwgMCwgc2l6ZW9mKHN0cnVjdCBvcGVucHJvbWlvKStzaXplKTsKICAgIG9wLT5vcHJvbV9zaXplPXNpemU7CgogICAgcmV0dXJuIG9wOwp9CgpzdGF0aWMgdm9pZCBvcF9mcmVlKHN0cnVjdCBvcGVucHJvbWlvICpvcCkgewogICAgZnJlZShvcCk7Cn0KCnN0YXRpYyBpbnQKc2V0X3NvbGFyaXNfYm9vdGNvbW1hbmRfcGFyYW1ldGVyKGludCBhY3Rpb24sCiAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikgewoKICAgIHN0YXRpYyBjaGFyIG9sZF92YWx1ZVsxMDI0XSwqcF9vbGRfdmFsdWU9b2xkX3ZhbHVlOwogICAgaW50IHN0YXR1cz0wOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAgICAgLyogY2hlY2sgdHlwZSAqLwogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIndyaXRlIHRvIHNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlciBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFJFU0VSVkUyOiB7CiAgICAgICAgICAgIC8qIGNyZWF0ZSBjb3B5IG9mIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpZihzdGF0UCkgewogICAgICAgICAgICAgICAgaW50IG9sZF92YWxfbGVuPXN0cmxlbihzdGF0UCk7CiAgICAgICAgICAgICAgICBpZihvbGRfdmFsX2xlbiA+PSBzaXplb2Yob2xkX3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPShjaGFyICopbWFsbG9jKG9sZF92YWxfbGVuKzEpOwogICAgICAgICAgICAgICAgICAgIGlmKHBfb2xkX3ZhbHVlPT1OVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBtYWxsb2MgbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RybGNweShwX29sZF92YWx1ZSxzdGF0UCxvbGRfdmFsX2xlbisxKTsKICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1OVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBBQ1RJT046IHsKICAgICAgICAgICAgc3RhdHVzPXNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoImJvb3QtY29tbWFuZCIsKGNoYXIgKil2YXJfdmFsLHZhcl92YWxfbGVuKTsKICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgVU5ETzogewogICAgICAgICAgICAvKiByZXZlcnQgdG8gb2xkIHZhbHVlICovCiAgICAgICAgICAgIGlmKHBfb2xkX3ZhbHVlKSB7IAogICAgICAgICAgICAgICAgc3RhdHVzPXNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoImJvb3QtY29tbWFuZCIsKGNoYXIgKilwX29sZF92YWx1ZSxzdHJsZW4ocF9vbGRfdmFsdWUpKTsKICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsgCiAgICAgICAgICAgICAgICBpZihzdGF0dXMhPTApIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEZSRUU6CiAgICAgICAgY2FzZSBDT01NSVQ6CiAgICAgICAgICAgIC8qIGZyZWUgbWVtb3J5IGlmIG5lY2Vzc2FyeSAqLwogICAgICAgICAgICBpZihwX29sZF92YWx1ZSAhPSAgb2xkX3ZhbHVlKSB7CiAgICAgICAgICAgICAgICBmcmVlKHBfb2xkX3ZhbHVlKTsKICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbikgewoKICAgIGludCBzdGF0dXM9MDsKICAgIGNoYXIgYnVmZmVyWzEwMjRdLCpwYnVmZmVyPWJ1ZmZlcjsKICAgIAogICAgaWYoIHN0cmxlbihrZXkpK3N0cmxlbih2YWx1ZSkrMTYgPiBzaXplb2YoYnVmZmVyKSApIHsKICAgICAgICBwYnVmZmVyPShjaGFyICopbWFsbG9jKHN0cmxlbihrZXkpK3N0cmxlbih2YWx1ZSkrMTYpOwogICAgfSAKCiAgICAKICAgIHNwcmludGYocGJ1ZmZlciwgImVlcHJvbSAlcz1cIiUuKnNcIlxuIiwga2V5LCB2YXJfdmFsX2xlbiwgdmFsdWUpOwoKICAgIHN0YXR1cz1zeXN0ZW0ocGJ1ZmZlcik7CgogICAgaWYocGJ1ZmZlciE9YnVmZmVyKSBmcmVlKHBidWZmZXIpOwogICAgcmV0dXJuIHN0YXR1czsKfQoKc3RhdGljIGludCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgY2hhciAqb3V0YnVmZmVyKSB7CgogICAgaW50IGZkPTAsc3RhdHVzPTA7CiAgICBzdHJ1Y3Qgb3BlbnByb21pbyAqb3BlbnByb21pbmZvPU5VTEw7CgogICAgZmQ9b3BlbigiL2Rldi9vcGVucHJvbSIsT19SRE9OTFkpOwogICAgaWYgKCBmZCA9PSAtMSApIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIi9kZXYvb3BlbnByb20iKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBvcGVucHJvbWluZm8gPSBvcF9tYWxsb2MoODE5Mik7CiAgICBpZighb3BlbnByb21pbmZvKSByZXR1cm4gMTsKCiAgICBzdHJjcHkob3BlbnByb21pbmZvLT5vcHJvbV9hcnJheSxwYXJhbWV0ZXIpOwoKICAgIHN0YXR1cz1pb2N0bChmZCxPUFJPTUdFVE9QVCxvcGVucHJvbWluZm8pOwogICAgaWYgKCBzdGF0dXMgPT0gLTEgKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCIvZGV2L29wZW5wcm9tIik7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIG9wX2ZyZWUob3BlbnByb21pbmZvKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHN0cmNweShvdXRidWZmZXIsb3BlbnByb21pbmZvLT5vcHJvbV9hcnJheSk7CgogICAgb3BfZnJlZShvcGVucHJvbWluZm8pOwoKICAgIC8qIGNsb3NlIGZpbGUgKi8KICAgIGNsb3NlKGZkKTsKCiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyBsb25nIGdldF9tYXhfc29sYXJpc19wcm9jZXNzZXModm9pZCkgewoKICAgIGtzdGF0X2N0bF90ICprc2M9TlVMTDsKICAgIGtzdGF0X3QgKmtzPU5VTEw7CiAgICBzdHJ1Y3QgdmFyIHY7CiAgICBzdGF0aWMgbG9uZyBtYXhwcm9jcz0tMTsKCiAgICAvKiBhc3N1bWUgb25seSBuZWNlc3NhcnkgdG8gY29tcHV0ZSBvbmNlLCBzaW5jZSAvZXRjL3N5c3RlbSBtdXN0IGJlIG1vZGlmaWVkICovCiAgICBpZiAobWF4cHJvY3MgPT0gLTEpIHsKICAgICAgICBpZiAoIChrc2M9a3N0YXRfb3BlbigpKSAhPSBOVUxMICYmIAogICAgICAgICAgICAgKGtzPWtzdGF0X2xvb2t1cChrc2MsICJ1bml4IiwgMCwgInZhciIpKSAhPSBOVUxMICYmIAogICAgICAgICAgICAgKGtzdGF0X3JlYWQoa3NjLCBrcywgJnYpICE9IC0xKSkgewoKICAgICAgICAgICAgbWF4cHJvY3M9di52X3Byb2M7CiAgICAgICAgfQogICAgICAgIGlmKGtzYykgewogICAgICAgICAgICBrc3RhdF9jbG9zZShrc2MpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF4cHJvY3M7Cn0KCiNlbmRpZgoKI2lmIGRlZmluZWQoSEFWRV9NS1RJTUUpICYmIGRlZmluZWQoSEFWRV9TVElNRSkKaW50Cm5zX3NldF90aW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewoKICAgIHN0YXRpYyB0aW1lX3Qgb2xkdGltZT0wOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAgICAgLyogY2hlY2sgdHlwZSAqLwogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIndyaXRlIHRvIG5zX3NldF90aW1lIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhcl92YWxfbGVuICE9IDggJiYgdmFyX3ZhbF9sZW4hPTExKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBuc19zZXRfdGltZSBub3QgYSBwcm9wZXIgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBGUkVFOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBQ1RJT046IHsKICAgICAgICAgICAgbG9uZyBzdGF0dXM9MDsKICAgICAgICAgICAgdGltZV90IHNlY29uZHM9MDsKICAgICAgICAgICAgc3RydWN0IHRtIG5ld3RpbWV0bTsKICAgICAgICAgICAgaW50IGhvdXJzX2Zyb21fdXRjPSAwOwogICAgICAgICAgICBpbnQgbWludXRlc19mcm9tX3V0Yz0gMDsKCiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiA9PSAxMSkgewogICAgICAgICAgICAgICAgLyogdGltZXpvbmUgaW5mb3JhbWF0aW9uIHdhcyBwcmVzZW50ICovCiAgICAgICAgICAgICAgICBob3Vyc19mcm9tX3V0Yz0oaW50KXZhcl92YWxbOV07CiAgICAgICAgICAgICAgICBtaW51dGVzX2Zyb21fdXRjPShpbnQpdmFyX3ZhbFsxMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9zZWM9KGludCl2YXJfdmFsWzZdOzsKICAgICAgICAgICAgbmV3dGltZXRtLnRtX21pbj0oaW50KXZhcl92YWxbNV07CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9ob3VyPShpbnQpdmFyX3ZhbFs0XTsKCiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9tb249KGludCl2YXJfdmFsWzJdLTE7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV95ZWFyPTI1NiooaW50KXZhcl92YWxbMF0rKGludCl2YXJfdmFsWzFdLTE5MDA7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9tZGF5PShpbnQpdmFyX3ZhbFszXTsKCiAgICAgICAgICAgIC8qIGRldGVybWluZSBpZiBkYXkgbGlnaHQgc2F2aW5ncyB0aW1lIGluIGVmZmVjdCBEU1QgKi8KICAgICAgICAgICAgaWYgKCAoIGhvdXJzX2Zyb21fdXRjKjYwKjYwK21pbnV0ZXNfZnJvbV91dGMqNjAgKSA9PSBhYnModGltZXpvbmUpICkgewogICAgICAgICAgICAgICAgbmV3dGltZXRtLnRtX2lzZHN0PTA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXd0aW1ldG0udG1faXNkc3Q9MTsKICAgICAgICAgICAgfSAKCiAgICAgICAgICAgIC8qIGNyZWF0ZSBjb3B5IG9mIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBvbGR0aW1lPXRpbWUoTlVMTCk7CgogICAgICAgICAgICBzZWNvbmRzPW1rdGltZSgmbmV3dGltZXRtKTsKICAgICAgICAgICAgaWYoc2Vjb25kcyA9PSAodGltZV90KS0xKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIGNvbnZlcnQgdGltZSB2YWx1ZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXR1cz1zdGltZSgmc2Vjb25kcyk7CiAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBzZXQgdGltZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIFVORE86IHsKICAgICAgICAgICAgLyogcmV2ZXJ0IHRvIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpbnQgc3RhdHVzPTA7CiAgICAgICAgICAgIGlmKG9sZHRpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgc3RhdHVzPXN0aW1lKCZvbGR0aW1lKTsKICAgICAgICAgICAgICAgIG9sZHRpbWU9MDsgICAgCiAgICAgICAgICAgICAgICBpZihzdGF0dXMhPTApIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIHNldCB0aW1lXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBDT01NSVQ6IHsKICAgICAgICAgICAgb2xkdGltZT0wOyAgICAKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KI2VuZGlmCgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICBSZXR1cm4gdGhlIERldmljZUluZGV4IGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgICAqICAgdG8gdGhlIGJvb3QgZGV2aWNlCiAgICAgICAgICAgICAgICAgKi8Kc3RhdGljIGludApnZXRfbG9hZF9kZXYodm9pZCkKewogICAgcmV0dXJuIChIUkRFVl9ESVNLIDw8IEhSREVWX1RZUEVfU0hJRlQpOyAgICAvKiBYWFggKi8KfSAvKiBlbmQgZ2V0X2xvYWRfZGV2ICovCgpzdGF0aWMgaW50CmNvdW50X3VzZXJzKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICB0b3RhbCA9IDA7CiNpZm5kZWYgV0lOMzIKI2lmIEhBVkVfVVRNUFhfSAojZGVmaW5lIHNldHV0ZW50IHNldHV0eGVudAojZGVmaW5lIHB1dHV0bGluZSBwdXR1dHhsaW5lCiNkZWZpbmUgZ2V0dXRlbnQgZ2V0dXR4ZW50CiNkZWZpbmUgZW5kdXRlbnQgZW5kdXR4ZW50CiAgICBzdHJ1Y3QgdXRtcHggICAqdXRtcF9wOwojZWxzZQogICAgc3RydWN0IHV0bXAgICAgKnV0bXBfcDsKI2VuZGlmCgogICAgc2V0dXRlbnQoKTsKICAgIHdoaWxlICgodXRtcF9wID0gZ2V0dXRlbnQoKSkgIT0gTlVMTCkgewojaWZuZGVmIFVUTVBfSEFTX05PX1RZUEUKICAgICAgICBpZiAodXRtcF9wLT51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykKICAgICAgICAgICAgY29udGludWU7CiNlbmRpZgojaWZuZGVmIFVUTVBfSEFTX05PX1BJRAogICAgICAgICAgICAvKiBUaGlzIGJsb2NrIG9mIGNvZGUgZml4ZXMgem9tYmllIHVzZXIgUElEcyBpbiB0aGUKICAgICAgICAgICAgICAgdXRtcC91dG1weCBmaWxlIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGNvdW50ZWQgYXMgYQogICAgICAgICAgICAgICBjdXJyZW50IHVzZXIgKi8KICAgICAgICAgICAgaWYgKGtpbGwodXRtcF9wLT51dF9waWQsIDApID09IC0xICYmIGVycm5vID09IEVTUkNIKSB7CiAgICAgICAgICAgICAgICB1dG1wX3AtPnV0X3R5cGUgPSBERUFEX1BST0NFU1M7CiAgICAgICAgICAgICAgICBwdXR1dGxpbmUodXRtcF9wKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICArK3RvdGFsOwogICAgfQogICAgZW5kdXRlbnQoKTsKI2Vsc2UgLyogV0lOMzIgKi8KICAgLyogCiAgICAqIFRPRE8gLSBFcnJvciBjaGVja2luZy4KICAgICovCglMUFdLU1RBX0lORk9fMTAyIHdraW5mbzsKCU5FVF9BUElfU1RBVFVTIG5zdGF0dXM7CgkKCW5zdGF0dXMgPSBOZXRXa3N0YUdldEluZm8oTlVMTCwgMTAyLCAoTFBCWVRFKikmd2tpbmZvKTsKCWlmIChuc3RhdHVzICE9IE5FUlJfU3VjY2VzcykgewoJCXJldHVybiAwOwoJfQoJdG90YWwgPSAoaW50KXdraW5mby0+d2tpMTAyX2xvZ2dlZF9vbl91c2VyczsKCglOZXRBcGlCdWZmZXJGcmVlKHdraW5mbyk7CQojZW5kaWYgLyogV0lOMzIgKi8KICAgIHJldHVybiB0b3RhbDsKfQoKI2lmIGRlZmluZWQoVVRNUF9GSUxFKSAmJiAhSEFWRV9VVE1QWF9ICgpzdGF0aWMgRklMRSAgICAqdXRtcF9maWxlOwpzdGF0aWMgc3RydWN0IHV0bXAgdXRtcF9yZWM7Cgp2b2lkCnNldHV0ZW50KHZvaWQpCnsKICAgIGlmICh1dG1wX2ZpbGUpCiAgICAgICAgZmNsb3NlKHV0bXBfZmlsZSk7CiAgICB1dG1wX2ZpbGUgPSBmb3BlbihVVE1QX0ZJTEUsICJyIik7Cn0KCnZvaWQKZW5kdXRlbnQodm9pZCkKewogICAgaWYgKHV0bXBfZmlsZSkgewogICAgICAgIGZjbG9zZSh1dG1wX2ZpbGUpOwogICAgICAgIHV0bXBfZmlsZSA9IE5VTEw7CiAgICB9Cn0KCnN0cnVjdCB1dG1wICAgICoKZ2V0dXRlbnQodm9pZCkKewogICAgaWYgKCF1dG1wX2ZpbGUpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB3aGlsZSAoZnJlYWQoJnV0bXBfcmVjLCBzaXplb2YodXRtcF9yZWMpLCAxLCB1dG1wX2ZpbGUpID09IDEpCiAgICAgICAgaWYgKCp1dG1wX3JlYy51dF9uYW1lICYmICp1dG1wX3JlYy51dF9saW5lKQogICAgICAgICAgICByZXR1cm4gJnV0bXBfcmVjOwogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVRNUF9GSUxFICovCg==