LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CiNpbmNsdWRlIDxsaWJtLWFsaWFzLWZsb2F0Lmg+CgoJLnNlY3Rpb24gLnJvZGF0YQoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLnR5cGUgaHVnZSxAb2JqZWN0Cmh1Z2U6CS5kb3VibGUgMWUrMzYKCUFTTV9TSVpFX0RJUkVDVElWRShodWdlKQoJLnR5cGUgb25lLEBvYmplY3QKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCS50eXBlIGxpbWl0LEBvYmplY3QKbGltaXQ6CS5kb3VibGUgMC4yOQoJQVNNX1NJWkVfRElSRUNUSVZFKGxpbWl0KQoKI2lmZGVmIFBJQwojZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWR4KQojZWxzZQojZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2FzaW5oZikKCW1vdmwJNCglZXNwKSwgJWVjeAoJbW92bAkkMHg3ZmZmZmZmZiwgJWVheAoJYW5kbAklZWN4LCAlZWF4CglhbmRsCSQweDgwMDAwMDAwLCAlZWN4Cgltb3ZsCSVlYXgsICVlZHgKCW9ybAkkMHg4MDdmZmZmZiwgJWVkeAoJaW5jbAklZWR4Cglqegk3ZgkJCS8vIHggaW4gsUluZiBvciBOYU4KCXhvcmwJJWVjeCwgNCglZXNwKQoJZmxkcwk0KCVlc3ApCQkJLy8gfHh8CgljbXBsCSQweDM4MDAwMDAwLCAlZWF4CglqYgkyZgkJCS8vIHx4fCA8IDJeLTE0CglmbGRsbjIJCQkJLy8gbG9nKDIpIDogfHh8CgljbXBsCSQweDQ3MDAwMDAwLCAlZWF4CglmeGNoCQkJCS8vIHx4fCA6IGxvZygyKQoJamEJM2YJCQkvLyB8eHwgPiAyXjE0CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoJY21wbAkkMHg0MDAwMDAwMCwgJWVheAoJamEJNWYJCQkvLyB8eHwgPiAyCgoJLy8gMl4tMTQgPD0gfHh8IDw9IDIgPT4geSA9IHNpZ24oeCkqbG9nMXAofHh8K3x4fF4yLygxK3NxcnQoMSt8eHxeMikpKQoJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IGxvZygyKQoJZm11bAklc3QoMSkJCQkvLyB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmxkCSVzdAkJCS8vIHx4fF4yIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3x4fF4yIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZzcXJ0CQkJCS8vIHNxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmFkZGwJTU8ob25lKQkJCS8vIDErc3FydCgxK3x4fF4yKSA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmZGl2cnAJCQkJLy8gfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiB8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSA6IGxvZygyKQoJZmNvbWwJTU8obGltaXQpCglmbnN0c3cKCXNhaGYKCWphCTZmCglmeWwyeHAxCglqZWN4egk0ZgoJZmNocwo0OglyZXQKCjc6CWZsZHMJNCglZXNwKQoJcmV0Cgo2OglmYWRkbAlNTyhvbmUpCglmeWwyeAoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CgoJLy8gfHh8IDwgMl4tMTQgPT4geSA9IHggKGluZXhhY3QgaWZmIHx4fCAhPSAwLjApCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChkeCkKI2VuZGlmCglqZWN4egk0ZgoJZmNocwkJCQkvLyB4CjQ6CWZsZAklc3QJCQkvLyB4IDogeAoJZmFkZGwJTU8oaHVnZSkJCS8vIGh1Z2UreCA6IHgKCWZzdHAJJXN0KDApCQkJLy8geAoJY21wbAkkMHgwMDgwMDAwMCwgJWVheAoJamFlCThmCglzdWJsCSQ0LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCglmbGQJJXN0KDApCglmbXVsCSVzdCgwKQoJZnN0cHMJKCVlc3ApCglhZGRsCSQ0LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQo4OglyZXQKCgkvLyB8eHwgPiAyXjE0ID0+IHkgPSBzaWduKHgpICogKGxvZyh8eHwpICsgbG9nKDIpKQoJLmFsaWduIEFMSUdOQVJHKDQpCjM6CWZ5bDJ4CQkJCS8vIGxvZyh8eHwpCglmbGRsbjIJCQkJLy8gbG9nKDIpIDogbG9nKHx4fCkKCWZhZGRwCQkJCS8vIGxvZyh8eHwpK2xvZygyKQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CgoJLy8gfHh8ID4gMiA9PiB5ID0gc2lnbih4KSAqIGxvZygyKnx4fCArIDEvKHx4fCtzcXJ0KHgqeCsxKSkpCgkuYWxpZ24gQUxJR05BUkcoNCkKNToJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IGxvZygyKQoJZmFkZAklc3QsICVzdCgxKQkJLy8gfHh8IDogMip8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZm11bAklc3QoMSkJCQkvLyB8eHxeMiA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIHx4fCtzcXJ0KDErfHh8XjIpIDogMip8eHwgOiBsb2coMikKCWZkaXZybAlNTyhvbmUpCQkJLy8gMS8ofHh8K3NxcnQoMSt8eHxeMikpIDogMip8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIDIqfHh8KzEvKHx4fCtzcXJ0KDErfHh8XjIpKSA6IGxvZygyKQoJZnlsMngJCQkJLy8gbG9nKDIqfHh8KzEvKHx4fCtzcXJ0KDErfHh8XjIpKSkKCWplY3h6CTRmCglmY2hzCjQ6CXJldApFTkQoX19hc2luaGYpCmxpYm1fYWxpYXNfZmxvYXQgKF9fYXNpbmgsIGFzaW5oKQo=