IyEvYmluL2Jhc2gKCiMjCiMgQ29weXJpZ2h0IDIwMTUgVGVsZWbzbmljYSBJbnZlc3RpZ2FjafNuIHkgRGVzYXJyb2xsbywgUy5BLlUuCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Blbm1hbm8KIyBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkKIyBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbgojIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIwojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCiMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCiMgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKIyB1bmRlciB0aGUgTGljZW5zZS4KIwojIEZvciB0aG9zZSB1c2FnZXMgbm90IGNvdmVyZWQgYnkgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBwbGVhc2UKIyBjb250YWN0IHdpdGg6IG5mdmxhYnNAdGlkLmVzCiMjCgojR2V0IGNvbmZpZ3VyYXRpb24gb2YgYSBob3N0IGZvciB1c2luZyBpdCBhcyBhIGNvbXB1dGUgbm9kZQoKZnVuY3Rpb24gdXNhZ2UoKXsKICAgIGVjaG8gIC1lICJ1c2FnZTogJDAgdXNlciBpcF9uYW1lIFs+PiBob3N0LnlhbWxdXG4gIEdldCBob3N0IHBhcmFtZXRlcnMgYW5kIGdlbmVyYXRlZCBhIHlhbWwgZmlsZSB0byBiZSB1c2VkIGZvciBvcGVudmltIGhvc3QtYWRkIgogICAgZXhpdCAxCn0KCmZ1bmN0aW9uIGxvYWRfdmZfZHJpdmVyKCl7CiAgbG9jYWwgcGZfZHJpdmVyPSQxCiAgaWYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHBmX2RyaXZlciB8IGdyZXAgLXYgdmZgIF1dICYmIFtbICEgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHtwZl9kcml2ZXJ9dmZgIF1dCiAgdGhlbgogICAgPiYyIGVjaG8gIiRwZl9kcml2ZXIgaXMgbG9hZGVkIGJ1dCBub3QgJHtwZl9kcml2ZXJ9dmYuIFRoaXMgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gcHJvcGVybHkgYWRkIFNSLUlPVi4iCiAgICByZWFkIC1wICJEbyB5b3Ugd2FudCB0byBsb2FkICR7cGZfZHJpdmVyfXZmIFtZL25dICIgbG9hZF9kcml2ZXIKICAgIGNhc2UgJGxvYWRfZHJpdmVyIGluCiAgICAgIFtuTl0qICkgZXhpdCAxOzsKICAgICAgKiApID4mMiBlY2hvICJMb2FkaW5nICR7cGZfZHJpdmVyfXZmLi4uIgogICAgICAgICAgbW9kcHJvYmUgJHtwZl9kcml2ZXJ9dmY7CiAgICAgICAgICA+JjIgZWNobyAiUmVsb2FkaW5nICR7cGZfZHJpdmVyfS4uLiIKICAgICAgICAgIG1vZHByb2JlIC1yICRwZl9kcml2ZXI7CiAgICAgICAgICBtb2Rwcm9iZSAkcGZfZHJpdmVyOzsKICAgIGVzYWMKICBmaQp9CgpmdW5jdGlvbiByZW1vdmVfdmZfZHJpdmVyKCl7CiAgbG9jYWwgcGZfZHJpdmVyPSQxCiAgaWYgW1sgYGxzbW9kIHwgY3V0IC1kIiAiIC1mMSB8IGdyZXAgJHBmX2RyaXZlciB8IGdyZXAgLXYgdmZgIF1dICYmIFtbIGBsc21vZCB8IGN1dCAtZCIgIiAtZjEgfCBncmVwICR7cGZfZHJpdmVyfXZmYCBdXQogIHRoZW4KICAgID4mMiBlY2hvICIke3BmX2RyaXZlcn12ZiBpcyBsb2FkZWQuIEluIG9yZGVyIHRvIGVuc3VyZSBwcm9wZXIgU1ItSU9WIGJlaGF2aW9yIHRoZSBkcml2ZXIgbXVzdCBiZSByZW1vdmVkLiIKICAgIHJlYWQgLXAgIkRvIHlvdSB3YW50IHRvIHJlbW92ZSAke3BmX2RyaXZlcn12ZiBub3c/IFtZL25dICIgcmVtb3ZlX2RyaXZlcgogICAgY2FzZSAkcmVtb3ZlX2RyaXZlciBpbgogICAgICBbbk5dKiApID4mMiBlY2hvICJPSy4gUmVtZW1iZXIgdG8gcmVtb3ZlIHRoZSBkcml2ZXIgcHJpb3Igc3RhcnQgdXNpbmcgdGhlIGNvbXB1dGUgbm9kZSBleGVjdXRpbmc6IjsKICAgICAgICAgICAgICA+JjIgZWNobyAibW9kcHJvYmUgLXIgJHtwZl9kcml2ZXJ9dmYiOwogICAgICAgICAgICAgID4mMiBlY2hvICJtb2Rwcm9iZSAtciAke3BmX2RyaXZlcn0iOwogICAgICAgICAgICAgID4mMiBlY2hvICJtb2Rwcm9iZSAke3BmX2RyaXZlcn0iOzsKICAgICAgKiApID4mMiBlY2hvICJSZW1vdmluZyAke3BmX2RyaXZlcn12Zi4uLiIKICAgICAgICAgIG1vZHByb2JlIC1yICR7cGZfZHJpdmVyfXZmOwogICAgICAgICAgPiYyIGVjaG8gIlJlbG9hZGluZyAke3BmX2RyaXZlcn0uLi4iCiAgICAgICAgICBtb2Rwcm9iZSAtciAkcGZfZHJpdmVyOwogICAgICAgICAgbW9kcHJvYmUgJHBmX2RyaXZlcjs7CiAgICBlc2FjCiAgZmkKfQoKZnVuY3Rpb24gZ2V0X2hhc2hfdmFsdWUoKSB7ICAgZWNobyBgZXZhbCAgZWNobyAkXHtcYGVjaG8gJDFbJDJdXGBcfWA7IH0KCmZ1bmN0aW9uIHhtbHBhdGhfYXJncygpCnsKICBsb2NhbCBleHByPSIkezEvL1wvLyB9IgogIGxvY2FsIHBhdGg9KCkKICBsb2NhbCBjaHVuayB0YWcgZGF0YQogIGxvY2FsIGV4aXRfY29kZT0xCiAgbG9jYWwgcHJpbnRfbGluZT0wCiAgbG9jYWwgY2xvc2luZ190YWc9MAoKICB3aGlsZSBJRlM9JycgcmVhZCAtciAtZCAnPCcgY2h1bms7IGRvCiAgICBkYXRhPWFyZ3VtZW50cz0iIgogICAgSUZTPSc+JyByZWFkIC1yIHRhZ19hcmcgZGF0YSA8PDwgIiRjaHVuayIKICAgIElGUz0nICcgcmVhZCAtciB0YWcgYXJndW1lbnRzIDw8PCAiJHRhZ19hcmciCiAgICAjSWYgbGFzdCB0YWcgd2FzIHNpbmdsZSBsZXZlbCByZW1vdmUgaXQgZnJvbSBwYXRoCiAgICBpZiBbWyAkY2xvc2luZ190YWcgLWVxIDEgXV0gCiAgICB0aGVuIAogICAgICB1bnNldCBwYXRoWyR7I3BhdGhbQF19LTFdCiAgICAgIGNsb3NpbmdfdGFnPTAKICAgIGZpCiAgICAjSW4gY2FzZSB0aGUgdGFnIGlzIGNsb3NlZCBpbiB0aGUgc2FtZSBsaW5lIG1hcmsgaXQKICAgIFtbICRhcmd1bWVudHMgPSA/KicvJyBdXSAmJiBjbG9zaW5nX3RhZz0xCiAgICBhcmd1bWVudHM9IiR7YXJndW1lbnRzLy9cLy99IgogICAgY2FzZSAiJHRhZyIgaW4KICAgICAgJz8nKikgOzsKICAgICAgJyEtLScqKSA7OwogICAgICA/KicvJykgOzsKICAgICAgJy8nPyopIHVuc2V0IHBhdGhbJHsjcGF0aFtAXX0tMV0gOzsKICAgICAgPyopIHBhdGgrPSgiJHRhZyIpOzsgICAgICAgIAogICAgZXNhYwogICAgCiAgICAjZWNobyAiXCIke3BhdGhbQF19XCIgXCIkZXhwclwiIFwiJGRhdGFcIiBcIiRhcmd1bWVudHNcIiAkZXhpdF9jb2RlICRwcmludF9saW5lIgogICAgCiAgICBpZiBbWyAiJHtwYXRoW0BdfSIgPT0gIiRleHByIiBdXQogICAgdGhlbgogICAgICAjSWYgdGhlcmUgaXMgZGF0YSBwcmludCBpdCBhbmQgYXBwZW5kIGFyZ3VtZW50cyBpZiBhbnkKICAgICAgaWYgWyAiJGRhdGEiICE9ICIiIF0gCiAgICAgIHRoZW4KICAgICAgICBlY2hvICIkZGF0YSAkYXJndW1lbnRzIgogICAgICAgICNyZXR1cm4gY29kZSAwIG1lYW5zIGRhdGEgd2FzIGZvdW5kCiAgICAgICAgZXhpdF9jb2RlPTAKICAgICAgICBjb250aW51ZQogICAgICAjaWYgdGhlcmUgaXMgbm8gZGF0YSBidXQgdGhlcmUgYXJlIGFyZ3VtZW50cyBwcmludCBhcmd1bWVudHMKICAgICAgZWxpZiBbICIkYXJndW1lbnRzIiAhPSAiIiBdCiAgICAgIHRoZW4KICAgICAgICBlY2hvICIkYXJndW1lbnRzIgogICAgICAgICNyZXR1cm4gY29kZSAyIG1lYW5zIG5vIGRhdGEgYnV0IGFyZ3VtZW50cyB3ZXJlIGZvdW5kCiAgICAgICAgZXhpdF9jb2RlPTIKICAgICAgICBjb250aW51ZQogICAgICAjb3RoZXJ3aXNlIHN3aXRjaCBmbGFnIHRvIHN0YXJ0L3N0b3AgZWNob2luZyBlYWNoIGxpbmUgdW50aWwgdGhlIHRhZyBpcyBjbG9zZWQKICAgICAgZWxpZiBbWyAkZXhpdF9jb2RlIC1lcSAxIF1dCiAgICAgIHRoZW4KICAgICAgICBwcmludF9saW5lPSQoKChwcmludF9saW5lKzEpJTIpKQogICAgICAgICNyZXR1cm4gY29kZSAzIG1lYW5zIHRoYXQgdGhlIHdob2xlIHhtbCBzZWdtZW50IGlzIHJldHVybmVkCiAgICAgICAgZXhpdF9jb2RlPTMKICAgICAgZmkKICAgIGZpCiAgICBbWyAkcHJpbnRfbGluZSA9PSAiMSIgXV0gJiYgZWNobyAiPCIkY2h1bmsKICBkb25lCiAgcmV0dXJuICRleGl0X2NvZGUKfQoKCiNjaGVjayByb290IHByaXZpbGVnZXMgYW5kIG5vbiBhIHJvb3QgdXNlciBiZWhpbmQKCltbICIkIyIgLWx0ICIyIiBdXSAmJiBlY2hvICJNaXNzaW5nIHBhcmFtZXRlcnMiICYmIHVzYWdlCmxvYWRfdmZfZHJpdmVyIGl4Z2JlCmxvYWRfdmZfZHJpdmVyIGk0MGUKCkhPU1RfTkFNRT1gY2F0IC9ldGMvaG9zdG5hbWVgCkZFQVRVUkVTPWBncmVwICJeZmxhZ3MiICAvcHJvYy9jcHVpbmZvYApGRUFUVVJFU19MSVNUPSIiCmlmIGVjaG8gJEZFQVRVUkVTIHwgZ3JlcCAtcSBwZHBlMWdiIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGxwcyI7ICBmaQppZiBlY2hvICRGRUFUVVJFUyB8IGdyZXAgLXEgZGNhICAgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxkaW9jIjsgZmkKaWYgZWNobyAkRkVBVFVSRVMgfCBlZ3JlcCAtcSAiKHZteHxzdm0pIiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSxod3N2IjsgZmkKaWYgZWNobyAkRkVBVFVSRVMgfCBlZ3JlcCAtcSAiKGVwdHxucHQpIiA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSx0bGJwcyI7IGZpCmlmIGVjaG8gJEZFQVRVUkVTIHwgZ3JlcCAtcSBodCAgICAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGh0IjsgICBmaQppZiB1bmFtZSAtbSB8IGdyZXAgLXEgeDg2XzY0ICAgICAgICA7IHRoZW4gRkVBVFVSRVNfTElTVD0iJHtGRUFUVVJFU19MSVNUfSw2NGIiOyAgZmkKaWYgY2F0IC92YXIvbG9nL2RtZXNnIHwgZ3JlcCAtcSAtZSBJbnRlbC1JT01NVSAgIDsgdGhlbiBGRUFUVVJFU19MSVNUPSIke0ZFQVRVUkVTX0xJU1R9LGlvbW11IjsgIGZpCkZFQVRVUkVTX0xJU1Q9JHtGRUFUVVJFU19MSVNUIyx9CgpOVU1BUz1gZ2F3ayAnQkVHSU57bnVtYXM9MDt9CiAgKCQxPT0icGh5c2ljYWwiICYmICQyPT0iaWQiICl7IGlmICgkNCsxPm51bWFzKXtudW1hcz0kNCsxfSB9OwogIEVORHtwcmludGYoIiVkIixudW1hcyk7fScgL3Byb2MvY3B1aW5mb2AKCkNQVVM9YGdhd2sgJygkMT09InByb2Nlc3NvciIpe3Bybz0kMzt9CiAgKCQxPT0icGh5c2ljYWwiICYmICQyPT0iaWQiKXsgcGh5PSQ0O30KICAoJDE9PSJjb3JlIiAmJiAkMj09ImlkIil7cHJpbnRmICIgJWQtJWQtJWQiLCBwaHksJDQscHJvO30nIC9wcm9jL2NwdWluZm9gCgppZiBncmVwIC1xIGlzb2xjcHVzIC9wcm9jL2NtZGxpbmUKdGhlbgogIGlzb2xjcHVzPWBjYXQgL3Byb2MvY21kbGluZWAKICBpc29sY3B1cz0ke2lzb2xjcHVzIyMqaXNvbGNwdXM9fQogIGlzb2xjcHVzPSR7aXNvbGNwdXMlJSAqfQogIGlzb2xjcHVzPSR7aXNvbGNwdXMvLywvIH0KZWxzZQogIGlzb2xjcHVzPSIiCmZpCgoKI29idGFpbiBpbnRlcmZhY2VzIGluZm9ybWF0aW9uCnVuc2V0IGRwaWQKcmVhZCAtcCAiRG8geW91IHdhbnQgdG8gcHJvdmlkZSB0aGUgaW50ZXJmYWNlcyBjb25uZWN0aXZpdHkgaW5mb3JtYXRpb24gKGRhdGFwYXRoaWQvZHBpZCBvZiB0aGUgc3dpdGNoIGFuZCBzd2l0Y2ggcG9ydCBpZCk/IFtZL25dICIgY29ubl9pbmZvCmNhc2UgJGNvbm5faW5mbyBpbgogICAgW05uXSogKSBwcm92X2Nvbm49ZmFsc2U7OwogICAgKiApIHByb3ZfY29ubj10cnVlOwogICAgICAgIHJlYWQgLXAgIldoYXQgaXMgdGhlIHN3aXRjaCBkYXBhcGF0aGlkL2RwZGk/ICgwMTowMjowMzowNDowNTowNjowNzowOCkgIiBkcGlkOwogICAgICAgIFtbIC16ICRkcGlkIF1dICYmIGRwaWQ9IjAxOjAyOjAzOjA0OjA1OjA2OjA3OjA4IjsKICAgICAgICBQT1JUX1JBTkRPTT0kUkFORE9NCiAgICAgICAgaWZhY2VfY291bnRlcj0wOzsKZXNhYyAgICAgICAKT0xESUZTPSRJRlMKSUZTPSQnXG4nCnVuc2V0IFBGX2xpc3QKdW5zZXQgVkZfbGlzdApmb3IgZGV2aWNlIGluIGB2aXJzaCBub2RlZGV2LWxpc3QgLS1jYXAgbmV0IHwgZ3JlcCAtdiBuZXRfbG9fMDBfMDBfMDBfMDBfMDBfMDBgCmRvCnZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkZGV2aWNlID4gZGV2aWNlX3htbApuYW1lPWB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2ludGVyZmFjZSIgPCBkZXZpY2VfeG1sYApuYW1lPSIke25hbWUvLyAvfSIKYWRkcmVzcz1geG1scGF0aF9hcmdzICJkZXZpY2UvY2FwYWJpbGl0eS9hZGRyZXNzIiA8IGRldmljZV94bWxgCmFkZHJlc3M9IiR7YWRkcmVzcy8vIC99IgpwYXJlbnQ9YHhtbHBhdGhfYXJncyAiZGV2aWNlL3BhcmVudCIgPCBkZXZpY2VfeG1sYApwYXJlbnQ9IiR7cGFyZW50Ly8gL30iCiN0aGUgZm9sbG93aW5nIGxpbmUgY3JlYXRlZCB2YXJpYWJsZXMgJ3NwZWVkJyBhbmQgJ3N0YXRlJwpldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2xpbmsiIDwgZGV2aWNlX3htbGAKdmlyc2ggbm9kZWRldi1kdW1weG1sICRwYXJlbnQgPiBwYXJlbnRfeG1sCmRyaXZlcj1geG1scGF0aF9hcmdzICJkZXZpY2UvZHJpdmVyL25hbWUiIDwgcGFyZW50X3htbGAKWyAkPyAtZXEgMSBdICYmIGRyaXZlcj0iTi9BIgpkcml2ZXI9IiR7ZHJpdmVyLy8gL30iCgojSWYgdGhlIGRldmljZSBpcyBub3QgdXAgdHJ5IHRvIGJyaW5nIGl0IHVwIGFuZCByZWxvYWQgc3RhdGUKaWYgW1sgJHN0YXRlID09ICdkb3duJyBdXSAmJiAoIFtbICRkcml2ZXIgPT0gIml4Z2JlIiBdXSB8fCBbWyAkZHJpdmVyID09ICJpNDBlIiBdXSApCnRoZW4KICA+JjIgZWNobyAiJG5hbWUgaXMgZG93bi4gVHJ5aW5nIHRvIGJyaW5nIGl0IHVwIgogIGlmY29uZmlnICRuYW1lIHVwCiAgc2xlZXAgMgogIHZpcnNoIG5vZGVkZXYtZHVtcHhtbCAkZGV2aWNlID4gZGV2aWNlX3htbAogIGV2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvbGluayIgPCBkZXZpY2VfeG1sYApmaQoKaWYgW1sgJHN0YXRlID09ICdkb3duJyBdXSAgJiYgKCBbWyAkZHJpdmVyID09ICJpeGdiZSIgXV0gfHwgW1sgJGRyaXZlciA9PSAiaTQwZSIgXV0gKQp0aGVuCiAgICA+JjIgZWNobyAiSW50ZXJmYWNlcyBtdXN0IGJlIGNvbm5lY3RlZCBhbmQgdXAgaW4gb3JkZXIgdG8gcHJvcGVybHkgZGV0ZWN0IHRoZSBzcGVlZC4gWW91IGNhbiBwcm92aWRlIHRoaXMgaW5mb3JtYXRpb24gbWFudWFsbHkgb3Igc2tpcCB0aGUgaW50ZXJmYWNlIgogICAga2VlcF9hc2tpbmc9dHJ1ZQogICAgc2tpcF9pbnRlcmZhY2U9dHJ1ZQogICAgdW5zZXQgc3BlZWQKICAgIHdoaWxlICRrZWVwX2Fza2luZzsgZG8KICAgICAgICByZWFkIC1wICJEbyB5b3Ugd2FudCB0byBza2lwIGludGVyZmFjZSAkbmFtZSAoJGFkZHJlc3MpIFt5L05dICIgLWkgIm4iIHNraXAKICAgICAgICBjYXNlICRza2lwIGluCiAgICAgICAgICAgIFtZeV0qICkga2VlcF9hc2tpbmc9ZmFsc2U7OwogICAgICAgICAgICAqICkgc2tpcF9pbnRlcmZhY2U9ZmFsc2U7CiAgICAgICAgICAgICAgICBkZWZhdWx0X3NwZWVkPSIxMDAwMCIKICAgICAgICAgICAgICAgIHdoaWxlICRrZWVwX2Fza2luZzsgZG8KICAgICAgICAgICAgICAgICAgIHJlYWQgLXAgIldoYXQgaXMgdGhlIHNwZWVkIG9mIHRoZSBpbnRlcmZhY2UgZXhwcmVzc2VkIGluIE1icHM/ICgkZGVmYXVsdF9zcGVlZCkgIiBzcGVlZDsKICAgICAgICAgICAgICAgICAgIFtbIC16ICRzcGVlZCBdXSAmJiBzcGVlZD0kZGVmYXVsdF9zcGVlZAogICAgICAgICAgICAgICAgICAgW1sgJHNwZWVkID1+ICcnfCpbITAtOV0gXV0gJiYgZWNobyAiVGhlIGlucHV0IG11c3QgYmUgYW4gaW50ZWdlciIgJiYgY29udGludWU7CiAgICAgICAgICAgICAgICAgICBrZWVwX2Fza2luZz1mYWxzZSA7CiAgICAgICAgICAgICAgICBkb25lOzsKICAgICAgICBlc2FjCiAgICBkb25lCgogICAkc2tpcF9pbnRlcmZhY2UgJiYgY29udGludWUKZmkKI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgJ25vZGUnIHZhcmlhYmxlCmV2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvbnVtYSIgPCBwYXJlbnRfeG1sYAojdGhlIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgdGhlIHZhcmlhYmxlICd0eXBlJwojaW4gY2FzZSB0aGUgaW50ZXJmYWNlIGlzIGEgUEYgdGhlIHZhbHVlIGlzICd2aXJ0X2Z1bmN0aW9ucycKI2luIGNhc2UgdGhlIGludGVyZmFjZSBpcyBhIFZGIHRoZSB2YWx1ZSBpcyAncGh5c19mdW5jdGlvbicKdHlwZT0iTi9BIgpldmFsIGB4bWxwYXRoX2FyZ3MgImRldmljZS9jYXBhYmlsaXR5L2NhcGFiaWxpdHkiIDwgcGFyZW50X3htbGAKI29idGFpbiBwY2kKI3RoZSBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIHRoZSB2YXJpYWJsZXMgJ2RvbWFpbicgJ2J1cycgJ3Nsb3QnIGFuZCAnZnVuY3Rpb24nCmV2YWwgYHhtbHBhdGhfYXJncyAiZGV2aWNlL2NhcGFiaWxpdHkvaW9tbXVHcm91cC9hZGRyZXNzIiA8IHBhcmVudF94bWxgCnBjaT0iJHtkb21haW4jKnh9OiR7YnVzIyp4fToke3Nsb3QjKnh9LiR7ZnVuY3Rpb24jKnh9Igp1bmRlcnNjb3JlZF9wY2k9IiR7cGNpLy9cOi9ffSIKdW5kZXJzY29yZWRfcGNpPSJwY2lfJHt1bmRlcnNjb3JlZF9wY2kvL1wuL199IgoKaWYgKCBbWyAkZHJpdmVyID09ICJpeGdiZSIgXV0gfHwgW1sgJGRyaXZlciA9PSAiaTQwZSIgXV0gKSAKdGhlbgogIHVuZGVyc2NvcmVkX3BjaT0icGYiJHVuZGVyc2NvcmVkX3BjaQogIFBGX2xpc3RbJHsjUEZfbGlzdFtAXX1dPSR1bmRlcnNjb3JlZF9wY2kKICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsibmFtZSJdPSRuYW1lCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJudW1hIl09JG5vZGUKICBldmFsICR1bmRlcnNjb3JlZF9wY2lbIm1hYyJdPSRhZGRyZXNzCiAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJzcGVlZCJdPSRzcGVlZAogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsicGNpIl09JHBjaQogICNyZXF1ZXN0IHN3aXRjaCBwb3J0IHRvIHRoZSB1c2VyIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMgYmVpbmcgcHJvdmlkZWQgYW5kIGluY2x1ZGUgaXQKICBpZiAgJHByb3ZfY29ubiAKICB0aGVuCiAgICB1bnNldCBzd2l0Y2hfcG9ydAogICAgcmVhZCAtcCAiV2hhdCBpcyB0aGUgcG9ydCBuYW1lIGluIHRoZSBzd2l0Y2ggJGRwaWQgd2hlcmUgcG9ydCAkbmFtZSAoJHBjaSkgaXMgY29ubmVjdGVkPyAoJHtuYW1lfS0ke1BPUlRfUkFORE9NfS8kaWZhY2VfY291bnRlcikgIiBzd2l0Y2hfcG9ydAogICAgW1sgLXogJHN3aXRjaF9wb3J0IF1dICYmIHN3aXRjaF9wb3J0PSIke25hbWV9LSR7UE9SVF9SQU5ET019LyRpZmFjZV9jb3VudGVyIgogICAgaWZhY2VfY291bnRlcj0kKChpZmFjZV9jb3VudGVyKzEpKQogICAgZXZhbCAkdW5kZXJzY29yZWRfcGNpWyJkcGlkIl09JGRwaWQKICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsic3dpdGNoX3BvcnQiXT0kc3dpdGNoX3BvcnQKICBmaQoKICAjQfFhZG8gZWwgcGNpIGRlIGNhZGEgdW5vIGRlIGxvcyBoaWpvcwogIFNSSU9WX2NvdW50ZXI9MAogIGZvciBjaGlsZCBpbiBgeG1scGF0aF9hcmdzICJkZXZpY2UvY2FwYWJpbGl0eS9jYXBhYmlsaXR5L2FkZHJlc3MiIDwgcGFyZW50X3htbGAKICBkbyAKICAgIFNSSU9WX2NvdW50ZXI9JCgoU1JJT1ZfY291bnRlcisxKSkKICAgICN0aGUgZm9sbG93aW5nIGxpbmUgY3JlYXRlcyB0aGUgdmFyaWFibGVzICdkb21haW4nICdidXMnICdzbG90JyBhbmQgJ2Z1bmN0aW9uJwogICAgZXZhbCAkY2hpbGQKICAgIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiU1JJT1YiJFNSSU9WX2NvdW50ZXJdPSIke2RvbWFpbiMqeH1fJHtidXMjKnh9XyR7c2xvdCMqeH1fJHtmdW5jdGlvbiMqeH0iCiAgZG9uZQogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsiU1JJT1YiXT0kU1JJT1ZfY291bnRlcgogIAojU2kgc2UgdHJhdGEgZGUgdW4gU1JJT1YgKHRpZW5lIHVuYSBjYXBhYmlsaXR5IGNvbiB0eXBlICdwaHlzX2Z1bmN0aW9uJykKZWxpZiBbWyAkdHlwZSA9PSAncGh5c19mdW5jdGlvbicgXV0KdGhlbgogIHVuZGVyc2NvcmVkX3BjaT0idmYiJHVuZGVyc2NvcmVkX3BjaQogIFZGX2xpc3RbJHsjVkZfbGlzdFtAXX1dPSR1bmRlcnNjb3JlZF9wY2kKICBldmFsIGRlY2xhcmUgLUEgJHVuZGVyc2NvcmVkX3BjaQogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsic291cmNlX25hbWUiXT0kbmFtZQogIGV2YWwgJHVuZGVyc2NvcmVkX3BjaVsibWFjIl09JGFkZHJlc3MKICBldmFsICR1bmRlcnNjb3JlZF9wY2lbInBjaSJdPSRwY2kKZmkKcm0gLWYgZGV2aWNlX3htbCBwYXJlbnRfeG1sCmRvbmUKSUZTPSRPTERJRlMKCmVjaG8gIiNUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgYnkgJDAiCmVjaG8gIiNmb3IgYWRkaW5nIHRoaXMgY29tcHV0ZSBub2RlIHRvIG9wZW52aW0iCmVjaG8gIiNjb3B5IHRoaXMgZmlsZSB0byBvcGVudmltIGNvbnRyb2xsZXIgYW5kIHJ1biIKZWNobyAiI29wZW52aW0gaG9zdC1hZGQgPHRoaXM+IgplY2hvCmVjaG8gImhvc3Q6IgplY2hvICIgIG5hbWU6ICAgICRIT1NUX05BTUUiCmVjaG8gIiAgdXNlcjogICAgJDEiCmVjaG8gIiAgaXBfbmFtZTogJDIiCmVjaG8gImhvc3QtZGF0YToiCmVjaG8gIiAgbmFtZTogICAgICAgICRIT1NUX05BTUUiCmVjaG8gIiAgdXNlcjogICAgICAgICQxIgplY2hvICIgIGlwX25hbWU6ICAgICAkMiIKZWNobyAiICByYW5raW5nOiAgICAgMTAwIgplY2hvICIgIGRlc2NyaXB0aW9uOiAkSE9TVF9OQU1FIgplY2hvICIgIGZlYXR1cmVzOiAgICAkRkVBVFVSRVNfTElTVCIKZWNobyAiICBudW1hczoiCgpudW1hPTAKd2hpbGUgW1sgJG51bWEgLWx0ICROVU1BUyBdXQpkbwogIGVjaG8gIiAgLSBudW1hX3NvY2tldDogICRudW1hIgojTUVNT1JZCiAgaWYgWyAtZiAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSR7bnVtYX0vaHVnZXBhZ2VzL2h1Z2VwYWdlcy0xMDQ4NTc2a0IvbnJfaHVnZXBhZ2VzIF0KICB0aGVuCiAgICBlY2hvICIgICAgaHVnZXBhZ2VzOiAiIGBjYXQgL3N5cy9kZXZpY2VzL3N5c3RlbS9ub2RlL25vZGUke251bWF9L2h1Z2VwYWdlcy9odWdlcGFnZXMtMTA0ODU3NmtCL25yX2h1Z2VwYWdlc2AKICBlbHNlCiAgICAjVE9ETyBodWdlcGFnZXMgb2YgMjA0OGtCIHNpemUKICAgIGVjaG8gIiAgICBodWdlcGFnZXM6ICAwIgogIGZpCiAgbWVtb3J5PWBoZWFkIC1uMSAvc3lzL2RldmljZXMvc3lzdGVtL25vZGUvbm9kZSR7bnVtYX0vbWVtaW5mbyAgfCBnYXdrICcoJDU9PSJrQiIpe3ByaW50ICQ0fSdgCiAgbWVtb3J5PSQoKG1lbW9yeSsxMDQ4NTc2LTEpKSAgICNtZW1vcnkgbXVzdCBiZSBjZWlsZWQKICBtZW1vcnk9JCgobWVtb3J5LzEwNDg1NzYpKSAgICNmcm9tIGBrQiB0byBHQgogIGVjaG8gIiAgICBtZW1vcnk6ICAgICRtZW1vcnkiCgojQ09SRVMKICBlY2hvICIgICAgY29yZXM6IgogIEZJUlNUPSItIiAjZmlyc3QgaXRlbSBpbiBhIGxpc3Qgc3RhcnQgd2l0aCAiLSIgaW4geWFtbCBmaWxlcywgdGhlbiBpdCB3aWxsIHNldCB0byAiICIKICBmb3IgY3B1IGluICRDUFVTCiAgZG8KICAgIFBIWVNJQ0FMPWBlY2hvICRjcHUgfCBjdXQgLWYgMSAtZCItImAKICAgIENPUkU9YGVjaG8gJGNwdSB8IGN1dCAtZiAyIC1kIi0iYAogICAgVEhSRUFEPWBlY2hvICRjcHUgfCBjdXQgLWYgMyAtZCItImAKICAgIFtbICRQSFlTSUNBTCAhPSAkbnVtYSBdXSAmJiBjb250aW51ZSAgICNza2lwIG5vbiBwaHlzaWNhbAogICAgZWNobyAiICAgIC0gY29yZV9pZDogICAkQ09SRSIKICAgIGVjaG8gIiAgICAgIHRocmVhZF9pZDogJFRIUkVBRCIKICAgICNjaGVjayBpZiBlbGlnaWJsZQogICAgY3B1X2lzb2xhdGVkPSJubyIKICAgIGZvciBpc29sY3B1IGluICRpc29sY3B1cwogICAgZG8KICAgICAgaXNvbGNwdV9zdGFydD1gZWNobyAkaXNvbGNwdSB8IGN1dCAtZiAxIC1kIi0iYAogICAgICBpc29sY3B1X2VuZD1gZWNobyAkaXNvbGNwdSB8IGN1dCAtZiAyIC1kIi0iYAogICAgICBpZiBbICIkVEhSRUFEIiAtZ2UgIiRpc29sY3B1X3N0YXJ0IiAtYSAiJFRIUkVBRCIgLWxlICIkaXNvbGNwdV9lbmQiIF0KICAgICAgdGhlbgogICAgICAgIGNwdV9pc29sYXRlZD0ieWVzIgogICAgICAgIGJyZWFrCiAgICAgIGZpCiAgICBkb25lCiAgICBbWyAkY3B1X2lzb2xhdGVkID09ICJubyIgXV0gJiYgICBlY2hvICIgICAgICBzdGF0dXM6ICAgIG5vdGVsaWdpYmxlIgogICAgRklSU1Q9IiAiCiAgZG9uZQogCiAgI05JQyBJTlRFUkZBQ0VTCiAgaW50ZXJmYWNlc19uYj0wCiAgZm9yICgoaT0wOyBpPCR7I1BGX2xpc3RbQF19O2krKykpCiAgZG8KICAgIHVuZGVyc2NvcmVkX3BjaT0ke1BGX2xpc3RbJGldfQogICAgcG5hbWU9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJuYW1lIikKICAgIHBudW1hPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibnVtYSIpCiAgICBbWyAkcG51bWEgIT0gJG51bWEgXV0gJiYgY29udGludWUgCiAgICBwbWFjPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibWFjIikKICAgIHBwY2k9JChnZXRfaGFzaF92YWx1ZSAkdW5kZXJzY29yZWRfcGNpICJwY2kiKQogICAgcHNwZWVkPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3BlZWQiKQogICAgcFNSSU9WPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAiU1JJT1YiKQogICAgW1sgJGludGVyZmFjZXNfbmIgLWVxIDAgXV0gJiYgZWNobyAiICAgIGludGVyZmFjZXM6IgogICAgaW50ZXJmYWNlc19uYj0kKChpbnRlcmZhY2VzX25iKzEpKQogICAgc3Jpb3ZfbmI9MAogICAgZWNobyAiICAgIC0gc291cmNlX25hbWU6ICRwbmFtZSIKICAgIGVjaG8gIiAgICAgIE1icHM6ICRwc3BlZWQiCiAgICBlY2hvICIgICAgICBwY2k6IFwiJHBwY2lcIiIKICAgIGVjaG8gIiAgICAgIG1hYzogXCIkcG1hY1wiIgogICAgaWYgJHByb3ZfY29ubiAKICAgICAgdGhlbgogICAgICAgIHBkcGlkPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAiZHBpZCIpCiAgICAgICAgcHN3aXRjaF9wb3J0PSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAic3dpdGNoX3BvcnQiKQogICAgICAgIGVjaG8gIiAgICAgIHN3aXRjaF9kcGlkOiAkcGRwaWQiCiAgICAgICAgZWNobyAiICAgICAgc3dpdGNoX3BvcnQ6ICRwc3dpdGNoX3BvcnQiCiAgICBmaQogICAgZm9yICgoaj0xO2o8PSRwU1JJT1Y7aisrKSkKICAgIGRvCiAgICAgIGNoaWxkU1JJT1Y9InZmcGNpXyIkKGdldF9oYXNoX3ZhbHVlICR1bmRlcnNjb3JlZF9wY2kgIlNSSU9WIiRqKQogICAgICBwbmFtZT0kKGdldF9oYXNoX3ZhbHVlICRjaGlsZFNSSU9WICJzb3VyY2VfbmFtZSIpCiAgICAgIGluZGV4PSR7cG5hbWUjIypffQogICAgICBwbWFjPSQoZ2V0X2hhc2hfdmFsdWUgJGNoaWxkU1JJT1YgIm1hYyIpCiAgICAgIHBwY2k9JChnZXRfaGFzaF92YWx1ZSAkY2hpbGRTUklPViAicGNpIikKICAgICAgW1sgJHNyaW92X25iIC1lcSAwIF1dICYmIGVjaG8gIiAgICAgIHNyaW92czoiCiAgICAgIHNyaW92X25iPSQoKHNyaW92X25iKzEpKQogICAgICBlY2hvICIgICAgICAtIG1hYzogXCIkcG1hY1wiIgogICAgICBlY2hvICIgICAgICAgIHBjaTogXCIkcHBjaVwiIgogICAgICBlY2hvICIgICAgICAgIHNvdXJjZV9uYW1lOiAkaW5kZXgiCiAgICBkb25lCiAgZG9uZQoKICBudW1hPSQoKG51bWErMSkpCmRvbmUKcmVtb3ZlX3ZmX2RyaXZlciBpeGdiZQpyZW1vdmVfdmZfZHJpdmVyIGk0MGUKI0JyaW5nIHVwIGFsbCBpbnRlcmZhY2VzCmZvciAoKGk9MDsgaTwkeyNQRl9saXN0W0BdfTtpKyspKQpkbwogIHVuZGVyc2NvcmVkX3BjaT0ke1BGX2xpc3RbJGldfQogIHBuYW1lPSQoZ2V0X2hhc2hfdmFsdWUgJHVuZGVyc2NvcmVkX3BjaSAibmFtZSIpCiAgaWZjb25maWcgJHBuYW1lIHVwCmRvbmUK