LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmN0YW5oIGZ1bmN0aW9uLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CgoJLnNlY3Rpb24gLnJvZGF0YQoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLnR5cGUgaGFsZixAb2JqZWN0CmhhbGY6CS5kb3VibGUgMC41CglBU01fU0laRV9ESVJFQ1RJVkUoaGFsZikKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCS50eXBlIGxuMl8yLEBvYmplY3QKbG4yXzI6CS50ZmxvYXQgMC4zNDY1NzM1OTAyNzk5NzI2NTQ3MDg2MTYwCglBU01fU0laRV9ESVJFQ1RJVkUobG4yXzIpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlZHgpCiNlbHNlCiNkZWZpbmUgTU8ob3ApIG9wCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9faWVlZTc1NF9hdGFuaCkKCW1vdmwJOCglZXNwKSwgJWVjeAoKCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMHg3ZmZmZmZmZiwgJWVheAoJY21wbAkkMHg3ZmYwMDAwMCwgJWVheAoJamFlCTVmCjc6CgojaWZkZWYgUElDCgljYWxsCTFmCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCjE6CXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFkZGwJJF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0xYl0sICVlZHgKI2VuZGlmCgoJYW5kbAkkMHg4MDAwMDAwMCwgJWVjeCAvLyBFQ1ggPT0gMCBpZmYgWCA+PSAwCgoJZmxkdAlNTyhsbjJfMikJLy8gMC41KmxuMgoJeG9ybAklZWN4LCA4KCVlc3ApCglmbGRsCTQoJWVzcCkJCS8vIHx4fCA6IDAuNSpsbjIKCWZjb21sCU1PKGhhbGYpCS8vIHx4fCA6IDAuNSpsbjIKCWZsZAklc3QJCS8vIHx4fCA6IHx4fCA6IDAuNSpsbjIKCWZuc3RzdwkJCS8vIHx4fCA6IHx4fCA6IDAuNSpsbjIKCXNhaGYKCWphZQkyZgoJZmFkZAklc3QsICVzdCgxKQkvLyB8eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZsZAklc3QJCS8vIHx4fCA6IHx4fCA6IDIqfHh8IDogMC41KmxuMgoJZnN1YnJsCU1PKG9uZSkJCS8vIDEtfHh8IDogfHh8IDogMip8eHwgOiAwLjUqbG4yCglmeGNoCQkJLy8gfHh8IDogMS18eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZtdWwJJXN0KDIpCQkvLyAyKnx4fF4yIDogMS18eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZkaXZwCQkJLy8gKDIqfHh8XjIpLygxLXx4fCkgOiAyKnx4fCA6IDAuNSpsbjIKCWZhZGRwCQkJLy8gMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglmY29tbAlNTyhsaW1pdCkJLy8gMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglmbnN0c3cJCQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCXNhaGYKCWphZQk0ZgoJZnlsMnhwMQkJCS8vIDAuNSpsbjIqbGQoMSsyKnx4fCsoMip8eHxeMikvKDEtfHh8KSkKCWplY3h6CTNmCglmY2hzCQkJLy8gMC41KmxuMipsZCgxKzIqeCsoMip4XjIpLygxLXgpKQozOglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKNDoJZmFkZGwJTU8ob25lKQkJLy8gMSsyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZ5bDJ4CQkJLy8gMC41KmxuMipsZCgxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKDErMip4KygyKnheMikvKDEteCkpCjM6CXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoyOglmYWRkbAlNTyhvbmUpCQkvLyAxK3x4fCA6IHx4fCA6IDAuNSpsbjIKCWZ4Y2gJCQkvLyB8eHwgOiAxK3x4fCA6IDAuNSpsbjIKCWZzdWJybAlNTyhvbmUpCQkvLyAxLXx4fCA6IDErfHh8IDogMC41KmxuMgoJZmRpdnJwCQkJLy8gKDErfHh8KS8oMS18eHwpIDogMC41KmxuMgoJZnlsMngJCQkvLyAwLjUqbG4yKmxkKCgxK3x4fCkvKDEtfHh8KSkKCWplY3h6CTNmCglmY2hzCQkJLy8gMC41KmxuMipsZCgoMSt4KS8oMS14KSkKMzoJcmV0CgoJLy8geCA9PSBOYU4gb3IgsUluZgo1OglqYQk2ZgoJY21wbAkkMCwgNCglZXNwKQoJamUJN2IKNjoJZmxkbAk0KCVlc3ApCglyZXQKRU5EKF9faWVlZTc1NF9hdGFuaCkKc3Ryb25nX2FsaWFzIChfX2llZWU3NTRfYXRhbmgsIF9fYXRhbmhfZmluaXRlKQo=