LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwNCwgMjAwNSwgMjAwNwogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAgIDAyMTExLTEzMDcgVVNBLiAgKi8KCiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgoKI2lmZGVmIF9fRUxGX18KCS5zZWN0aW9uIC5yb2RhdGEKI2Vsc2UKCS50ZXh0CiNlbmRpZgoKCS5hbGlnbiBBTElHTkFSRyg0KQoJQVNNX1RZUEVfRElSRUNUSVZFKGluZmluaXR5LEBvYmplY3QpCmluZl96ZXJvOgppbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YKCUFTTV9TSVpFX0RJUkVDVElWRShpbmZpbml0eSkKCUFTTV9UWVBFX0RJUkVDVElWRSh6ZXJvLEBvYmplY3QpCnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCUFTTV9UWVBFX0RJUkVDVElWRShtaW5mX216ZXJvLEBvYmplY3QpCm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCglBU01fVFlQRV9ESVJFQ1RJVkUocDYzLEBvYmplY3QpCnA2MzoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MwoJQVNNX1NJWkVfRElSRUNUSVZFKHA2MykKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVjeCkKI2RlZmluZSBNT1gob3AseCxmKSBvcCMjQEdPVE9GRiglZWN4LHgsZikKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2RlZmluZSBNT1gob3AseCxmKSBvcCgseCxmKQojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfcG93KQoJZmxkbAkxMiglZXNwKQkvLyB5CglmeGFtCgojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGN4KQojZW5kaWYKCglmbnN0c3cKCW1vdmIJJWFoLCAlZGwKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCS8vIGlzIHkgPT0gMCA/CglqZQkxMWYKCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSA9PSCxaW5mID8KCWplCTEyZgoKCWNtcGIJJDB4MDEsICVhaAkvLyBpcyB5ID09IE5hTiA/CglqZQkzMGYKCglmbGRsCTQoJWVzcCkJCS8vIHggOiB5CgoJc3VibAkkOCwlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgoJZnhhbQoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRoCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAoJamUJMjBmCQkvLyB4IGlzILEwCgoJY21wYgkkMHgwNSwgJWFoCglqZQkxNWYJCS8vIHggaXMgsWluZgoKCWZ4Y2gJCQkvLyB5IDogeAoKCS8qIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDYzKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCgoJLyogRmlyc3Qgc2VlIHdoZXRoZXIgYHknIGlzIGEgbmF0dXJhbCBudW1iZXIuICBJbiB0aGlzIGNhc2Ugd2UKCSAgIGNhbiB1c2UgYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmlzdHBsbAkoJWVzcCkJCS8vIHkgOiB4CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5IDogeAoJZnVjb21wCSVzdCgxKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5lCTJmCgoJLyogT0ssIHdlIGhhdmUgYW4gaW50ZWdlciB2YWx1ZSBmb3IgeS4gICovCglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglvcmwJJDAsICVlZHgKCWZzdHAJJXN0KDApCQkvLyB4CglqbnMJNGYJCS8vIHkgPj0gMCwganVtcAoJZmRpdnJsCU1PKG9uZSkJCS8vIDEveAkJKG5vdyByZWZlcnJlZCB0byBhcyB4KQoJbmVnbAklZWF4CglhZGNsCSQwLCAlZWR4CgluZWdsCSVlZHgKNDoJZmxkbAlNTyhvbmUpCQkvLyAxIDogeAoJZnhjaAoKNjoJc2hyZGwJJDEsICVlZHgsICVlYXgKCWpuYwk1ZgoJZnhjaAoJZm11bAklc3QoMSkJCS8vIHggOiBTVCp4CglmeGNoCjU6CWZtdWwJJXN0KDApLCAlc3QJLy8geCp4IDogU1QqeAoJc2hybAkkMSwgJWVkeAoJbW92bAklZWF4LCAlZWN4CglvcmwJJWVkeCwgJWVjeAoJam56CTZiCglmc3RwCSVzdCgwKQkJLy8gU1QqeAoJcmV0CgoJLyogeSBpcyCxTkFOICovCjMwOglmbGRsCTQoJWVzcCkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmdWNvbXAJJXN0KDEpCQkvLyB4IDogeQoJZm5zdHN3CglzYWhmCglqZQkzMWYKCWZ4Y2gJCQkvLyB5IDogeAozMToJZnN0cAklc3QoMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoyOgkvKiB5IGlzIGEgcmVhbCBudW1iZXIuICAqLwoJZnhjaAkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmbGRsCU1PKGxpbWl0KQkvLyAwLjI5IDogMS4wIDogeCA6IHkKCWZsZAklc3QoMikJCS8vIHggOiAwLjI5IDogMS4wIDogeCA6IHkKCWZzdWIJJXN0KDIpCQkvLyB4LTEgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZhYnMJCQkvLyB8eC0xfCA6IDAuMjkgOiAxLjAgOiB4IDogeQoJZnVjb21wcAkJCS8vIDEuMCA6IHggOiB5CglmbnN0c3cKCWZ4Y2gJCQkvLyB4IDogMS4wIDogeQoJc2FoZgoJamEJN2YKCWZzdWIJJXN0KDEpCQkvLyB4LTEgOiAxLjAgOiB5CglmeWwyeHAxCQkJLy8gbG9nMih4KSA6IHkKCWptcAk4ZgoKNzoJZnlsMngJCQkvLyBsb2cyKHgpIDogeQo4OglmbXVsCSVzdCgxKQkJLy8geSpsb2cyKHgpIDogeQoJZnN0CSVzdCgxKQkJLy8geSpsb2cyKHgpIDogeSpsb2cyKHgpCglmcm5kaW50CQkJLy8gaW50KHkqbG9nMih4KSkgOiB5KmxvZzIoeCkKCWZzdWJyCSVzdCwgJXN0KDEpCS8vIGludCh5KmxvZzIoeCkpIDogZnJhY3QoeSpsb2cyKHgpKQoJZnhjaAkJCS8vIGZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZjJ4bTEJCQkvLyAyXmZyYWN0KHkqbG9nMih4KSktMSA6IGludCh5KmxvZzIoeCkpCglmYWRkbAlNTyhvbmUpCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZnNjYWxlCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKCWZzdHAJJXN0KDEpCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKQoJcmV0CgoKCS8vIHBvdyh4LLEwKSA9IDEKCS5hbGlnbiBBTElHTkFSRyg0KQoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkbAk0KCVlc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWR4LCA0KQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE0OglmbGRsCU1PKG9uZSkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxMzoJZmxkbAk0KCVlc3ApCQkvLyBsb2FkIHggPT0gTmFOCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsWluZgoxNToJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGgKCWp6CTE2ZgkJLy8ganVtcCBpZiB4ID09ICtpbmYKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTE3ZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIHRoZSBudW1iZXIgb2YgYml0cyBzbWFsbAoJLy8gZW5vdWdoIHNvIHRoYXQgYWxsIGFyZSBjb21pbmcgZnJvbSB0aGUgbWFudGlzc2E/Cglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglhbmRiCSQxLCAlYWwKCWp6CTE4ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgltb3ZsCSVlZHgsICVlYXgKCW9ybAklZWR4LCAlZWR4CglqbnMJMTU1ZgoJbmVnbAklZWF4CjE1NToJY21wbAkkMHgwMDIwMDAwMCwgJWVheAoJamEJMThmCQkvLyBkb2VzIG5vdCBmaXQgaW4gbWFudGlzc2EgYml0cwoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChtaW5mX216ZXJvLCAlZWR4LCA4KQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE2OglmY29tcGwJTU8oemVybykKCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWF4LCAxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE3OglzaGxsCSQzMCwgJWVkeAkvLyBzaWduIGJpdCBmb3IgeSBpbiByaWdodCBwb3NpdGlvbgoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMTg6CXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHNtYWxsCgkvLyBlbm91Z2ggc28gdGhhdCBhbGwgYXJlIGNvbWluZyBmcm9tIHRoZSBtYW50aXNzYT8KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMjdmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCWNtcGwJJDB4ZmZlMDAwMDAsICVlZHgKCWpiZQkyN2YJCS8vIGRvZXMgbm90IGZpdCBpbiBtYW50aXNzYSBiaXRzCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgbWludXMgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglmY2hzCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjI1Oglmc3RwCSVzdCgwKQoyNjoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMjc6CS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILEwIGFuZCB5IGlzID4gMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoyMToJdGVzdGIJJDIsICVkaAoJanoJMjJmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjNmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHNtYWxsCgkvLyBlbm91Z2ggc28gdGhhdCBhbGwgYXJlIGNvbWluZyBmcm9tIHRoZSBtYW50aXNzYT8KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMjRmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCWNtcGwJJDB4ZmZlMDAwMDAsICVlZHgKCWphZQkyNGYJCS8vIGRvZXMgbm90IGZpdCBpbiBtYW50aXNzYSBiaXRzCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkbAlNTyhtemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMjI6CWZzdHAJJXN0KDApCjIzOglhZGRsCSQ4LCAlZXNwCS8vIERvbid0IHVzZSAyIHggcG9wCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoyNDoJZmxkbAlNTyh6ZXJvKQoJcmV0CgpFTkQoX19pZWVlNzU0X3BvdykK