LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwojaW5jbHVkZSAic2lnX2NvbnRleHQuaCIKCnR5cGVkZWYgc3RydWN0IF9ET1NTWVNURU0gewogIGludCBpZDsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TU1lTVEVNICpuZXh0Owp9IERPU1NZU1RFTTsKCnN0cnVjdCBfRE9TRVZFTlQ7Cgp0eXBlZGVmIHN0cnVjdCBfRE9TVEFTSyB7CiBMUFZPSUQgaW1nOwogdW5zaWduZWQgaW1nX29mczsKIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKIFdPUkQgaW5pdF9jcyxpbml0X2lwLGluaXRfc3MsaW5pdF9zcDsKIFdPUkQgeG1zX3NlZzsKIFdPUkQgZHBtaV9zZWcsZHBtaV9zZWwsZHBtaV9mbGFnOwogSE1PRFVMRTE2IGhNb2R1bGU7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIEhBTkRMRSBoUmVhZFBpcGUsaFhQaXBlOwogaW50IHJlYWRfcGlwZSx3cml0ZV9waXBlOwogcGlkX3QgdGFzazsKIGludCBzaWdfc2VudDsKIHN0cnVjdCBfRE9TRVZFTlQgKnBlbmRpbmcsKmN1cnJlbnQ7CiBET1NTWVNURU0gKnN5czsKfSBET1NUQVNLLCAqTFBET1NUQVNLOwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU0VWRU5UIHsKICBpbnQgaXJxLHByaW9yaXR5OwogIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLFBDT05URVhULHZvaWQqKTsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TRVZFTlQgKm5leHQ7Cn0gRE9TRVZFTlQsICpMUERPU0VWRU5UOwoKI2RlZmluZSBET1NfUFJJT1JJVFlfUkVBTFRJTUUgMCAgLyogSVJRMCAqLwojZGVmaW5lIERPU19QUklPUklUWV9LRVlCT0FSRCAxICAvKiBJUlExICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1ZHQSAgICAgIDIgIC8qIElSUTkgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfTU9VU0UgICAgNSAgLyogSVJRMTIgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfU0VSSUFMICAgMTAgLyogSVJRNCAqLwoKI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoX19pMzg2X18pCgojZGVmaW5lIE1aX1NVUFBPUlRFRAoKZXh0ZXJuIEJPT0wgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIHZvaWQgTVpfS2lsbE1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gTFBET1NUQVNLIE1aX0FsbG9jRFBNSVRhc2soIEhNT0RVTEUxNiBoTW9kdWxlICk7CmV4dGVybiB2b2lkIERPU1ZNX1F1ZXVlRXZlbnQoIGludCBpcnEsIGludCBwcmlvcml0eSwgdm9pZCAoKnJlbGF5KShMUERPU1RBU0ssUENPTlRFWFQsdm9pZCopLCB2b2lkICpkYXRhICk7CgojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgpleHRlcm4gQk9PTCBNWl9DcmVhdGVQcm9jZXNzKCBIRklMRSBoRmlsZSwgT0ZTVFJVQ1QgKm9mcywgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgdHNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGluaGVyaXQsIExQU1RBUlRVUElORk9BIHN0YXJ0dXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbyApOwpleHRlcm4gaW50IERPU1ZNX0VudGVyKCBQQ09OVEVYVCBjb250ZXh0ICk7CmV4dGVybiB2b2lkIERPU1ZNX1BJQ19pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFRpbWVyKCB1bnNpZ25lZCB0aWNrcyApOwpleHRlcm4gdW5zaWduZWQgRE9TVk1fR2V0VGltZXIoIHZvaWQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fU2V0U3lzdGVtRGF0YSggaW50IGlkLCB2b2lkICpkYXRhICk7CmV4dGVybiB2b2lkKiBET1NWTV9HZXRTeXN0ZW1EYXRhKCBpbnQgaWQgKTsKCiNlbmRpZiAvKiBfX1dJTkVfRE9TRVhFX0ggKi8K