LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwojaW5jbHVkZSAic2lnX2NvbnRleHQuaCIKCnR5cGVkZWYgc3RydWN0IF9ET1NTWVNURU0gewogIGludCBpZDsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TU1lTVEVNICpuZXh0Owp9IERPU1NZU1RFTTsKCnN0cnVjdCBfRE9TRVZFTlQ7Cgp0eXBlZGVmIHN0cnVjdCBfRE9TVEFTSyB7CiBMUFZPSUQgaW1nOwogdW5zaWduZWQgaW1nX29mczsKIFdPUkQgcHNwX3NlZyxsb2FkX3NlZzsKIFdPUkQgaW5pdF9jcyxpbml0X2lwLGluaXRfc3MsaW5pdF9zcDsKIFdPUkQgeG1zX3NlZzsKIFdPUkQgZHBtaV9zZWcsZHBtaV9zZWwsZHBtaV9mbGFnOwogSE1PRFVMRTE2IGhNb2R1bGU7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIEhBTkRMRSBoUmVhZFBpcGUsaFhQaXBlLGhDb25JbnB1dCxoQ29uT3V0cHV0OwogaW50IHJlYWRfcGlwZSx3cml0ZV9waXBlOwogcGlkX3QgdGFzazsKIGludCBzaWdfc2VudDsKIHN0cnVjdCBfRE9TRVZFTlQgKnBlbmRpbmcsKmN1cnJlbnQ7CiBET1NTWVNURU0gKnN5czsKfSBET1NUQVNLLCAqTFBET1NUQVNLOwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU0VWRU5UIHsKICBpbnQgaXJxLHByaW9yaXR5OwogIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLFBDT05URVhULHZvaWQqKTsKICB2b2lkICpkYXRhOwogIHN0cnVjdCBfRE9TRVZFTlQgKm5leHQ7Cn0gRE9TRVZFTlQsICpMUERPU0VWRU5UOwoKI2RlZmluZSBET1NfUFJJT1JJVFlfUkVBTFRJTUUgMCAgLyogSVJRMCAqLwojZGVmaW5lIERPU19QUklPUklUWV9LRVlCT0FSRCAxICAvKiBJUlExICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1ZHQSAgICAgIDIgIC8qIElSUTkgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfTU9VU0UgICAgNSAgLyogSVJRMTIgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfU0VSSUFMICAgMTAgLyogSVJRNCAqLwoKI2lmIGRlZmluZWQobGludXgpICYmIGRlZmluZWQoX19pMzg2X18pCgojZGVmaW5lIE1aX1NVUFBPUlRFRAoKZXh0ZXJuIEJPT0wgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIHZvaWQgTVpfS2lsbE1vZHVsZSggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gTFBET1NUQVNLIE1aX0FsbG9jRFBNSVRhc2soIEhNT0RVTEUxNiBoTW9kdWxlICk7CgojZW5kaWYgLyogbGludXgtaTM4NiAqLwoKI2RlZmluZSBWODZfRkxBRyAweDAwMDIwMDAwCgpleHRlcm4gQk9PTCBNWl9DcmVhdGVQcm9jZXNzKCBIRklMRSBoRmlsZSwgT0ZTVFJVQ1QgKm9mcywgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgcHNhLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgdHNhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGluaGVyaXQsIExQU1RBUlRVUElORk9BIHN0YXJ0dXAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBST0NFU1NfSU5GT1JNQVRJT04gaW5mbyApOwpleHRlcm4gTFBET1NUQVNLIE1aX0N1cnJlbnQoIHZvaWQgKTsKZXh0ZXJuIGludCBET1NWTV9FbnRlciggUENPTlRFWFQgY29udGV4dCApOwpleHRlcm4gdm9pZCBET1NWTV9XYWl0KCBpbnQgcmVhZF9waXBlLCBIQU5ETEUgaE9iamVjdCApOwpleHRlcm4gdm9pZCBET1NWTV9RdWV1ZUV2ZW50KCBpbnQgaXJxLCBpbnQgcHJpb3JpdHksIHZvaWQgKCpyZWxheSkoTFBET1NUQVNLLFBDT05URVhULHZvaWQqKSwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gdm9pZCBET1NWTV9TZXRUaW1lciggdW5zaWduZWQgdGlja3MgKTsKZXh0ZXJuIHVuc2lnbmVkIERPU1ZNX0dldFRpbWVyKCB2b2lkICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFN5c3RlbURhdGEoIGludCBpZCwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCogRE9TVk1fR2V0U3lzdGVtRGF0YSggaW50IGlkICk7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==