LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gc3lzdGVtIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaHJfc3lzdGVtLmMKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1mZWF0dXJlcy5oPgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgImhvc3QuaCIKI2luY2x1ZGUgImhvc3RfcmVzLmgiCiNpbmNsdWRlICJocl9zeXN0ZW0uaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2F1dG9fbmxpc3QuaD4KCiNpZmRlZiBIQVZFX1NZU19QUk9DX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSAic3lzL3Byb2MuaCIKI2VuZGlmCiNpZm5kZWYgbWluZ3czMgojaWYgSEFWRV9VVE1QWF9ICiNpbmNsdWRlIDx1dG1weC5oPgojZWxzZQojaW5jbHVkZSA8dXRtcC5oPgojZW5kaWYKI2VuZGlmIC8qIG1pbmd3MzIgKi8KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8bG0uaD4KI2VuZGlmCgojaWZkZWYgbGludXgKI2lmZGVmIEhBVkVfTElOVVhfVEFTS1NfSAojaW5jbHVkZSA8bGludXgvdGFza3MuaD4KI2Vsc2UKLyoKICogSWYgdGhpcyBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhlcmUgaXMgbm8gaGFyZCBsaW1pdCBvbiB0aGUgbnVtYmVyCiAqIG9mIHByb2Nlc3Nlcywgc28gcmV0dXJuIDAgZm9yIGhyU3lzdGVtTWF4UHJvY2Vzc2VzLiAgCiAqLwojZGVmaW5lIE5SX1RBU0tTCTAKI2VuZGlmCiNlbmRpZgoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKHNvbGFyaXMyKQojaW5jbHVkZSA8a3N0YXQuaD4KI2luY2x1ZGUgPHN5cy92YXIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL29wZW5wcm9taW8uaD4KI2VuZGlmCgojaWZkZWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfcmVxdWlyZShkYXRlX25fdGltZSkKCiNpZiAhZGVmaW5lZChVVE1QX0ZJTEUpICYmIGRlZmluZWQoX1BBVEhfVVRNUCkKI2RlZmluZSBVVE1QX0ZJTEUgX1BBVEhfVVRNUAojZW5kaWYKCiNpZiBkZWZpbmVkKFVUTVBfRklMRSkgJiYgIUhBVkVfVVRNUFhfSAp2b2lkICAgICAgICAgICAgc2V0dXRlbnQodm9pZCk7CnZvaWQgICAgICAgICAgICBlbmR1dGVudCh2b2lkKTsKc3RydWN0IHV0bXAgICAgKmdldHV0ZW50KHZvaWQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVUTVBfRklMRSAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWYgZGVmaW5lZChzb2xhcmlzMikKc3RhdGljIHN0cnVjdCBvcGVucHJvbWlvICogb3BfbWFsbG9jKHNpemVfdCBzaXplKTsKc3RhdGljIHZvaWQgb3BfZnJlZShzdHJ1Y3Qgb3BlbnByb21pbyAqb3ApOwoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKc3RhdGljIGludCBzZXRfc29sYXJpc19ib290Y29tbWFuZF9wYXJhbWV0ZXIoaW50IGFjdGlvbiwgdV9jaGFyICogdmFyX3ZhbCwgdV9jaGFyIHZhcl92YWxfdHlwZSwgc2l6ZV90IHZhcl92YWxfbGVuLCB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKTsKI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KCnN0YXRpYyBpbnQgc2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcihjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKTsKc3RhdGljIGludCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgY2hhciAqb3V0cHV0KTsKc3RhdGljIGxvbmcgICAgIGdldF9tYXhfc29sYXJpc19wcm9jZXNzZXModm9pZCk7CiNlbmRpZgoKc3RhdGljIGludCAgICAgIGdldF9sb2FkX2Rldih2b2lkKTsKc3RhdGljIGludCAgICAgIGNvdW50X3VzZXJzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgY291bnRfcHJvY2Vzc2VzKHZvaWQpOwpleHRlcm4gaW50ICAgICAgc3dydW5fY291bnRfcHJvY2Vzc2VzKHZvaWQpOwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lCUhSU1lTX1VQVElNRQkJMQojZGVmaW5lCUhSU1lTX0RBVEUJCTIKI2RlZmluZQlIUlNZU19MT0FEX0RFVgkJMwojZGVmaW5lCUhSU1lTX0xPQURfUEFSQU0JNAojZGVmaW5lCUhSU1lTX1VTRVJTCQk1CiNkZWZpbmUJSFJTWVNfUFJPQ1MJCTYKI2RlZmluZQlIUlNZU19NQVhQUk9DUwkJNwoKI2lmIGRlZmluZWQoc29sYXJpczIpCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCnN0cnVjdCB2YXJpYWJsZTIgaHJzeXN0ZW1fdmFyaWFibGVzW10gPSB7CiAgICB7SFJTWVNfVVBUSU1FLCBBU05fVElNRVRJQ0tTLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHsxfX0sCiAgICB7SFJTWVNfREFURSwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX2hyc3lzLCAxLCB7NH19LAogICAge0hSU1lTX1VTRVJTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezV9fSwKICAgIHtIUlNZU19QUk9DUywgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs2fX0sCiAgICB7SFJTWVNfTUFYUFJPQ1MsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs3fX0KfTsKI2Vsc2UgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7MX19LAogICAge0hSU1lTX0RBVEUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7NX19LAogICAge0hSU1lTX1BST0NTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwojZWxzZQpzdHJ1Y3QgdmFyaWFibGUyIGhyc3lzdGVtX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1lTX1VQVElNRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7MX19LAogICAge0hSU1lTX0RBVEUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezJ9fSwKICAgIHtIUlNZU19MT0FEX0RFViwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezN9fSwKICAgIHtIUlNZU19MT0FEX1BBUkFNLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzeXMsIDEsIHs0fX0sCiAgICB7SFJTWVNfVVNFUlMsIEFTTl9HQVVHRSwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3lzLCAxLCB7NX19LAogICAge0hSU1lTX1BST0NTLCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezZ9fSwKICAgIHtIUlNZU19NQVhQUk9DUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN5cywgMSwgezd9fQp9OwojZW5kaWYKCm9pZCAgICAgICAgICAgICBocnN5c3RlbV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAxIH07CgoKdm9pZAppbml0X2hyX3N5c3RlbSh2b2lkKQp7CiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N5c3RlbSIsIGhyc3lzdGVtX3ZhcmlhYmxlcywgdmFyaWFibGUyLAogICAgICAgICAgICAgICAgIGhyc3lzdGVtX3ZhcmlhYmxlc19vaWQpOwp9IC8qIGVuZCBpbml0X2hyX3N5c3RlbSAqLwoKLyoKICogaGVhZGVyX2hyc3lzKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqLwoKaW50CmhlYWRlcl9ocnN5cyhzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTWVNfTkFNRV9MRU5HVEgJOQogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zeXN0ZW0iLCAidmFyX2hyc3lzOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3lzdGVtIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N5c3RlbSIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLCB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIG5ld25hbWVbSFJTWVNfTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IChXcml0ZU1ldGhvZCopMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCiAgICByZXR1cm4gKE1BVENIX1NVQ0NFRURFRCk7Cn0gLyogZW5kIGhlYWRlcl9ocnN5cyAqLwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2hyc3lzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyaW5nWzEyOV07IC8qIHBlciBNSUIsIG1heCBzaXplIGlzIDEyOCAqLwojaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIC8qIG1heCBzaXplIG9mIG52cmFtIHByb3BlcnR5ICovCiAgICBjaGFyIGJvb3RwYXJhbVs4MTkyXTsKI2VuZGlmCiAgICB0aW1lX3QgICAgICAgICAgbm93OwojaWZkZWYgbGludXgKICAgIEZJTEUgICAgICAgICAgICpmcDsKI2VuZGlmCiNpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICYmIGRlZmluZWQoQ1RMX0tFUk4pICYmIGRlZmluZWQoS0VSTl9NQVhQUk9DKQogICAgc3RhdGljIGludCAgICAgIG1heHByb2NfbWliW10gPSB7IENUTF9LRVJOLCBLRVJOX01BWFBST0MgfTsKICAgIHNpemVfdCAgICAgICAgICBidWZfc2l6ZTsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICBzdHJ1Y3QgcHN0X3N0YXRpYyBwc3RfYnVmOwojZW5kaWYKCiAgICBpZiAoaGVhZGVyX2hyc3lzKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpID09CiAgICAgICAgTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEhSU1lTX1VQVElNRToKICAgICAgICBsb25nX3JldHVybiA9IGdldF91cHRpbWUoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19EQVRFOgojaWYgZGVmaW5lZChIQVZFX01LVElNRSkgJiYgZGVmaW5lZChIQVZFX1NUSU1FKQojaWZuZGVmIE5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAKICAgICAgICAqd3JpdGVfbWV0aG9kPW5zX3NldF90aW1lOwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwojZW5kaWYKICAgICAgICB0aW1lKCZub3cpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGRhdGVfbl90aW1lKCZub3csIHZhcl9sZW4pOwogICAgY2FzZSBIUlNZU19MT0FEX0RFVjoKICAgICAgICBsb25nX3JldHVybiA9IGdldF9sb2FkX2RldigpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1lTX0xPQURfUEFSQU06CiNpZmRlZiBsaW51eAogICAgICAgIGlmKChmcCA9IGZvcGVuKCIvcHJvYy9jbWRsaW5lIiwgInIiKSkgIT0gTlVMTCkgewogICAgICAgICAgICBmZ2V0cyhzdHJpbmcsIHNpemVvZihzdHJpbmcpLCBmcCk7CiAgICAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWZuZGVmIE5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVAogICAgICAgICp3cml0ZV9tZXRob2Q9c2V0X3NvbGFyaXNfYm9vdGNvbW1hbmRfcGFyYW1ldGVyOwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwogICAgICAgIGlmICggZ2V0X3NvbGFyaXNfZWVwcm9tX3BhcmFtZXRlcigiYm9vdC1jb21tYW5kIixib290cGFyYW0pICkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ1bmFibGUgdG8gbG9va3VwIGJvb3QtY29tbWFuZCBmcm9tIGVlcHJvbVxuIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBzdHJsY3B5KHN0cmluZyxib290cGFyYW0sc2l6ZW9mKHN0cmluZykpOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICJhc2sgRGF2ZSIpOyAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CiAgICBjYXNlIEhSU1lTX1VTRVJTOgogICAgICAgIGxvbmdfcmV0dXJuID0gY291bnRfdXNlcnMoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19QUk9DUzoKI2lmIFVTSU5HX0hPU1RfREFUQV9BQ0NFU1NfU1dSVU5fTU9EVUxFCiAgICAgICAgbG9uZ19yZXR1cm4gPSBzd3J1bl9jb3VudF9wcm9jZXNzZXMoKTsKI2VsaWYgVVNJTkdfSE9TVF9IUl9TV1JVTl9NT0RVTEUKICAgICAgICBsb25nX3JldHVybiA9IGNvdW50X3Byb2Nlc3NlcygpOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNZU19NQVhQUk9DUzoKI2lmIGRlZmluZWQoTlJfVEFTS1MpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBOUl9UQVNLUzsgLyogPGxpbnV4L3Rhc2tzLmg+ICovCiNlbGlmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwgJiYgZGVmaW5lZChDVExfS0VSTikgJiYgZGVmaW5lZChLRVJOX01BWFBST0MpCgl7CgkgICAgaW50IG5wcm9jID0gMDsKCgkgICAgYnVmX3NpemUgPSBzaXplb2YobnByb2MpOwoJICAgIGlmIChzeXNjdGwobWF4cHJvY19taWIsIDIsICZucHJvYywgJmJ1Zl9zaXplLCBOVUxMLCAwKSA8IDApCgkJcmV0dXJuIE5VTEw7CgkgICAgbG9uZ19yZXR1cm4gPSBucHJvYzsKCX0KI2VsaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgICAgIHBzdGF0X2dldHN0YXRpYygmcHN0X2J1Ziwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdGljKSwgMSwgMCk7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwc3RfYnVmLm1heF9wcm9jOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgICAgIGxvbmdfcmV0dXJuID0gZ2V0X21heF9zb2xhcmlzX3Byb2Nlc3NlcygpOwogICAgICAgIGlmIChsb25nX3JldHVybiA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiNlbGlmIGRlZmluZWQoTlBST0NfU1lNQk9MKQoJewoJICAgIGludCBucHJvYyA9IDA7CgoJICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAoY2hhciAqKSAmbnByb2MsIHNpemVvZihucHJvYykpOwoJICAgIGxvbmdfcmV0dXJuID0gbnByb2M7Cgl9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaHJzeXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfSAvKiBlbmQgdmFyX2hyc3lzICovCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKI2lmIGRlZmluZWQoc29sYXJpczIpCgovKiBmdW5jdGlvbnMgZm9yIG1hbGxvYyBhbmQgZnJlZWluZyBvcGVucHJvbWlvIHN0cnVjdHVyZSAqLwpzdGF0aWMgc3RydWN0IG9wZW5wcm9taW8gKiBvcF9tYWxsb2Moc2l6ZV90IHNpemUpCnsKICAgIHN0cnVjdCBvcGVucHJvbWlvICpvcDsKICAgIG9wPW1hbGxvYyhzaXplb2Yoc3RydWN0IG9wZW5wcm9taW8pICsgc2l6ZSk7CiAgICBpZihvcCA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwidW5hYmxlIHRvIG1hbGxvYyBtZW1vcnlcbiIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG1lbXNldChvcCwgMCwgc2l6ZW9mKHN0cnVjdCBvcGVucHJvbWlvKStzaXplKTsKICAgIG9wLT5vcHJvbV9zaXplPXNpemU7CgogICAgcmV0dXJuIG9wOwp9CgpzdGF0aWMgdm9pZCBvcF9mcmVlKHN0cnVjdCBvcGVucHJvbWlvICpvcCkgewogICAgZnJlZShvcCk7Cn0KCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCnN0YXRpYyBpbnQKc2V0X3NvbGFyaXNfYm9vdGNvbW1hbmRfcGFyYW1ldGVyKGludCBhY3Rpb24sCiAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikgewoKICAgIHN0YXRpYyBjaGFyIG9sZF92YWx1ZVsxMDI0XSwqcF9vbGRfdmFsdWU9b2xkX3ZhbHVlOwogICAgaW50IHN0YXR1cz0wOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAgICAgLyogY2hlY2sgdHlwZSAqLwogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIndyaXRlIHRvIHNldF9zb2xhcmlzX2Jvb3Rjb21tYW5kX3BhcmFtZXRlciBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFJFU0VSVkUyOiB7CiAgICAgICAgICAgIC8qIGNyZWF0ZSBjb3B5IG9mIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpZihzdGF0UCkgewogICAgICAgICAgICAgICAgaW50IG9sZF92YWxfbGVuPXN0cmxlbihzdGF0UCk7CiAgICAgICAgICAgICAgICBpZihvbGRfdmFsX2xlbiA+PSBzaXplb2Yob2xkX3ZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPShjaGFyICopbWFsbG9jKG9sZF92YWxfbGVuKzEpOwogICAgICAgICAgICAgICAgICAgIGlmKHBfb2xkX3ZhbHVlPT1OVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInVuYWJsZSB0byBtYWxsb2MgbWVtb3J5XG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0dFTkVSUjsKICAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RybGNweShwX29sZF92YWx1ZSxzdGF0UCxvbGRfdmFsX2xlbisxKTsKICAgICAgICAgICAgfSBlbHNlIHsgCiAgICAgICAgICAgICAgICBwX29sZF92YWx1ZT1OVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBBQ1RJT046IHsKICAgICAgICAgICAgc3RhdHVzPXNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoImJvb3QtY29tbWFuZCIsKGNoYXIgKil2YXJfdmFsLHZhcl92YWxfbGVuKTsKICAgICAgICAgICAgaWYoc3RhdHVzIT0wKSByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNhc2UgVU5ETzogewogICAgICAgICAgICAvKiByZXZlcnQgdG8gb2xkIHZhbHVlICovCiAgICAgICAgICAgIGlmKHBfb2xkX3ZhbHVlKSB7IAogICAgICAgICAgICAgICAgc3RhdHVzPXNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoImJvb3QtY29tbWFuZCIsKGNoYXIgKilwX29sZF92YWx1ZSxzdHJsZW4ocF9vbGRfdmFsdWUpKTsKICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsgCiAgICAgICAgICAgICAgICBpZihzdGF0dXMhPTApIHJldHVybiBTTk1QX0VSUl9HRU5FUlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjYXNlIEZSRUU6CiAgICAgICAgY2FzZSBDT01NSVQ6CiAgICAgICAgICAgIC8qIGZyZWUgbWVtb3J5IGlmIG5lY2Vzc2FyeSAqLwogICAgICAgICAgICBpZihwX29sZF92YWx1ZSAhPSAgb2xkX3ZhbHVlKSB7CiAgICAgICAgICAgICAgICBmcmVlKHBfb2xkX3ZhbHVlKTsKICAgICAgICAgICAgICAgIHBfb2xkX3ZhbHVlPW9sZF92YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCgpzdGF0aWMgaW50IHNldF9zb2xhcmlzX2VlcHJvbV9wYXJhbWV0ZXIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbikgewoKICAgIGludCBzdGF0dXM9MDsKICAgIGNoYXIgYnVmZmVyWzEwMjRdLCpwYnVmZmVyPWJ1ZmZlcjsKICAgIAogICAgaWYoIHN0cmxlbihrZXkpK3N0cmxlbih2YWx1ZSkrMTYgPiBzaXplb2YoYnVmZmVyKSApIHsKICAgICAgICBwYnVmZmVyPShjaGFyICopbWFsbG9jKHN0cmxlbihrZXkpK3N0cmxlbih2YWx1ZSkrMTYpOwogICAgfSAKCiAgICAKICAgIHNwcmludGYocGJ1ZmZlciwgImVlcHJvbSAlcz1cIiUuKnNcIlxuIiwga2V5LCB2YXJfdmFsX2xlbiwgdmFsdWUpOwoKICAgIHN0YXR1cz1zeXN0ZW0ocGJ1ZmZlcik7CgogICAgaWYocGJ1ZmZlciE9YnVmZmVyKSBmcmVlKHBidWZmZXIpOwogICAgcmV0dXJuIHN0YXR1czsKfQoKc3RhdGljIGludCBnZXRfc29sYXJpc19lZXByb21fcGFyYW1ldGVyKGNvbnN0IGNoYXIgKnBhcmFtZXRlciwgY2hhciAqb3V0YnVmZmVyKSB7CgogICAgaW50IGZkPTAsc3RhdHVzPTA7CiAgICBzdHJ1Y3Qgb3BlbnByb21pbyAqb3BlbnByb21pbmZvPU5VTEw7CgogICAgZmQ9b3BlbigiL2Rldi9vcGVucHJvbSIsT19SRE9OTFkpOwogICAgaWYgKCBmZCA9PSAtMSApIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIi9kZXYvb3BlbnByb20iKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBvcGVucHJvbWluZm8gPSBvcF9tYWxsb2MoODE5Mik7CiAgICBpZighb3BlbnByb21pbmZvKSByZXR1cm4gMTsKCiAgICBzdHJjcHkob3BlbnByb21pbmZvLT5vcHJvbV9hcnJheSxwYXJhbWV0ZXIpOwoKICAgIHN0YXR1cz1pb2N0bChmZCxPUFJPTUdFVE9QVCxvcGVucHJvbWluZm8pOwogICAgaWYgKCBzdGF0dXMgPT0gLTEgKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCIvZGV2L29wZW5wcm9tIik7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIG9wX2ZyZWUob3BlbnByb21pbmZvKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHN0cmNweShvdXRidWZmZXIsb3BlbnByb21pbmZvLT5vcHJvbV9hcnJheSk7CgogICAgb3BfZnJlZShvcGVucHJvbWluZm8pOwoKICAgIC8qIGNsb3NlIGZpbGUgKi8KICAgIGNsb3NlKGZkKTsKCiAgICByZXR1cm4oMCk7Cn0KCnN0YXRpYyBsb25nIGdldF9tYXhfc29sYXJpc19wcm9jZXNzZXModm9pZCkgewoKICAgIGtzdGF0X2N0bF90ICprc2M9TlVMTDsKICAgIGtzdGF0X3QgKmtzPU5VTEw7CiAgICBzdHJ1Y3QgdmFyIHY7CiAgICBzdGF0aWMgbG9uZyBtYXhwcm9jcz0tMTsKCiAgICAvKiBhc3N1bWUgb25seSBuZWNlc3NhcnkgdG8gY29tcHV0ZSBvbmNlLCBzaW5jZSAvZXRjL3N5c3RlbSBtdXN0IGJlIG1vZGlmaWVkICovCiAgICBpZiAobWF4cHJvY3MgPT0gLTEpIHsKICAgICAgICBpZiAoIChrc2M9a3N0YXRfb3BlbigpKSAhPSBOVUxMICYmIAogICAgICAgICAgICAgKGtzPWtzdGF0X2xvb2t1cChrc2MsICJ1bml4IiwgMCwgInZhciIpKSAhPSBOVUxMICYmIAogICAgICAgICAgICAgKGtzdGF0X3JlYWQoa3NjLCBrcywgJnYpICE9IC0xKSkgewoKICAgICAgICAgICAgbWF4cHJvY3M9di52X3Byb2M7CiAgICAgICAgfQogICAgICAgIGlmKGtzYykgewogICAgICAgICAgICBrc3RhdF9jbG9zZShrc2MpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbWF4cHJvY3M7Cn0KCiNlbmRpZgoKI2lmIGRlZmluZWQoSEFWRV9NS1RJTUUpICYmIGRlZmluZWQoSEFWRV9TVElNRSkKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKaW50Cm5zX3NldF90aW1lKGludCBhY3Rpb24sCiAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewoKICAgIHN0YXRpYyB0aW1lX3Qgb2xkdGltZT0wOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICAgICAgY2FzZSBSRVNFUlZFMToKICAgICAgICAgICAgLyogY2hlY2sgdHlwZSAqLwogICAgICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIndyaXRlIHRvIG5zX3NldF90aW1lIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhcl92YWxfbGVuICE9IDggJiYgdmFyX3ZhbF9sZW4hPTExKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJ3cml0ZSB0byBuc19zZXRfdGltZSBub3QgYSBwcm9wZXIgbGVuZ3RoXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBGUkVFOgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBBQ1RJT046IHsKICAgICAgICAgICAgbG9uZyBzdGF0dXM9MDsKICAgICAgICAgICAgdGltZV90IHNlY29uZHM9MDsKICAgICAgICAgICAgc3RydWN0IHRtIG5ld3RpbWV0bTsKICAgICAgICAgICAgaW50IGhvdXJzX2Zyb21fdXRjPSAwOwogICAgICAgICAgICBpbnQgbWludXRlc19mcm9tX3V0Yz0gMDsKCiAgICAgICAgICAgIGlmICh2YXJfdmFsX2xlbiA9PSAxMSkgewogICAgICAgICAgICAgICAgLyogdGltZXpvbmUgaW5mb3JhbWF0aW9uIHdhcyBwcmVzZW50ICovCiAgICAgICAgICAgICAgICBob3Vyc19mcm9tX3V0Yz0oaW50KXZhcl92YWxbOV07CiAgICAgICAgICAgICAgICBtaW51dGVzX2Zyb21fdXRjPShpbnQpdmFyX3ZhbFsxMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9zZWM9KGludCl2YXJfdmFsWzZdOzsKICAgICAgICAgICAgbmV3dGltZXRtLnRtX21pbj0oaW50KXZhcl92YWxbNV07CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9ob3VyPShpbnQpdmFyX3ZhbFs0XTsKCiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9tb249KGludCl2YXJfdmFsWzJdLTE7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV95ZWFyPTI1NiooaW50KXZhcl92YWxbMF0rKGludCl2YXJfdmFsWzFdLTE5MDA7CiAgICAgICAgICAgIG5ld3RpbWV0bS50bV9tZGF5PShpbnQpdmFyX3ZhbFszXTsKCiAgICAgICAgICAgIC8qIGRldGVybWluZSBpZiBkYXkgbGlnaHQgc2F2aW5ncyB0aW1lIGluIGVmZmVjdCBEU1QgKi8KICAgICAgICAgICAgaWYgKCAoIGhvdXJzX2Zyb21fdXRjKjYwKjYwK21pbnV0ZXNfZnJvbV91dGMqNjAgKSA9PSBhYnModGltZXpvbmUpICkgewogICAgICAgICAgICAgICAgbmV3dGltZXRtLnRtX2lzZHN0PTA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuZXd0aW1ldG0udG1faXNkc3Q9MTsKICAgICAgICAgICAgfSAKCiAgICAgICAgICAgIC8qIGNyZWF0ZSBjb3B5IG9mIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBvbGR0aW1lPXRpbWUoTlVMTCk7CgogICAgICAgICAgICBzZWNvbmRzPW1rdGltZSgmbmV3dGltZXRtKTsKICAgICAgICAgICAgaWYoc2Vjb25kcyA9PSAodGltZV90KS0xKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIGNvbnZlcnQgdGltZSB2YWx1ZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXR1cz1zdGltZSgmc2Vjb25kcyk7CiAgICAgICAgICAgIGlmKHN0YXR1cyE9MCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIlVuYWJsZSB0byBzZXQgdGltZVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIFVORE86IHsKICAgICAgICAgICAgLyogcmV2ZXJ0IHRvIG9sZCB2YWx1ZSAqLwogICAgICAgICAgICBpbnQgc3RhdHVzPTA7CiAgICAgICAgICAgIGlmKG9sZHRpbWUgIT0gMCkgewogICAgICAgICAgICAgICAgc3RhdHVzPXN0aW1lKCZvbGR0aW1lKTsKICAgICAgICAgICAgICAgIG9sZHRpbWU9MDsgICAgCiAgICAgICAgICAgICAgICBpZihzdGF0dXMhPTApIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiVW5hYmxlIHRvIHNldCB0aW1lXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfR0VORVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY2FzZSBDT01NSVQ6IHsKICAgICAgICAgICAgb2xkdGltZT0wOyAgICAKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KI2VuZGlmCgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqICBSZXR1cm4gdGhlIERldmljZUluZGV4IGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgICAqICAgdG8gdGhlIGJvb3QgZGV2aWNlCiAgICAgICAgICAgICAgICAgKi8Kc3RhdGljIGludApnZXRfbG9hZF9kZXYodm9pZCkKewogICAgcmV0dXJuIChIUkRFVl9ESVNLIDw8IEhSREVWX1RZUEVfU0hJRlQpOyAgICAvKiBYWFggKi8KfSAvKiBlbmQgZ2V0X2xvYWRfZGV2ICovCgpzdGF0aWMgaW50CmNvdW50X3VzZXJzKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICB0b3RhbCA9IDA7CiNpZm5kZWYgV0lOMzIKI2lmIEhBVkVfVVRNUFhfSAojZGVmaW5lIHNldHV0ZW50IHNldHV0eGVudAojZGVmaW5lIHB1dHV0bGluZSBwdXR1dHhsaW5lCiNkZWZpbmUgZ2V0dXRlbnQgZ2V0dXR4ZW50CiNkZWZpbmUgZW5kdXRlbnQgZW5kdXR4ZW50CiAgICBzdHJ1Y3QgdXRtcHggICAqdXRtcF9wOwojZWxzZQogICAgc3RydWN0IHV0bXAgICAgKnV0bXBfcDsKI2VuZGlmCgogICAgc2V0dXRlbnQoKTsKICAgIHdoaWxlICgodXRtcF9wID0gZ2V0dXRlbnQoKSkgIT0gTlVMTCkgewojaWZuZGVmIFVUTVBfSEFTX05PX1RZUEUKICAgICAgICBpZiAodXRtcF9wLT51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykKICAgICAgICAgICAgY29udGludWU7CiNlbmRpZgojaWZuZGVmIFVUTVBfSEFTX05PX1BJRAogICAgICAgICAgICAvKiBUaGlzIGJsb2NrIG9mIGNvZGUgZml4ZXMgem9tYmllIHVzZXIgUElEcyBpbiB0aGUKICAgICAgICAgICAgICAgdXRtcC91dG1weCBmaWxlIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIGNvdW50ZWQgYXMgYQogICAgICAgICAgICAgICBjdXJyZW50IHVzZXIgKi8KICAgICAgICAgICAgaWYgKGtpbGwodXRtcF9wLT51dF9waWQsIDApID09IC0xICYmIGVycm5vID09IEVTUkNIKSB7CiAgICAgICAgICAgICAgICB1dG1wX3AtPnV0X3R5cGUgPSBERUFEX1BST0NFU1M7CiAgICAgICAgICAgICAgICBwdXR1dGxpbmUodXRtcF9wKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICArK3RvdGFsOwogICAgfQogICAgZW5kdXRlbnQoKTsKI2Vsc2UgLyogV0lOMzIgKi8KICAgLyogCiAgICAqIFRPRE8gLSBFcnJvciBjaGVja2luZy4KICAgICovCglMUFdLU1RBX0lORk9fMTAyIHdraW5mbzsKCU5FVF9BUElfU1RBVFVTIG5zdGF0dXM7CgkKCW5zdGF0dXMgPSBOZXRXa3N0YUdldEluZm8oTlVMTCwgMTAyLCAoTFBCWVRFKikmd2tpbmZvKTsKCWlmIChuc3RhdHVzICE9IE5FUlJfU3VjY2VzcykgewoJCXJldHVybiAwOwoJfQoJdG90YWwgPSAoaW50KXdraW5mby0+d2tpMTAyX2xvZ2dlZF9vbl91c2VyczsKCglOZXRBcGlCdWZmZXJGcmVlKHdraW5mbyk7CQojZW5kaWYgLyogV0lOMzIgKi8KICAgIHJldHVybiB0b3RhbDsKfQoKI2lmIGRlZmluZWQoVVRNUF9GSUxFKSAmJiAhSEFWRV9VVE1QWF9ICgpzdGF0aWMgRklMRSAgICAqdXRtcF9maWxlOwpzdGF0aWMgc3RydWN0IHV0bXAgdXRtcF9yZWM7Cgp2b2lkCnNldHV0ZW50KHZvaWQpCnsKICAgIGlmICh1dG1wX2ZpbGUpCiAgICAgICAgZmNsb3NlKHV0bXBfZmlsZSk7CiAgICB1dG1wX2ZpbGUgPSBmb3BlbihVVE1QX0ZJTEUsICJyIik7Cn0KCnZvaWQKZW5kdXRlbnQodm9pZCkKewogICAgaWYgKHV0bXBfZmlsZSkgewogICAgICAgIGZjbG9zZSh1dG1wX2ZpbGUpOwogICAgICAgIHV0bXBfZmlsZSA9IE5VTEw7CiAgICB9Cn0KCnN0cnVjdCB1dG1wICAgICoKZ2V0dXRlbnQodm9pZCkKewogICAgaWYgKCF1dG1wX2ZpbGUpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB3aGlsZSAoZnJlYWQoJnV0bXBfcmVjLCBzaXplb2YodXRtcF9yZWMpLCAxLCB1dG1wX2ZpbGUpID09IDEpCiAgICAgICAgaWYgKCp1dG1wX3JlYy51dF9uYW1lICYmICp1dG1wX3JlYy51dF9saW5lKQogICAgICAgICAgICByZXR1cm4gJnV0bXBfcmVjOwogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVRNUF9GSUxFICovCg==