LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmN0YW5oIGZ1bmN0aW9uLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CgoJLnNlY3Rpb24gLnJvZGF0YQoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSB1c2UgZG91YmxlIHZhbHVlcyBmb3IgMC41IGFuZCAxLjAuICBUaGVzZQoJICAgbnVtYmVycyBoYXZlIGV4YWN0IHJlcHJlc2VudGF0aW9ucyBhbmQgc28gd2UgZG9uJ3QgZ2V0IGFjY3VyYWN5CgkgICBwcm9ibGVtcy4gIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY29kZSBpcyBzaW1wbGVyLiAgKi8KCS50eXBlIGhhbGYsQG9iamVjdApoYWxmOgkuZG91YmxlIDAuNQoJQVNNX1NJWkVfRElSRUNUSVZFKGhhbGYpCgkudHlwZSBvbmUsQG9iamVjdApvbmU6CS5kb3VibGUgMS4wCglBU01fU0laRV9ESVJFQ1RJVkUob25lKQoJLyogSXQgaXMgbm90IGltcG9ydGFudCB0aGF0IHRoaXMgY29uc3RhbnQgaXMgcHJlY2lzZS4gIEl0IGlzIG9ubHkKCSAgIGEgdmFsdWUgd2hpY2ggaXMga25vd24gdG8gYmUgb24gdGhlIHNhZmUgc2lkZSBmb3IgdXNpbmcgdGhlCgkgICBmeWwyeHAxIGluc3RydWN0aW9uLiAgKi8KCS50eXBlIGxpbWl0LEBvYmplY3QKbGltaXQ6CS5kb3VibGUgMC4yOQoJQVNNX1NJWkVfRElSRUNUSVZFKGxpbWl0KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkudHlwZSBsbjJfMixAb2JqZWN0CmxuMl8yOgkudGZsb2F0IDAuMzQ2NTczNTkwMjc5OTcyNjU0NzA4NjE2MAoJQVNNX1NJWkVfRElSRUNUSVZFKGxuMl8yKQoKI2lmZGVmIFBJQwojZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWR4KQojZWxzZQojZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfYXRhbmhsKQoJbW92bAkxMiglZXNwKSwgJWVjeAoKCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMHg3ZmZmLCAlZWF4CgljbXBsCSQweDdmZmYsICVlYXgKCWplCTVmCgljbXBsCSQweDNmZGYsICVlYXgKCWpnZQk3ZgoJLy8gRXhwb25lbnQgYmVsb3cgLTMyOyByZXR1cm4geCwgd2l0aCB1bmRlcmZsb3cgaWYgc3Vibm9ybWFsLgoJZmxkdAk0KCVlc3ApCgljbXBsCSQwLCAlZWF4CglqbmUJOGYKCWZsZAklc3QoMCkKCWZtdWwJJXN0KDApCglmc3RwCSVzdCgwKQo4OglyZXQKNzoKCiNpZmRlZiBQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoKCWFuZGwJJDB4ODAwMCwgJWVjeAkvLyBFQ1ggPT0gMCBpZmYgWCA+PSAwCgoJZmxkdAlNTyhsbjJfMikJLy8gMC41KmxuMgoJeG9ybAklZWN4LCAxMiglZXNwKQoJZmxkdAk0KCVlc3ApCQkvLyB8eHwgOiAwLjUqbG4yCglmY29tbAlNTyhoYWxmKQkvLyB8eHwgOiAwLjUqbG4yCglmbGQJJXN0KDApCQkvLyB8eHwgOiB8eHwgOiAwLjUqbG4yCglmbnN0c3cJCQkvLyB8eHwgOiB8eHwgOiAwLjUqbG4yCglzYWhmCglqYWUJMmYKCWZhZGQJJXN0LCAlc3QoMSkJLy8gfHh8IDogMip8eHwgOiAwLjUqbG4yCglmbGQJJXN0CQkvLyB8eHwgOiB8eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZzdWJybAlNTyhvbmUpCQkvLyAxLXx4fCA6IHx4fCA6IDIqfHh8IDogMC41KmxuMgoJZnhjaAkJCS8vIHx4fCA6IDEtfHh8IDogMip8eHwgOiAwLjUqbG4yCglmbXVsCSVzdCgyKQkJLy8gMip8eHxeMiA6IDEtfHh8IDogMip8eHwgOiAwLjUqbG4yCglmZGl2cAkJCS8vICgyKnx4fF4yKS8oMS18eHwpIDogMip8eHwgOiAwLjUqbG4yCglmYWRkcAkJCS8vIDIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJZmNvbWwJTU8obGltaXQpCS8vIDIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJZm5zdHN3CQkJLy8gMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglzYWhmCglqYWUJNGYKCWZ5bDJ4cDEJCQkvLyAwLjUqbG4yKmxkKDErMip8eHwrKDIqfHh8XjIpLygxLXx4fCkpCglqZWN4egkzZgoJZmNocwkJCS8vIDAuNSpsbjIqbGQoMSsyKngrKDIqeF4yKS8oMS14KSkKMzoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjQ6CWZhZGRsCU1PKG9uZSkJCS8vIDErMip8eHwrKDIqfHh8XjIpLygxLXx4fCkgOiAwLjUqbG4yCglmeWwyeAkJCS8vIDAuNSpsbjIqbGQoMSsyKnx4fCsoMip8eHxeMikvKDEtfHh8KSkKCWplY3h6CTNmCglmY2hzCQkJLy8gMC41KmxuMipsZCgxKzIqeCsoMip4XjIpLygxLXgpKQozOglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoJZmFkZGwJTU8ob25lKQkJLy8gMSt8eHwgOiB8eHwgOiAwLjUqbG4yCglmeGNoCQkJLy8gfHh8IDogMSt8eHwgOiAwLjUqbG4yCglmc3VicmwJTU8ob25lKQkJLy8gMS18eHwgOiAxK3x4fCA6IDAuNSpsbjIKCWZkaXZycAkJCS8vICgxK3x4fCkvKDEtfHh8KSA6IDAuNSpsbjIKCWZ5bDJ4CQkJLy8gMC41KmxuMipsZCgoMSt8eHwpLygxLXx4fCkpCglqZWN4egkzZgoJZmNocwkJCS8vIDAuNSpsbjIqbGQoKDEreCkvKDEteCkpCjM6CXJldAoKCS8vIHggPT0gTmFOIG9yILFJbmYKNToJY21wbAkkMHg4MDAwMDAwMCwgOCglZXNwKQoJamEJNmYKCWNtcGwJJDAsIDQoJWVzcCkKCWplCTdiCjY6CWZsZHQJNCglZXNwKQoJZmFkZAklc3QoMCkKCXJldApFTkQoX19pZWVlNzU0X2F0YW5obCkKc3Ryb25nX2FsaWFzIChfX2llZWU3NTRfYXRhbmhsLCBfX2F0YW5obF9maW5pdGUpCg==