LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgIndpbm50LmgiCiNpbmNsdWRlICJzaWdfY29udGV4dC5oIgojaW5jbHVkZSAid2ludHlwZXMuaCIKCnR5cGVkZWYgc3RydWN0IF9ET1NUQVNLIHsKIExQVk9JRCBpbWc7CiB1bnNpZ25lZCBpbWdfb2ZzOwogV09SRCBwc3Bfc2VnLGxvYWRfc2VnOwogV09SRCBpbml0X2NzLGluaXRfaXAsaW5pdF9zcyxpbml0X3NwOwogV09SRCB4bXNfc2VnOwogV09SRCBkcG1pX3NlZyxkcG1pX3NlbCxkcG1pX2ZsYWc7CiBXT1JEIHN5c3RlbV90aW1lcjsKIEhNT0RVTEUxNiBoTW9kdWxlOwogY2hhciBtbV9uYW1lWzEyOF07CiBpbnQgbW1fZmQ7CiBpbnQgcmVhZF9waXBlLHdyaXRlX3BpcGU7CiBwaWRfdCB0YXNrOwp9IERPU1RBU0ssICpMUERPU1RBU0s7CgojaWYgZGVmaW5lZChsaW51eCkgJiYgZGVmaW5lZChfX2kzODZfXykKCiNkZWZpbmUgTVpfU1VQUE9SVEVECgpzdHJ1Y3QgX05FX01PRFVMRTsKCmV4dGVybiBpbnQgTVpfSW5pdFRhc2soIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIGludCBNWl9Jbml0TWVtb3J5KCBMUERPU1RBU0sgbHBEb3NUYXNrLCBzdHJ1Y3QgX05FX01PRFVMRSAqcE1vZHVsZSApOwpleHRlcm4gdm9pZCBNWl9LaWxsTW9kdWxlKCBMUERPU1RBU0sgbHBEb3NUYXNrICk7CmV4dGVybiBMUERPU1RBU0sgTVpfQWxsb2NEUE1JVGFzayggSE1PRFVMRTE2IGhNb2R1bGUgKTsKCiNlbmRpZiAvKiBsaW51eC1pMzg2ICovCgojZGVmaW5lIFY4Nl9GTEFHIDB4MDAwMjAwMDAKCmV4dGVybiB2b2lkICgqY3R4X2RlYnVnX2NhbGwpKCBpbnQsIENPTlRFWFQqICk7CmV4dGVybiBCT09MMzIgKCppbnN0cl9lbXVfY2FsbCkoIFNJR0NPTlRFWFQqICk7CgpleHRlcm4gdm9pZCBNWl9UaWNrKCBXT1JEIGhhbmRsZSApOwoKZXh0ZXJuIEhJTlNUQU5DRTE2IE1aX0NyZWF0ZVByb2Nlc3MoIExQQ1NUUiBuYW1lLCBMUENTVFIgY21kbGluZSwgTFBDU1RSIGVudiwgQk9PTDMyIGluaGVyaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJBIHN0YXJ0dXAsIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICk7CmV4dGVybiBpbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKTsKZXh0ZXJuIHZvaWQgRE9TVk1fU2V0VGltZXIoIHVuc2lnbmVkIHRpY2tzICk7CmV4dGVybiB1bnNpZ25lZCBET1NWTV9HZXRUaW1lciggdm9pZCApOwoKI2VuZGlmIC8qIF9fV0lORV9ET1NFWEVfSCAqLwo=