LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogcGlkX3QgKi8KI2luY2x1ZGUgIndpbmJhc2UuaCIgICAvKiBmb3IgTFBTVEFSVFVQSU5GTzMyQSAqLwojaW5jbHVkZSAid2lubnQuaCIgICAgIC8qIGZvciBQQ09OVEVYVCAqLwoKdHlwZWRlZiBzdHJ1Y3QgX0RPU1NZU1RFTSB7CiAgaW50IGlkOwogIHZvaWQgKmRhdGE7CiAgc3RydWN0IF9ET1NTWVNURU0gKm5leHQ7Cn0gRE9TU1lTVEVNOwoKc3RydWN0IF9ET1NFVkVOVDsKCnR5cGVkZWYgc3RydWN0IF9ET1NUQVNLIHsKIExQVk9JRCBpbWc7CiB1bnNpZ25lZCBpbWdfb2ZzOwogV09SRCBwc3Bfc2VnLGxvYWRfc2VnOwogV09SRCBpbml0X2NzLGluaXRfaXAsaW5pdF9zcyxpbml0X3NwOwogV09SRCB4bXNfc2VnOwogV09SRCBkcG1pX3NlZyxkcG1pX3NlbCxkcG1pX2ZsYWc7CiBITU9EVUxFMTYgaE1vZHVsZTsKIGNoYXIgbW1fbmFtZVsxMjhdOwogaW50IG1tX2ZkOwogSEFORExFIGhSZWFkUGlwZSxoWFBpcGUsaENvbklucHV0LGhDb25PdXRwdXQ7CiBpbnQgcmVhZF9waXBlLHdyaXRlX3BpcGU7CiBwaWRfdCB0YXNrOwogaW50IHNpZ19zZW50Owogc3RydWN0IF9ET1NFVkVOVCAqcGVuZGluZywqY3VycmVudDsKIERPU1NZU1RFTSAqc3lzOwp9IERPU1RBU0ssICpMUERPU1RBU0s7Cgp0eXBlZGVmIHN0cnVjdCBfRE9TRVZFTlQgewogIGludCBpcnEscHJpb3JpdHk7CiAgdm9pZCAoKnJlbGF5KShMUERPU1RBU0ssQ09OVEVYVDg2Kix2b2lkKik7CiAgdm9pZCAqZGF0YTsKICBzdHJ1Y3QgX0RPU0VWRU5UICpuZXh0Owp9IERPU0VWRU5ULCAqTFBET1NFVkVOVDsKCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1JFQUxUSU1FIDAgIC8qIElSUTAgKi8KI2RlZmluZSBET1NfUFJJT1JJVFlfS0VZQk9BUkQgMSAgLyogSVJRMSAqLwojZGVmaW5lIERPU19QUklPUklUWV9WR0EgICAgICAyICAvKiBJUlE5ICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX01PVVNFICAgIDUgIC8qIElSUTEyICovCiNkZWZpbmUgRE9TX1BSSU9SSVRZX1NFUklBTCAgIDEwIC8qIElSUTQgKi8KCiNpZiBkZWZpbmVkKGxpbnV4KSAmJiBkZWZpbmVkKF9faTM4Nl9fKQoKI2RlZmluZSBNWl9TVVBQT1JURUQKCmV4dGVybiBCT09MIE1aX0luaXRUYXNrKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CmV4dGVybiB2b2lkIE1aX0tpbGxNb2R1bGUoIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIExQRE9TVEFTSyBNWl9BbGxvY0RQTUlUYXNrKCBITU9EVUxFMTYgaE1vZHVsZSApOwoKI2VuZGlmIC8qIGxpbnV4LWkzODYgKi8KCiNkZWZpbmUgVjg2X0ZMQUcgMHgwMDAyMDAwMAoKZXh0ZXJuIEJPT0wgTVpfQ3JlYXRlUHJvY2VzcyggSEFORExFIGhGaWxlLCBMUENTVFIgZmlsZW5hbWUsIExQQ1NUUiBjbWRsaW5lLCBMUENTVFIgZW52LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHBzYSwgTFBTRUNVUklUWV9BVFRSSUJVVEVTIHRzYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBpbmhlcml0LCBEV09SRCBmbGFncywgTFBTVEFSVFVQSU5GT0Egc3RhcnR1cCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICk7CmV4dGVybiBMUERPU1RBU0sgTVpfQ3VycmVudCggdm9pZCApOwpleHRlcm4gaW50IERPU1ZNX0VudGVyKCBDT05URVhUODYgKmNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fV2FpdCggaW50IHJlYWRfcGlwZSwgSEFORExFIGhPYmplY3QgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fUXVldWVFdmVudCggaW50IGlycSwgaW50IHByaW9yaXR5LCB2b2lkICgqcmVsYXkpKExQRE9TVEFTSyxDT05URVhUODYqLHZvaWQqKSwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCBET1NWTV9QSUNfaW9wb3J0X291dCggV09SRCBwb3J0LCBCWVRFIHZhbCApOwpleHRlcm4gdm9pZCBET1NWTV9TZXRUaW1lciggdW5zaWduZWQgdGlja3MgKTsKZXh0ZXJuIHVuc2lnbmVkIERPU1ZNX0dldFRpbWVyKCB2b2lkICk7CmV4dGVybiB2b2lkIERPU1ZNX1NldFN5c3RlbURhdGEoIGludCBpZCwgdm9pZCAqZGF0YSApOwpleHRlcm4gdm9pZCogRE9TVk1fR2V0U3lzdGVtRGF0YSggaW50IGlkICk7CgojZW5kaWYgLyogX19XSU5FX0RPU0VYRV9IICovCg==