LyoKICogRE9TIEVYRSBsb2FkZXIKICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqLwoKI2lmbmRlZiBfX1dJTkVfRE9TRVhFX0gKI2RlZmluZSBfX1dJTkVfRE9TRVhFX0gKCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgIndpbm50LmgiCiNpbmNsdWRlICJ3aW50eXBlcy5oIgoKdHlwZWRlZiBzdHJ1Y3QgX0RPU1RBU0sgewogTFBWT0lEIGltZzsKIHVuc2lnbmVkIGltZ19vZnM7CiBXT1JEIHBzcF9zZWcsbG9hZF9zZWc7CiBXT1JEIGluaXRfY3MsaW5pdF9pcCxpbml0X3NzLGluaXRfc3A7CiBXT1JEIHhtc19zZWc7CiBXT1JEIGRwbWlfc2VnLGRwbWlfc2VsLGRwbWlfZmxhZzsKIERXT1JEIHdyYXBfb2ZzLGNhbGxfb2ZzOwogSE1PRFVMRTE2IGhNb2R1bGU7CiBjaGFyIG1tX25hbWVbMTI4XTsKIGludCBtbV9mZDsKIGludCByZWFkX3BpcGUsd3JpdGVfcGlwZTsKIHBpZF90IHRhc2s7Cn0gRE9TVEFTSywgKkxQRE9TVEFTSzsKCiNpZmRlZiBsaW51eAoKI2RlZmluZSBNWl9TVVBQT1JURUQKCnN0cnVjdCBfTkVfTU9EVUxFOwoKZXh0ZXJuIGludCBNWl9Jbml0VGFzayggTFBET1NUQVNLIGxwRG9zVGFzayApOwpleHRlcm4gaW50IE1aX0luaXRNZW1vcnkoIExQRE9TVEFTSyBscERvc1Rhc2ssIHN0cnVjdCBfTkVfTU9EVUxFICpwTW9kdWxlICk7CmV4dGVybiB2b2lkIE1aX0tpbGxNb2R1bGUoIExQRE9TVEFTSyBscERvc1Rhc2sgKTsKZXh0ZXJuIExQRE9TVEFTSyBNWl9BbGxvY0RQTUlUYXNrKCBITU9EVUxFMTYgaE1vZHVsZSApOwoKI2VuZGlmIC8qIGxpbnV4ICovCgpleHRlcm4gdm9pZCAoKmN0eF9kZWJ1Z19jYWxsKSggaW50IHNpZywgQ09OVEVYVCogKTsKCmV4dGVybiBISU5TVEFOQ0UxNiBNWl9DcmVhdGVQcm9jZXNzKCBMUENTVFIgbmFtZSwgTFBDU1RSIGNtZGxpbmUsIExQQ1NUUiBlbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFNUQVJUVVBJTkZPMzJBIHN0YXJ0dXAsIExQUFJPQ0VTU19JTkZPUk1BVElPTiBpbmZvICk7CmV4dGVybiBpbnQgRE9TVk1fRW50ZXIoIFBDT05URVhUIGNvbnRleHQgKTsKCiNlbmRpZiAvKiBfX1dJTkVfRE9TRVhFX0ggKi8K