LyoqCiAqIFRoaXMgZmlsZSBoYXMgbm8gY29weXJpZ2h0IGFzc2lnbmVkIGFuZCBpcyBwbGFjZWQgaW4gdGhlIFB1YmxpYyBEb21haW4uCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBtaW5ndy13NjQgcnVudGltZSBwYWNrYWdlLgogKiBObyB3YXJyYW50eSBpcyBnaXZlbjsgcmVmZXIgdG8gdGhlIGZpbGUgRElTQ0xBSU1FUi5QRCB3aXRoaW4gdGhpcyBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPF9taW5nd19tYWMuaD4KCgkuZmlsZQkibG9nMXBsLlMiCgkudGV4dAoJLyogVGhlIGZ5bDJ4cDEgY2FuIG9ubHkgYmUgdXNlZCBmb3IgdmFsdWVzIGluCgkgICAtMSArIHNxcnQoMikgLyAyIDw9IHggPD0gMSAtIHNxcnQoMikgLyAyCgkgICAwLjI5IGlzIGEgc2FmZSB2YWx1ZS4KCSAqLwoKCS8qIE9ubHkgZ2NjIHVuZGVyc3RhbmRzIHRoZSAudGZsb2F0IHR5cGUKCSAgIFRoZSBzZXJpZXMgb2YgLmxvbmcgYmVsb3cgcmVwcmVzZW50cwoJICAgbGltaXQ6CS50ZmxvYXQgMC4yOQoJICovCgkuYWxpZ24gMTYKbGltaXQ6CgkubG9uZyAyOTIwNTc3NzYxCgkubG9uZyAyNDkxMDgxMDMxCgkubG9uZyAxNjM4MQojaWZkZWYgX194ODZfNjRfXwoJLmFsaWduIDgKI2Vsc2UKCS5hbGlnbiA0CiNlbmRpZgoJLyogUGxlYXNlIG5vdGU6CSB3ZSB1c2UgYSBkb3VibGUgdmFsdWUgaGVyZS4gIFNpbmNlIDEuMCBoYXMKCSAgIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uIHRoaXMgZG9lcyBub3QgZWZmZWN0IHRoZSBhY2N1cmFjeQoJICAgYnV0IGl0IGhlbHBzIHRvIG9wdGltaXplIHRoZSBjb2RlLiAgKi8Kb25lOgkuZG91YmxlIDEuMAoKLyoKICogVXNlIHRoZSBmeWwyeHAxIGZ1bmN0aW9uIHdoZW4gdGhlIGFyZ3VtZW50IGlzIGluIHRoZSByYW5nZSAtMC4yOSB0byAwLjI5LAogKiBvdGhlcndpc2UgZnlsMnggd2l0aCB0aGUgbmVlZGVkIGV4dHJhIGNvbXB1dGF0aW9uLgogKi8KLmdsb2JsIF9fTUlOR1dfVVNZTUJPTChsb2cxcGwpCgkuZGVmCV9fTUlOR1dfVVNZTUJPTChsb2cxcGwpOwkuc2NsCTI7CS50eXBlCTMyOwkuZW5kZWYKX19NSU5HV19VU1lNQk9MKGxvZzFwbCk6CiNpZmRlZiBfX3g4Nl82NF9fCglmbGRsbjIKCWZsZHQJKCVyZHgpCglmeGFtCglmbnN0c3cKCWZsZAklc3QKCXNhaGYKCWpjCTNmCQkvLyBpbiBjYXNlIHggaXMgTmFOIG9yILFJbmYKNDoKCWZhYnMKCWZsZHQJbGltaXQoJXJpcCkKCWZjb21wcAoJZm5zdHN3CglzYWhmCglqbmMJMmYKCWZhZGRsCW9uZSglcmlwKQoJZnlsMngKCW1vdnEJJXJjeCwlcmF4Cgltb3ZxCSQwLDgoJXJjeCkKCWZzdHB0CSglcmN4KQoJcmV0CgoyOglmeWwyeHAxCgltb3ZxCSVyY3gsJXJheAoJbW92cQkkMCw4KCVyY3gpCglmc3RwdAkoJXJjeCkKCXJldAoKMzoJanAJNGIJCS8vIGluIGNhc2UgeCBpcyCxSW5mCglmc3RwCSVzdCgxKQoJZnN0cAklc3QoMSkKCW1vdnEJJXJjeCwlcmF4Cgltb3ZxCSQwLDgoJXJjeCkKCWZzdHB0CSglcmN4KQoJcmV0CiNlbHNlCglmbGRsbjIKCWZsZHQJNCglZXNwKQoJZnhhbQoJZm5zdHN3CglmbGQJJXN0CglzYWhmCglqYwkzZgkJLy8gaW4gY2FzZSB4IGlzIE5hTiBvciCxSW5mCjQ6CglmYWJzCglmbGR0CWxpbWl0CglmY29tcHAKCWZuc3RzdwoJc2FoZgoJam5jCTJmCglmYWRkbAlvbmUKCWZ5bDJ4CglyZXQKCjI6CWZ5bDJ4cDEKCXJldAoKMzoJanAJNGIJCS8vIGluIGNhc2UgeCBpcyCxSW5mCglmc3RwCSVzdCgxKQoJZnN0cAklc3QoMSkKCXJldAojZW5kaWYK