IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgU0hBMjU2IGJsb2NrIHRyYW5zZm9ybSBmb3IgeDg2LiBTZXB0ZW1iZXIgMjAwNy4KIwojIFBlcmZvcm1hbmNlIGluIGNsb2NrIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUgKGxlc3MgaXMgYmV0dGVyKToKIwojCQlQZW50aXVtCVBJSUkJUDQJQU1EIEs4CUNvcmUyCiMgZ2NjCQk0NgkzNgk0MQkyNwkyNgojIGljYwkJNTcJMzMJMzgJMjUJMjMJCiMgeDg2IGFzbQk0MAkzMAkzNQkyMAkyMAojIHg4Nl82NCBhc20oKikJLQktCTIxCTE1LjgJMTYuNQojCiMgKCopIHg4Nl82NCBhc3NlbWJsZXIgcGVyZm9ybWFuY2UgaXMgcHJlc2VudGVkIGZvciByZWZlcmVuY2UKIyAgICAgcHVycG9zZXMuCiMKIyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHZhcmllcyBmcm9tCiMgMTAlIHRvIDQwJSBbc2VlIGFib3ZlXS4gTm90IHZlcnkgaW1wcmVzc2l2ZSBvbiBzb21lILUtYXJjaHMsIGJ1dAojIGl0J3MgNSB0aW1lcyBzbWFsbGVyIGFuZCBvcHRpbWl6aWVzIGFtb3VudCBvZiB3cml0ZXMuCgokMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOwpwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKcmVxdWlyZSAieDg2YXNtLnBsIjsKCiZhc21faW5pdCgkQVJHVlswXSwic2hhNTEyLTU4Ni5wbCIsJEFSR1ZbJCNBUkdWXSBlcSAiMzg2Iik7CgokQT0iZWF4IjsKJEU9ImVkeCI7CiRUPSJlYngiOwokQW9mZj0mRFdQKDAsImVzcCIpOwokQm9mZj0mRFdQKDQsImVzcCIpOwokQ29mZj0mRFdQKDgsImVzcCIpOwokRG9mZj0mRFdQKDEyLCJlc3AiKTsKJEVvZmY9JkRXUCgxNiwiZXNwIik7CiRGb2ZmPSZEV1AoMjAsImVzcCIpOwokR29mZj0mRFdQKDI0LCJlc3AiKTsKJEhvZmY9JkRXUCgyOCwiZXNwIik7CiRYb2ZmPSZEV1AoMzIsImVzcCIpOwokSzI1Nj0iZWJwIjsKCnN1YiBCT0RZXzAwXzE1KCkgewogICAgbXkgJGluXzE2XzYzPXNoaWZ0OwoKCSZtb3YJKCJlY3giLCRFKTsKCSAmYWRkCSgkVCwmRFdQKDQqKDgrMTUrMTYtOSksImVzcCIpKQlpZiAoJGluXzE2XzYzKTsJIyBUICs9IFhbLTddCgkmcm9yCSgiZWN4Iiw2KTsKCSZtb3YJKCJlZGkiLCRFKTsKCSZyb3IJKCJlZGkiLDExKTsKCSAmbW92CSgiZXNpIiwkRm9mZik7CgkmeG9yCSgiZWN4IiwiZWRpIik7Cgkmcm9yCSgiZWRpIiwyNS0xMSk7CgkgJm1vdgkoJkRXUCg0Kig4KzE1KSwiZXNwIiksJFQpCWlmICgkaW5fMTZfNjMpOwkjIHNhdmUgWFswXQoJJnhvcgkoImVjeCIsImVkaSIpOwkjIFNpZ21hMShlKQoJICZtb3YJKCJlZGkiLCRHb2ZmKTsKCSZhZGQJKCRULCJlY3giKTsJIyBUICs9IFNpZ21hMShlKQoJICZtb3YJKCRFb2ZmLCRFKTsJIyBtb2R1bG8tc2NoZWR1bGVkCgoJJnhvcgkoImVzaSIsImVkaSIpOwoJICZtb3YJKCJlY3giLCRBKTsKCSZhbmQJKCJlc2kiLCRFKTsKCSAmbW92CSgkRSwkRG9mZik7CSMgZSBiZWNvbWVzIGQsIHdoaWNoIGlzIGUgaW4gbmV4dCBpdGVyYXRpb24KCSZ4b3IJKCJlc2kiLCJlZGkiKTsJIyBDaChlLGYsZykKCSAmbW92CSgiZWRpIiwkQSk7CgkmYWRkCSgkVCwiZXNpIik7CSMgVCArPSBDaChlLGYsZykKCgkmcm9yCSgiZWN4IiwyKTsKCSAmYWRkCSgkVCwkSG9mZik7CSMgVCArPSBoCgkmcm9yCSgiZWRpIiwxMyk7CgkgJm1vdgkoImVzaSIsJEJvZmYpOwoJJnhvcgkoImVjeCIsImVkaSIpOwoJJnJvcgkoImVkaSIsMjItMTMpOwoJICZhZGQJKCRFLCRUKTsJIyBkICs9IFQKCSZ4b3IJKCJlY3giLCJlZGkiKTsJIyBTaWdtYTAoYSkKCSAmbW92CSgiZWRpIiwkQ29mZik7CgoJJmFkZAkoJFQsImVjeCIpOwkjIFQgKz0gU2lnbWEwKGEpCgkgJm1vdgkoJEFvZmYsJEEpOwkjIG1vZHVsby1zY2hlZHVsZWQKCgkmbW92CSgiZWN4IiwkQSk7CgkgJnN1YgkoImVzcCIsNCk7Cgkmb3IJKCRBLCJlc2kiKTsJIyBhIGJlY29tZXMgaCwgd2hpY2ggaXMgYSBpbiBuZXh0IGl0ZXJhdGlvbgoJJmFuZAkoImVjeCIsImVzaSIpOwoJJmFuZAkoJEEsImVkaSIpOwoJICZtb3YJKCJlc2kiLCZEV1AoMCwkSzI1NikpOwoJJm9yCSgkQSwiZWN4Iik7CSMgaD1NYWooYSxiLGMpCgoJJmFkZAkoJEsyNTYsNCk7CgkmYWRkCSgkQSwkVCk7CSMgaCArPSBUCgkgJm1vdgkoJFQsJkRXUCg0Kig4KzE1KzE2LTEpLCJlc3AiKSkJaWYgKCRpbl8xNl82Myk7CSMgcHJlbG9hZCBUCgkmYWRkCSgkRSwiZXNpIik7CSMgZCArPSBLMjU2W2ldCgkmYWRkCSgkQSwiZXNpIik7CSMgaCArPSBLMjU2W2ldCn0KCiZmdW5jdGlvbl9iZWdpbigic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiKTsKCSZtb3YJKCJlc2kiLHdwYXJhbSgwKSk7CSMgY3R4CgkmbW92CSgiZWRpIix3cGFyYW0oMSkpOwkjIGlucAoJJm1vdgkoImVheCIsd3BhcmFtKDIpKTsJIyBudW0KCSZtb3YJKCJlYngiLCJlc3AiKTsJCSMgc2F2ZWQgc3AKCgkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCiZzZXRfbGFiZWwoInBpY19wb2ludCIpOwoJJmJsaW5kcG9wKCRLMjU2KTsKCSZsZWEJKCRLMjU2LCZEV1AoJmxhYmVsKCJLMjU2IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJEsyNTYpKTsKCgkmc3ViCSgiZXNwIiwxNik7CgkmYW5kCSgiZXNwIiwtNjQpOwoKCSZzaGwJKCJlYXgiLDYpOwoJJmFkZAkoImVheCIsImVkaSIpOwoJJm1vdgkoJkRXUCgwLCJlc3AiKSwiZXNpIik7CSMgY3R4CgkmbW92CSgmRFdQKDQsImVzcCIpLCJlZGkiKTsJIyBpbnAKCSZtb3YJKCZEV1AoOCwiZXNwIiksImVheCIpOwkjIGlucCtudW0qMTI4CgkmbW92CSgmRFdQKDEyLCJlc3AiKSwiZWJ4Iik7CSMgc2F2ZWQgc3AKCiZzZXRfbGFiZWwoImxvb3AiLDE2KTsKICAgICMgY29weSBpbnB1dCBibG9jayB0byBzdGFjayByZXZlcnNpbmcgYnl0ZSBhbmQgZHdvcmQgb3JkZXIKICAgIGZvcigkaT0wOyRpPDQ7JGkrKykgewoJJm1vdgkoImVheCIsJkRXUCgkaSoxNiswLCJlZGkiKSk7CgkmbW92CSgiZWJ4IiwmRFdQKCRpKjE2KzQsImVkaSIpKTsKCSZtb3YJKCJlY3giLCZEV1AoJGkqMTYrOCwiZWRpIikpOwoJJm1vdgkoImVkeCIsJkRXUCgkaSoxNisxMiwiZWRpIikpOwoJJmJzd2FwCSgiZWF4Iik7CgkmYnN3YXAJKCJlYngiKTsKCSZic3dhcAkoImVjeCIpOwoJJmJzd2FwCSgiZWR4Iik7CgkmcHVzaAkoImVheCIpOwoJJnB1c2gJKCJlYngiKTsKCSZwdXNoCSgiZWN4Iik7CgkmcHVzaAkoImVkeCIpOwogICAgfQoJJmFkZAkoImVkaSIsNjQpOwoJJnN1YgkoImVzcCIsNCo4KTsJCSMgcGxhY2UgZm9yIEEsQixDLEQsRSxGLEcsSAoJJm1vdgkoJkRXUCg0Kig4KzE2KSs0LCJlc3AiKSwiZWRpIik7CgoJIyBjb3B5IGN0eC0+aFswLTddIHRvIEEsQixDLEQsRSxGLEcsSCBvbiBzdGFjawoJJm1vdgkoJEEsJkRXUCgwLCJlc2kiKSk7CgkmbW92CSgiZWJ4IiwmRFdQKDQsImVzaSIpKTsKCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNpIikpOwoJJm1vdgkoImVkaSIsJkRXUCgxMiwiZXNpIikpOwoJIyAmbW92CSgkQW9mZiwkQSk7CgkmbW92CSgkQm9mZiwiZWJ4Iik7CgkmbW92CSgkQ29mZiwiZWN4Iik7CgkmbW92CSgkRG9mZiwiZWRpIik7CgkmbW92CSgkRSwmRFdQKDE2LCJlc2kiKSk7CQoJJm1vdgkoImVieCIsJkRXUCgyMCwiZXNpIikpOwoJJm1vdgkoImVjeCIsJkRXUCgyNCwiZXNpIikpOwoJJm1vdgkoImVkaSIsJkRXUCgyOCwiZXNpIikpOwoJIyAmbW92CSgkRW9mZiwkRSk7CgkmbW92CSgkRm9mZiwiZWJ4Iik7CgkmbW92CSgkR29mZiwiZWN4Iik7CgkmbW92CSgkSG9mZiwiZWRpIik7Cgomc2V0X2xhYmVsKCIwMF8xNSIsMTYpOwoJJm1vdgkoJFQsJkRXUCg0Kig4KzE1KSwiZXNwIikpOwoKCSZCT0RZXzAwXzE1KCk7CgoJJmNtcAkoImVzaSIsMHhjMTliZjE3NCk7Cgkmam5lCSgmbGFiZWwoIjAwXzE1IikpOwoKCSZtb3YJKCRULCZEV1AoNCooOCsxNSsxNi0xKSwiZXNwIikpOwkjIHByZWxvYWRlZCBpbiBCT0RZXzAwXzE1KDEpCiZzZXRfbGFiZWwoIjE2XzYzIiwxNik7CgkmbW92CSgiZXNpIiwkVCk7CgkgJm1vdgkoImVjeCIsJkRXUCg0Kig4KzE1KzE2LTE0KSwiZXNwIikpOwoJJnNocgkoJFQsMyk7Cgkmcm9yCSgiZXNpIiw3KTsKCSZ4b3IJKCRULCJlc2kiKTsKCSZyb3IJKCJlc2kiLDE4LTcpOwoJICZtb3YJKCJlZGkiLCJlY3giKTsKCSZ4b3IJKCRULCJlc2kiKTsJCQkjIFQgPSBzaWdtYTAoWFstMTVdKQoKCSZzaHIJKCJlY3giLDEwKTsKCSAmbW92CSgiZXNpIiwmRFdQKDQqKDgrMTUrMTYpLCJlc3AiKSk7Cgkmcm9yCSgiZWRpIiwxNyk7CgkmeG9yCSgiZWN4IiwiZWRpIik7Cgkmcm9yCSgiZWRpIiwxOS0xNyk7CgkgJmFkZAkoJFQsImVzaSIpOwkJCSMgVCArPSBYWy0xNl0KCSZ4b3IJKCJlZGkiLCJlY3giKQkJCSMgc2lnbWExKFhbLTJdKQoKCSZhZGQJKCRULCJlZGkiKTsJCQkjIFQgKz0gc2lnbWExKFhbLTJdKQoJIyAmYWRkCSgkVCwmRFdQKDQqKDgrMTUrMTYtOSksImVzcCIpKTsJIyBUICs9IFhbLTddLCBtb3ZlZCB0byBCT0RZXzAwXzE1KDEpCgkjICZtb3YJKCZEV1AoNCooOCsxNSksImVzcCIpLCRUKTsJIyBzYXZlIFhbMF0KCgkmQk9EWV8wMF8xNSgxKTsKCgkmY21wCSgiZXNpIiwweGM2NzE3OGYyKTsKCSZqbmUJKCZsYWJlbCgiMTZfNjMiKSk7CgoJJm1vdgkoImVzaSIsJkRXUCg0Kig4KzE2KzY0KSswLCJlc3AiKSk7I2N0eAoJIyAmbW92CSgkQSwkQW9mZik7CgkmbW92CSgiZWJ4IiwkQm9mZik7CgkmbW92CSgiZWN4IiwkQ29mZik7CgkmbW92CSgiZWRpIiwkRG9mZik7CgkmYWRkCSgkQSwmRFdQKDAsImVzaSIpKTsKCSZhZGQJKCJlYngiLCZEV1AoNCwiZXNpIikpOwoJJmFkZAkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CgkmYWRkCSgiZWRpIiwmRFdQKDEyLCJlc2kiKSk7CgkmbW92CSgmRFdQKDAsImVzaSIpLCRBKTsKCSZtb3YJKCZEV1AoNCwiZXNpIiksImVieCIpOwoJJm1vdgkoJkRXUCg4LCJlc2kiKSwiZWN4Iik7CgkmbW92CSgmRFdQKDEyLCJlc2kiKSwiZWRpIik7CgkjICZtb3YJKCRFLCRFb2ZmKTsKCSZtb3YJKCJlYXgiLCRGb2ZmKTsKCSZtb3YJKCJlYngiLCRHb2ZmKTsKCSZtb3YJKCJlY3giLCRIb2ZmKTsKCSZtb3YJKCJlZGkiLCZEV1AoNCooOCsxNis2NCkrNCwiZXNwIikpOyNpbnAKCSZhZGQJKCRFLCZEV1AoMTYsImVzaSIpKTsKCSZhZGQJKCJlYXgiLCZEV1AoMjAsImVzaSIpKTsKCSZhZGQJKCJlYngiLCZEV1AoMjQsImVzaSIpKTsKCSZhZGQJKCJlY3giLCZEV1AoMjgsImVzaSIpKTsKCSZtb3YJKCZEV1AoMTYsImVzaSIpLCRFKTsKCSZtb3YJKCZEV1AoMjAsImVzaSIpLCJlYXgiKTsKCSZtb3YJKCZEV1AoMjQsImVzaSIpLCJlYngiKTsKCSZtb3YJKCZEV1AoMjgsImVzaSIpLCJlY3giKTsKCgkmYWRkCSgiZXNwIiw0Kig4KzE2KzY0KSk7CQkjIGRlc3Ryb3kgZnJhbWUKCSZzdWIJKCRLMjU2LDQqNjQpOwkJCSMgcmV3aW5kIEsKCgkmY21wCSgiZWRpIiwmRFdQKDgsImVzcCIpKTsJCSMgYXJlIHdlIGRvbmUgeWV0PwoJJmpiCSgmbGFiZWwoImxvb3AiKSk7CgoJJm1vdgkoImVzcCIsJkRXUCgxMiwiZXNwIikpOwkJIyByZXN0b3JlIHNwCiZmdW5jdGlvbl9lbmRfQSgpOwoKJnNldF9sYWJlbCgiSzI1NiIsNjQpOwkjIFllcyEgSSBrZWVwIGl0IGluIHRoZSBjb2RlIHNlZ21lbnQhCgkmZGF0YV93b3JkKDB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUpOwoJJmRhdGFfd29yZCgweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1KTsKCSZkYXRhX3dvcmQoMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMyk7CgkmZGF0YV93b3JkKDB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQpOwoJJmRhdGFfd29yZCgweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjKTsKCSZkYXRhX3dvcmQoMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYSk7CgkmZGF0YV93b3JkKDB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcpOwoJJmRhdGFfd29yZCgweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3KTsKCSZkYXRhX3dvcmQoMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMyk7CgkmZGF0YV93b3JkKDB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUpOwoJJmRhdGFfd29yZCgweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzKTsKCSZkYXRhX3dvcmQoMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MCk7CgkmZGF0YV93b3JkKDB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUpOwoJJmRhdGFfd29yZCgweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzKTsKCSZkYXRhX3dvcmQoMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOCk7CgkmZGF0YV93b3JkKDB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIpOwomZnVuY3Rpb25fZW5kX0IoInNoYTI1Nl9ibG9ja19kYXRhX29yZGVyIik7CiZhc2NpeigiU0hBMjU2IGJsb2NrIHRyYW5zZm9ybSBmb3IgeDg2LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+Iik7CgomYXNtX2ZpbmlzaCgpOwo=