AAUWAAACAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAJAAAAPgAAACAAAAAKAAAAXgAAAAQAAAACAAAAYgAEW8Fyc3JjUlNFRAEAAHUAuQAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAEAAARQbwAET28AAAtS2nkBbwggEgFgLjvlAQA85dHlAQA0E6mLQmcfPKPltV0NdGtweXRob24ucnNyYy5jcmNwb29sZXJ0QUQgTUVybAAAcnNyY1JTRUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyY3SpAAAAAAADsDC7AX5/GD1HAAouH05eIF9UT07QTlaTkCAdAT4obwEQLk0EZxpwQrBHbBDgeAKB/ABC7wXP/ABCYFx+QmBY4VABCVrgAZBfVuFQAQpCEjIfIB94AYHB7ykBbxzhUAMKQjAf5UBW4VAVCVoyHyAfPgHeQAFgGuFQAQpC4AHB31bhUCAhAAAAIQCoABQAuwEsAAABAABQAIQD8AAAAAAKRmlsZSBUeXBlOgAAAPKAAQAAAGAAAACSAAAAAAAAAAAAAAGAGnAmSCZKEk0SSWgJmAGIAkACIAIgBBAECAgECAQIAYAb8D/4P/of/x//b//////+f/4//j/8H/wP+Af4B/gACAAIAAAAAAAAAAAAAAAAgAQAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAACAAEAAgAAAAAAAADSAAAAAAADwAADzX8ADX11wA19dcwDXXX3A1111zzVVdfX1VVX1dVVXDVVVVwNVVVcDVVVcANVVXAA1VXAADVVwAA1VcAAAAAAAAAAAgAA////////AAH//8zMmZkAAwAAAAAAAAAAAPKAAQAAAGAAAACSAAAAAAAAAAAAAAAAAAAAAAAADbASTBAKCAIYAiACIAIgBBAECAgECAQIAAAAAAAAAAANsB/8H/4P/h/+P/4//j/8H/wP+Af4B/gACAAIAAAAAAAAAAAAAAAAgAQAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAACAAEAAgAAAAAAAADSAAAAAAAAAAAAAAAAAAAAAAAAAAAA888AA1118ANVVdwA1VVcA9VVXA1VVVwNVVVcDVVVcANVVXAA1VXAADVVwAA1VcAAAAAAAAAAAgAA////////AAH//8zMmZkAAwAAAAAAAAAAAVqAAQAAAGAAAACSAAAAAAAAAAAAAAAAAAAAAAAAAQADwIRg//8AGAAgAED/wAAAAAAAAAAAAAAAAAAAAAABAAPAh+D////4/+D/wP/AAAAAAAAAAAAABwAPAAAAAAAAAAAAAAAAgAgAAAAAABAAEAAAAAAAAAAAAEgAAABIAAAAAAAEAAEABAAAAAAAAAESAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAAAD//wAAAPAADzIl8AAAb/////////8iIiIiIh/wACIiIiIh8AAAMzMzM08AAAD//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAP///////wABu7u7u7u7AALu7u7u7u4AA93d3d3d3QAEzMzMzMzMAAVEREREREQABhEREREREQAPAAAAAAAAAAABWoABAAAAYAAAAJIAAAAAAAAAAAAAH/gzzGRmSZJPEkQiY8Y//CmUKZQplCvUaZZ4Hn/+f/4f+D/8f/5//n/+f/5//j/8P/w//D/8P/x//n/+f/5//gAEAAgAAAAAAAAAAAAAAACACAAAAAAAEAAQAAAAAAAAAAAASAAAAEgAAAAAAAQAAQAEAAAAAAAAARIAAAAAAA//////8AAA9gX//1BvAA9gXwBW9QbwDwDwIfMPAPAPAPbxAA8A8A8AXwAA9QDwD2AF//9QBvAA////////AADw8AEQDw8AAPDwARAPDwAA8PAhEg8PAADw8B/xDw8AD/DwIRIPD/AP9PUAAF9P8A/////////wD/////////AAAAAAAAAABwAA////////AAFEREREREQAAqqqqqqqqgAD7u7u7u7uAARVVVVVVVUABd3d3d3d3QAGd3d3d3d3AA8AAAAAAAAAAAFSgAEAAABgAAAAkgAAAAAAAAAAAAAD+AwGEAEcBzP5cAHQAZABlg3aVXpVNu0QoRABCAIH/AP4D/4f/x//P/9/////////////f/8//x//H/8P/gf8AAQAAwAAAAAAAAAAAAAAAIAIAAAAAAAQABAAAAAAAAAAAABIAAAASAAAAAAABAABAAQAAAAAAAABEgAAAAAAAAD////wAAAA/0IiIk/wAA9CIRERIk8AD/8REREf/wD/JP////QvD18iIiIiIi/1LyIiIiIiL/QPIiIiIiIv9A9P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RP//1VWqq9VVoAvQBaAL0AWgC9AFoAvQBaqr1VWqq//////////////wD/AP8A/wD/AP8A/wD/AP//////////8ABwAHAAAARAAAP/wf+E/yZ+Zzznmef/5//nmec85n5k/yH/g//AAAf/5//v///////////////////////////////3/+f/4ABwAGAAAARAAACAAMAA4ADwAPgA/AD+AP8A+ADYAIwADAAGAAYAAAGAAcAB4AHwAfgB/AH+Af8B/4H/wfwB3gGeAQ8ADwAHAAAQAEAAAARAAAYABgAGCAYQBiAGQAb/xkAGIAYQBggGAAYAAAAAAAAAAAAAAAAIABAAIABAAP/AQAAgABAACAAAAAAAAAAAAABwAEAAAARAAADAAMAAwADAAMAAwAD/gP+AwADAAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAEAAAARIACf/x//ERERVRFVEVURVRERH/8f/x//H/8f/x//IAC//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//4ABAADAAAARAAAAAAAAAwADAAMAAwADAAMAAwAD/gP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAEAAAARAAAAAAAAAAwADAAMAAwADAAMAAwH/Af8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwALAAAARAOAHvACgIEAQ4ckSx1wBUAEQAKABEAJIBKQFFB4PPg/A4Af8AOAgQBDhyfLH/AHwAfAA4AHwA/gHvAccHg8+D8AAQAHAAAARIACf/x//EREVFRUVFRUVFRERH/8f/x//H/8f/x//IAC//7//v/+//7//v/+//7//v/+//7//v/+//7//v/+//4ABAAHAAAARAYAAQABgA/wEAgX6BQoFCgX6BAIEAgQCBAIEAgQCA/wBgABAAGAD/Af+B/4H/gf+B/4H/gf+B/4H/gf+B/4D/AAAAAAAAAARAAAAPAAiAEIAZACcAIgBEAEQAiACIARAB4AHAAYABAAAAAA8AD4AfgB8APwA+AHwAfAD4APgB8AHgAcABgAEAAADwADAAAARAPAB+AP8BmYGZgP8AfgA8BDwkPDIYQcOAPAD/F4H0ACB+AP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ZGlyZWN0b3J5IHRvIHRoZSBlbmQgb2YgdGhlIGF1dG8tbG9hZCBzZWFyY2ggcGF0aCwgaWYgaXQKIyBpc24ndCBhbHJlYWR5IG9uIHRoZSBwYXRoOgoKaWYge1tpbmZvIGV4aXN0cyBhdXRvX3BhdGhdICYmIFtzdHJpbmcgY29tcGFyZSB7fSAkdGtfbGlicmFyeV0gJiYgXAoJW2xzZWFyY2ggLWV4YWN0ICRhdXRvX3BhdGggJHRrX2xpYnJhcnldIDwgMH0gewogICAgbGFwcGVuZCBhdXRvX3BhdGggJHRrX2xpYnJhcnkKfQoKIyBUdXJuIG9mZiBzdHJpY3QgTW90aWYgbG9vayBhbmQgZmVlbCBhcyBhIGRlZmF1bHQuCgpzZXQgdGtfc3RyaWN0TW90aWYgMAoKIyBDcmVhdGUgYSA6OnRrIG5hbWVzcGFjZQoKbmFtZXNwYWNlIGV2YWwgOjp0ayB7Cn0KCiMgOjp0azo6UGxhY2VXaW5kb3cgLS0KIyAgIHBsYWNlIGEgdG9wbGV2ZWwgYXQgYSBwYXJ0aWN1bGFyIHBvc2l0aW9uCiMgQXJndW1lbnRzOgojICAgdG9wbGV2ZWwJbmFtZSBvZiB0b3BsZXZlbCB3aW5kb3cKIyAgID9wbGFjZW1lbnQ/CXBvaW50ZXIgP2NlbnRlcj8gOyBwbGFjZXMgJHcgY2VudGVyZWQgb24gdGhlIHBvaW50ZXIKIwkJd2lkZ2V0IHdpZGdldFBhdGggOyBjZW50ZXJzICR3IG92ZXIgd2lkZ2V0X25hbWUKIwkJZGVmYXVsdHMgdG8gcGxhY2luZyB0b3BsZXZlbCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4KIyAgID9hbmNob3I/CWNlbnRlciBvciB3aWRnZXRQYXRoCiMgUmVzdWx0czoKIyAgIFJldHVybnMgbm90aGluZwojCnByb2MgOjp0azo6UGxhY2VXaW5kb3cge3cge3BsYWNlICIifSB7YW5jaG9yICIifX0gewogICAgd20gd2l0aGRyYXcgJHcKICAgIHVwZGF0ZSBpZGxldGFza3MKICAgIHNldCBjaGVja0JvdW5kcyAxCiAgICBpZiB7W3N0cmluZyBlcXVhbCAtbGVuIFtzdHJpbmcgbGVuZ3RoICRwbGFjZV0gJHBsYWNlICJwb2ludGVyIl19IHsKCSMjIHBsYWNlIGF0IFBPSU5URVIgKGNlbnRlcmVkIGlmICRhbmNob3IgPT0gY2VudGVyKQoJaWYge1tzdHJpbmcgZXF1YWwgLWxlbiBbc3RyaW5nIGxlbmd0aCAkYW5jaG9yXSAkYW5jaG9yICJjZW50ZXIiXX0gewoJICAgIHNldCB4IFtleHByIHtbd2luZm8gcG9pbnRlcnggJHddLVt3aW5mbyByZXF3aWR0aCAkd10vMn1dCgkgICAgc2V0IHkgW2V4cHIge1t3aW5mbyBwb2ludGVyeSAkd10tW3dpbmZvIHJlcWhlaWdodCAkd10vMn1dCgl9IGVsc2UgewoJICAgIHNldCB4IFt3aW5mbyBwb2ludGVyeCAkd10KCSAgICBzZXQgeSBbd2luZm8gcG9pbnRlcnkgJHddCgl9CiAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAtbGVuIFtzdHJpbmcgbGVuZ3RoICRwbGFjZV0gJHBsYWNlICJ3aWRnZXQiXSAmJiBcCgkgICAgW3dpbmZvIGV4aXN0cyAkYW5jaG9yXSAmJiBbd2luZm8gaXNtYXBwZWQgJGFuY2hvcl19IHsKCSMjIGNlbnRlciBhYm91dCBXSURHRVQgJGFuY2hvciwgd2lkZ2V0IG11c3QgYmUgbWFwcGVkCglzZXQgeCBbZXhwciB7W3dpbmZvIHJvb3R4ICRhbmNob3JdICsgXAoJCShbd2luZm8gd2lkdGggJGFuY2hvcl0tW3dpbmZvIHJlcXdpZHRoICR3XSkvMn1dCglzZXQgeSBbZXhwciB7W3dpbmZvIHJvb3R5ICRhbmNob3JdICsgXAoJCShbd2luZm8gaGVpZ2h0ICRhbmNob3JdLVt3aW5mbyByZXFoZWlnaHQgJHddKS8yfV0KICAgIH0gZWxzZSB7CglzZXQgeCBbZXhwciB7KFt3aW5mbyBzY3JlZW53aWR0aCAkd10tW3dpbmZvIHJlcXdpZHRoICR3XSkvMn1dCglzZXQgeSBbZXhwciB7KFt3aW5mbyBzY3JlZW5oZWlnaHQgJHddLVt3aW5mbyByZXFoZWlnaHQgJHddKS8yfV0KCXNldCBjaGVja0JvdW5kcyAwCiAgICB9CiAgICBpZiB7JGNoZWNrQm91bmRzfSB7CglpZiB7JHggPCAwfSB7CgkgICAgc2V0IHggMAoJfSBlbHNlaWYgeyR4ID4gKFt3aW5mbyBzY3JlZW53aWR0aCAkd10tW3dpbmZvIHJlcXdpZHRoICR3XSl9IHsKCSAgICBzZXQgeCBbZXhwciB7W3dpbmZvIHNjcmVlbndpZHRoICR3XS1bd2luZm8gcmVxd2lkdGggJHddfV0KCX0KCWlmIHskeSA8IDB9IHsKCSAgICBzZXQgeSAwCgl9IGVsc2VpZiB7JHkgPiAoW3dpbmZvIHNjcmVlbmhlaWdodCAkd10tW3dpbmZvIHJlcWhlaWdodCAkd10pfSB7CgkgICAgc2V0IHkgW2V4cHIge1t3aW5mbyBzY3JlZW5oZWlnaHQgJHddLVt3aW5mbyByZXFoZWlnaHQgJHddfV0KCX0KICAgIH0KICAgIHdtIGdlb21ldHJ5ICR3ICskeCskeQogICAgd20gZGVpY29uaWZ5ICR3Cn0KCiMgOjp0azo6U2V0Rm9jdXNHcmFiIC0tCiMgICBzd2FwIG91dCBjdXJyZW50IGZvY3VzIGFuZCBncmFiIHRlbXBvcmFyaWx5IChmb3IgZGlhbG9ncykKIyBBcmd1bWVudHM6CiMgICBncmFiCW5ldyB3aW5kb3cgdG8gZ3JhYgojICAgZm9jdXMJd2luZG93IHRvIGdpdmUgZm9jdXMgdG8KIyBSZXN1bHRzOgojICAgUmV0dXJucyBub3RoaW5nCiMKcHJvYyA6OnRrOjpTZXRGb2N1c0dyYWIge2dyYWIge2ZvY3VzIHt9fX0gewogICAgc2V0IGluZGV4ICIkZ3JhYiwkZm9jdXMiCiAgICB1cHZhciA6OnRrOjpGb2N1c0dyYWIoJGluZGV4KSBkYXRhCgogICAgbGFwcGVuZCBkYXRhIFtmb2N1c10KICAgIHNldCBvbGRHcmFiIFtncmFiIGN1cnJlbnQgJGdyYWJdCiAgICBsYXBwZW5kIGRhdGEgJG9sZEdyYWIKICAgIGlmIHtbd2luZm8gZXhpc3RzICRvbGRHcmFiXX0gewoJbGFwcGVuZCBkYXRhIFtncmFiIHN0YXR1cyAkb2xkR3JhYl0KICAgIH0KICAgIGdyYWIgJGdyYWIKICAgIGlmIHtbd2luZm8gZXhpc3RzICRmb2N1c119IHsKCWZvY3VzICRmb2N1cwogICAgfQp9CgojIDo6dGs6OlJlc3RvcmVGb2N1c0dyYWIgLS0KIyAgIHJlc3RvcmUgb2xkIGZvY3VzIGFuZCBncmFiIChmb3IgZGlhbG9ncykKIyBBcmd1bWVudHM6CiMgICBncmFiCXdpbmRvdyB0aGF0IGhhZCB0YWtlbiBncmFiCiMgICBmb2N1cwl3aW5kb3cgdGhhdCBoYWQgdGFrZW4gZm9jdXMKIyAgIGRlc3Ryb3kJZGVzdHJveXx3aXRoZHJhdyAtIGhvdyB0byBoYW5kbGUgdGhlIG9sZCBncmFiYmVkIHdpbmRvdwojIFJlc3VsdHM6CiMgICBSZXR1cm5zIG5vdGhpbmcKIwpwcm9jIDo6dGs6OlJlc3RvcmVGb2N1c0dyYWIge2dyYWIgZm9jdXMge2Rlc3Ryb3kgZGVzdHJveX19IHsKICAgIHNldCBpbmRleCAiJGdyYWIsJGZvY3VzIgogICAgZm9yZWFjaCB7b2xkRm9jdXMgb2xkR3JhYiBvbGRTdGF0dXN9ICQ6OnRrOjpGb2N1c0dyYWIoJGluZGV4KSB7IGJyZWFrIH0KICAgIHVuc2V0IDo6dGs6OkZvY3VzR3JhYigkaW5kZXgpCgogICAgY2F0Y2gge2ZvY3VzICRvbGRGb2N1c30KICAgIGdyYWIgcmVsZWFzZSAkZ3JhYgogICAgaWYge1tzdHJpbmcgZXF1YWwgJGRlc3Ryb3kgIndpdGhkcmF3Il19IHsKCXdtIHdpdGhkcmF3ICRncmFiCiAgICB9IGVsc2UgewoJZGVzdHJveSAkZ3JhYgogICAgfQogICAgaWYge1t3aW5mbyBleGlzdHMgJG9sZEdyYWJdICYmIFt3aW5mbyBpc21hcHBlZCAkb2xkR3JhYl19IHsKCWlmIHtbc3RyaW5nIGVxdWFsICRvbGRTdGF0dXMgImdsb2JhbCJdfSB7CgkgICAgZ3JhYiAtZ2xvYmFsICRvbGRHcmFiCgl9IGVsc2UgewoJICAgIGdyYWIgJG9sZEdyYWIKCX0KICAgIH0KfQoKIyB0a1NjcmVlbkNoYW5nZWQgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIGJ5IHRoZSBiaW5kaW5nIG1lY2hhbmlzbSB3aGVuZXZlciB0aGUKIyAiY3VycmVudCIgc2NyZWVuIGlzIGNoYW5naW5nLiAgVGhlIHByb2NlZHVyZSBkb2VzIHR3byB0aGluZ3MuCiMgRmlyc3QsIGl0IHVzZXMgInVwdmFyIiB0byBtYWtlIGdsb2JhbCB2YXJpYWJsZSAidGtQcml2IiBwb2ludCBhdCBhbgojIGFycmF5IHZhcmlhYmxlIHRoYXQgaG9sZHMgc3RhdGUgZm9yIHRoZSBjdXJyZW50IGRpc3BsYXkuICBTZWNvbmQsCiMgaXQgaW5pdGlhbGl6ZXMgdGhlIGFycmF5IGlmIGl0IGRpZG4ndCBhbHJlYWR5IGV4aXN0LgojCiMgQXJndW1lbnRzOgojIHNjcmVlbiAtCQlUaGUgbmFtZSBvZiB0aGUgbmV3IHNjcmVlbi4KCnByb2MgdGtTY3JlZW5DaGFuZ2VkIHNjcmVlbiB7CiAgICBzZXQgeCBbc3RyaW5nIGxhc3QgLiAkc2NyZWVuXQogICAgaWYgeyR4ID4gMH0gewoJc2V0IGRpc3AgW3N0cmluZyByYW5nZSAkc2NyZWVuIDAgW2V4cHIgeyR4IC0gMX1dXQogICAgfSBlbHNlIHsKCXNldCBkaXNwICRzY3JlZW4KICAgIH0KCiAgICB1cGxldmVsICMwIHVwdmFyICMwIHRrUHJpdi4kZGlzcCB0a1ByaXYKICAgIGdsb2JhbCB0a1ByaXYKICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KCiAgICBpZiB7W2luZm8gZXhpc3RzIHRrUHJpdl19IHsKCXNldCB0a1ByaXYoc2NyZWVuKSAkc2NyZWVuCglyZXR1cm4KICAgIH0KICAgIGFycmF5IHNldCB0a1ByaXYgewoJYWN0aXZlTWVudQl7fQoJYWN0aXZlSXRlbQl7fQoJYWZ0ZXJJZAkJe30KCWJ1dHRvbnMJCTAKCWJ1dHRvbldpbmRvdwl7fQoJZHJhZ2dpbmcJMAoJZm9jdXMJCXt9CglncmFiCQl7fQoJaW5pdFBvcwkJe30KCWluTWVudWJ1dHRvbgl7fQoJbGlzdGJveFByZXYJe30KCW1lbnVCYXIJCXt9Cgltb3VzZU1vdmVkCTAKCW9sZEdyYWIJCXt9Cglwb3B1cAkJe30KCXBvc3RlZE1iCXt9CglwcmVzc1gJCTAKCXByZXNzWQkJMAoJcHJldlBvcwkJMAoJc2VsZWN0TW9kZQljaGFyCiAgICB9CiAgICBzZXQgdGtQcml2KHNjcmVlbikgJHNjcmVlbgogICAgc2V0IHRrUHJpdih0ZWFyb2ZmKSBbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il0KICAgIHNldCB0a1ByaXYod2luZG93KSB7fQp9CgojIERvIGluaXRpYWwgc2V0dXAgZm9yIHRrUHJpdiwgc28gdGhhdCBpdCBpcyBhbHdheXMgYm91bmQgdG8gc29tZXRoaW5nCiMgKG90aGVyd2lzZSwgaWYgc29tZW9uZSByZWZlcmVuY2VzIGl0LCBpdCBtYXkgZ2V0IHNldCB0byBhIG5vbi11cHZhci1lZAojIHZhbHVlLCB3aGljaCB3aWxsIGNhdXNlIHRyb3VibGUgbGF0ZXIpLgoKdGtTY3JlZW5DaGFuZ2VkIFt3aW5mbyBzY3JlZW4gLl0KCiMgdGtFdmVudE1vdGlmQmluZGluZ3MgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIGFzIGEgdHJhY2Ugd2hlbmV2ZXIgdGtfc3RyaWN0TW90aWYgaXMKIyBjaGFuZ2VkLiAgSXQgaXMgdXNlZCB0byB0dXJuIG9uIG9yIHR1cm4gb2ZmIHRoZSBtb3RpZiB2aXJ0dWFsCiMgYmluZGluZ3MuCiMKIyBBcmd1bWVudHM6CiMgbjEgLSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgY2hhbmdlZCAoInRrX3N0cmljdE1vdGlmIikuCgpwcm9jIHRrRXZlbnRNb3RpZkJpbmRpbmdzIHtuMSBkdW1teSBkdW1teX0gewogICAgdXB2YXIgJG4xIG5hbWUKICAgIAogICAgaWYgeyRuYW1lfSB7CglzZXQgb3AgZGVsZXRlCiAgICB9IGVsc2UgewoJc2V0IG9wIGFkZAogICAgfQoKICAgIGV2ZW50ICRvcCA8PEN1dD4+IDxDb250cm9sLUtleS13PgogICAgZXZlbnQgJG9wIDw8Q29weT4+IDxNZXRhLUtleS13PiAKICAgIGV2ZW50ICRvcCA8PFBhc3RlPj4gPENvbnRyb2wtS2V5LXk+Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGVmaW5lIGNvbW1vbiBkaWFsb2dzIG9uIHBsYXRmb3JtcyB3aGVyZSB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQgCiMgdXNpbmcgY29tcGlsZWQgY29kZS4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmIHtbc3RyaW5nIGVxdWFsIFtpbmZvIGNvbW1hbmRzIHRrX2Nob29zZUNvbG9yXSAiIl19IHsKICAgIHByb2MgdGtfY2hvb3NlQ29sb3Ige2FyZ3N9IHsKCXJldHVybiBbZXZhbCB0a0NvbG9yRGlhbG9nICRhcmdzXQogICAgfQp9CmlmIHtbc3RyaW5nIGVxdWFsIFtpbmZvIGNvbW1hbmRzIHRrX2dldE9wZW5GaWxlXSAiIl19IHsKICAgIHByb2MgdGtfZ2V0T3BlbkZpbGUge2FyZ3N9IHsKCWlmIHskOjp0a19zdHJpY3RNb3RpZn0gewoJICAgIHJldHVybiBbZXZhbCB0a01vdGlmRkRpYWxvZyBvcGVuICRhcmdzXQoJfSBlbHNlIHsKCSAgICByZXR1cm4gW2V2YWwgdGtGRGlhbG9nIG9wZW4gJGFyZ3NdCgl9CiAgICB9Cn0KaWYge1tzdHJpbmcgZXF1YWwgW2luZm8gY29tbWFuZHMgdGtfZ2V0U2F2ZUZpbGVdICIiXX0gewogICAgcHJvYyB0a19nZXRTYXZlRmlsZSB7YXJnc30gewoJaWYgeyQ6OnRrX3N0cmljdE1vdGlmfSB7CgkgICAgcmV0dXJuIFtldmFsIHRrTW90aWZGRGlhbG9nIHNhdmUgJGFyZ3NdCgl9IGVsc2UgewoJICAgIHJldHVybiBbZXZhbCB0a0ZEaWFsb2cgc2F2ZSAkYXJnc10KCX0KICAgIH0KfQppZiB7W3N0cmluZyBlcXVhbCBbaW5mbyBjb21tYW5kcyB0a19tZXNzYWdlQm94XSAiIl19IHsKICAgIHByb2MgdGtfbWVzc2FnZUJveCB7YXJnc30gewoJcmV0dXJuIFtldmFsIHRrTWVzc2FnZUJveCAkYXJnc10KICAgIH0KfQppZiB7W3N0cmluZyBlcXVhbCBbaW5mbyBjb21tYW5kIHRrX2Nob29zZURpcmVjdG9yeV0gIiJdfSB7CiAgICBwcm9jIHRrX2Nob29zZURpcmVjdG9yeSB7YXJnc30gewoJcmV0dXJuIFtldmFsIDo6dGs6OmRpYWxvZzo6Y2hvb3NlRGlyOjp0a0Nob29zZURpcmVjdG9yeSAkYXJnc10KICAgIH0KfQoJCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGVmaW5lIHRoZSBzZXQgb2YgY29tbW9uIHZpcnR1YWwgZXZlbnRzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3dpdGNoICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pIHsKICAgICJ1bml4IiB7CglldmVudCBhZGQgPDxDdXQ+PiA8Q29udHJvbC1LZXkteD4gPEtleS1GMjA+IAoJZXZlbnQgYWRkIDw8Q29weT4+IDxDb250cm9sLUtleS1jPiA8S2V5LUYxNj4KCWV2ZW50IGFkZCA8PFBhc3RlPj4gPENvbnRyb2wtS2V5LXY+IDxLZXktRjE4PgoJZXZlbnQgYWRkIDw8UGFzdGVTZWxlY3Rpb24+PiA8QnV0dG9uUmVsZWFzZS0yPgoJIyBTb21lIE9TJ3MgZGVmaW5lIGEgZ29vZnkgKGFzIGluLCBub3QgPFNoaWZ0LVRhYj4pIGtleXN5bQoJIyB0aGF0IGlzIHJldHVybmVkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyA8U2hpZnQtVGFiPi4gIEluIG9yZGVyIGZvcgoJIyB0YWIgdHJhdmVyc2FsIHRvIHdvcmssIHdlIGhhdmUgdG8gYWRkIHRoZXNlIGtleXN5bXMgdG8gdGhlIAoJIyBQcmV2V2luZG93IGV2ZW50LgoJIyBUaGUgaW5mbyBleGlzdHMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRjbF9wbGF0Zm9ybShvcykgZG9lc24ndAoJIyBleGlzdCBpbiBzYWZlIGludGVycHJldGVycy4KCWlmIHtbaW5mbyBleGlzdHMgdGNsX3BsYXRmb3JtKG9zKV19IHsKCSAgICBzd2l0Y2ggJHRjbF9wbGF0Zm9ybShvcykgewoJCSJJUklYIiAgLQoJCSJMaW51eCIgeyBldmVudCBhZGQgPDxQcmV2V2luZG93Pj4gPElTT19MZWZ0X1RhYj4gfQoJCSJIUC1VWCIgeyBldmVudCBhZGQgPDxQcmV2V2luZG93Pj4gPGhwQmFja1RhYj4gfQoJICAgIH0KCX0KCXRyYWNlIHZhcmlhYmxlIHRrX3N0cmljdE1vdGlmIHcgdGtFdmVudE1vdGlmQmluZGluZ3MKCXNldCB0a19zdHJpY3RNb3RpZiAkdGtfc3RyaWN0TW90aWYKICAgIH0KICAgICJ3aW5kb3dzIiB7CglldmVudCBhZGQgPDxDdXQ+PiA8Q29udHJvbC1LZXkteD4gPFNoaWZ0LUtleS1EZWxldGU+CglldmVudCBhZGQgPDxDb3B5Pj4gPENvbnRyb2wtS2V5LWM+IDxDb250cm9sLUtleS1JbnNlcnQ+CglldmVudCBhZGQgPDxQYXN0ZT4+IDxDb250cm9sLUtleS12PiA8U2hpZnQtS2V5LUluc2VydD4KCWV2ZW50IGFkZCA8PFBhc3RlU2VsZWN0aW9uPj4gPEJ1dHRvblJlbGVhc2UtMj4KICAgIH0KICAgICJtYWNpbnRvc2giIHsKCWV2ZW50IGFkZCA8PEN1dD4+IDxDb250cm9sLUtleS14PiA8S2V5LUYyPiAKCWV2ZW50IGFkZCA8PENvcHk+PiA8Q29udHJvbC1LZXktYz4gPEtleS1GMz4KCWV2ZW50IGFkZCA8PFBhc3RlPj4gPENvbnRyb2wtS2V5LXY+IDxLZXktRjQ+CglldmVudCBhZGQgPDxQYXN0ZVNlbGVjdGlvbj4+IDxCdXR0b25SZWxlYXNlLTI+CglldmVudCBhZGQgPDxDbGVhcj4+IDxDbGVhcj4KICAgIH0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUmVhZCBpbiBmaWxlcyB0aGF0IGRlZmluZSBhbGwgb2YgdGhlIGNsYXNzIGJpbmRpbmdzLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdICYmIFwKCVtzdHJpbmcgY29tcGFyZSB7fSAkdGtfbGlicmFyeV19IHsKICAgIHNvdXJjZSBbZmlsZSBqb2luICR0a19saWJyYXJ5IGJ1dHRvbi50Y2xdCiAgICBzb3VyY2UgW2ZpbGUgam9pbiAkdGtfbGlicmFyeSBlbnRyeS50Y2xdCiAgICBzb3VyY2UgW2ZpbGUgam9pbiAkdGtfbGlicmFyeSBsaXN0Ym94LnRjbF0KICAgIHNvdXJjZSBbZmlsZSBqb2luICR0a19saWJyYXJ5IG1lbnUudGNsXQogICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgc2NhbGUudGNsXQogICAgc291cmNlIFtmaWxlIGpvaW4gJHRrX2xpYnJhcnkgc2NybGJhci50Y2xdCiAgICBzb3VyY2UgW2ZpbGUgam9pbiAkdGtfbGlicmFyeSB0ZXh0LnRjbF0KfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRGVmYXVsdCBiaW5kaW5ncyBmb3Iga2V5Ym9hcmQgdHJhdmVyc2FsLgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmV2ZW50IGFkZCA8PFByZXZXaW5kb3c+PiA8U2hpZnQtVGFiPgpiaW5kIGFsbCA8VGFiPiB7dGtUYWJUb1dpbmRvdyBbdGtfZm9jdXNOZXh0ICVXXX0KYmluZCBhbGwgPDxQcmV2V2luZG93Pj4ge3RrVGFiVG9XaW5kb3cgW3RrX2ZvY3VzUHJldiAlV119CgojIHRrQ2FuY2VsUmVwZWF0IC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBjYW5jZWwgYW4gYXV0by1yZXBlYXQgYWN0aW9uIGRlc2NyaWJlZAojIGJ5IHRrUHJpdihhZnRlcklkKS4gIEl0J3MgdXNlZCBieSBzZXZlcmFsIHdpZGdldHMgdG8gYXV0by1zY3JvbGwKIyB0aGUgd2lkZ2V0IHdoZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgb3V0IG9mIHRoZSB3aWRnZXQgd2l0aCBhCiMgYnV0dG9uIHByZXNzZWQuCiMKIyBBcmd1bWVudHM6CiMgTm9uZS4KCnByb2MgdGtDYW5jZWxSZXBlYXQge30gewogICAgZ2xvYmFsIHRrUHJpdgogICAgYWZ0ZXIgY2FuY2VsICR0a1ByaXYoYWZ0ZXJJZCkKICAgIHNldCB0a1ByaXYoYWZ0ZXJJZCkge30KfQoKIyB0a1RhYlRvV2luZG93IC0tCiMgVGhpcyBwcm9jZWR1cmUgbW92ZXMgdGhlIGZvY3VzIHRvIHRoZSBnaXZlbiB3aWRnZXQuICBJZiB0aGUgd2lkZ2V0CiMgaXMgYW4gZW50cnksIGl0IHNlbGVjdHMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgd2lkZ2V0LgojCiMgQXJndW1lbnRzOgojIHcgLSBXaW5kb3cgdG8gd2hpY2ggZm9jdXMgc2hvdWxkIGJlIHNldC4KCnByb2MgdGtUYWJUb1dpbmRvdyB7d30gewogICAgaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICR3XSBFbnRyeV19IHsKCSR3IHNlbGVjdGlvbiByYW5nZSAwIGVuZAoJJHcgaWN1cnNvciBlbmQKICAgIH0KICAgIGZvY3VzICR3Cn0KAAAs/yMgYnV0dG9uLnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIGxhYmVsLCBidXR0b24sCiMgY2hlY2tidXR0b24sIGFuZCByYWRpb2J1dHRvbiB3aWRnZXRzIGFuZCBwcm92aWRlcyBwcm9jZWR1cmVzCiMgdGhhdCBoZWxwIGluIGltcGxlbWVudGluZyB0aG9zZSBiaW5kaW5ncy4KIwojIFJDUzogQCgjKSAkSWQ6IGJ1dHRvbi50Y2wsdiAxLjYgMTk5OS8wOS8wMiAxNzowMjo1MiBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoZSBjb2RlIGJlbG93IGNyZWF0ZXMgdGhlIGRlZmF1bHQgY2xhc3MgYmluZGluZ3MgZm9yIGJ1dHRvbnMuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppZiB7W3N0cmluZyBtYXRjaCAibWFjaW50b3NoIiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsKICAgIGJpbmQgUmFkaW9idXR0b24gPEVudGVyPiB7Cgl0a0J1dHRvbkVudGVyICVXCiAgICB9CiAgICBiaW5kIFJhZGlvYnV0dG9uIDwxPiB7Cgl0a0J1dHRvbkRvd24gJVcKICAgIH0KICAgIGJpbmQgUmFkaW9idXR0b24gPEJ1dHRvblJlbGVhc2UtMT4gewoJdGtCdXR0b25VcCAlVwogICAgfQogICAgYmluZCBDaGVja2J1dHRvbiA8RW50ZXI+IHsKCXRrQnV0dG9uRW50ZXIgJVcKICAgIH0KICAgIGJpbmQgQ2hlY2tidXR0b24gPDE+IHsKCXRrQnV0dG9uRG93biAlVwogICAgfQogICAgYmluZCBDaGVja2J1dHRvbiA8QnV0dG9uUmVsZWFzZS0xPiB7Cgl0a0J1dHRvblVwICVXCiAgICB9Cn0KaWYge1tzdHJpbmcgbWF0Y2ggIndpbmRvd3MiICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gewogICAgYmluZCBDaGVja2J1dHRvbiA8ZXF1YWw+IHsKCXRrQ2hlY2tSYWRpb0ludm9rZSAlVyBzZWxlY3QKICAgIH0KICAgIGJpbmQgQ2hlY2tidXR0b24gPHBsdXM+IHsKCXRrQ2hlY2tSYWRpb0ludm9rZSAlVyBzZWxlY3QKICAgIH0KICAgIGJpbmQgQ2hlY2tidXR0b24gPG1pbnVzPiB7Cgl0a0NoZWNrUmFkaW9JbnZva2UgJVcgZGVzZWxlY3QKICAgIH0KICAgIGJpbmQgQ2hlY2tidXR0b24gPDE+IHsKCXRrQ2hlY2tSYWRpb0Rvd24gJVcKICAgIH0KICAgIGJpbmQgQ2hlY2tidXR0b24gPEJ1dHRvblJlbGVhc2UtMT4gewoJdGtCdXR0b25VcCAlVwogICAgfQogICAgYmluZCBDaGVja2J1dHRvbiA8RW50ZXI+IHsKCXRrQ2hlY2tSYWRpb0VudGVyICVXCiAgICB9CgogICAgYmluZCBSYWRpb2J1dHRvbiA8MT4gewoJdGtDaGVja1JhZGlvRG93biAlVwogICAgfQogICAgYmluZCBSYWRpb2J1dHRvbiA8QnV0dG9uUmVsZWFzZS0xPiB7Cgl0a0J1dHRvblVwICVXCiAgICB9CiAgICBiaW5kIFJhZGlvYnV0dG9uIDxFbnRlcj4gewoJdGtDaGVja1JhZGlvRW50ZXIgJVcKICAgIH0KfQppZiB7W3N0cmluZyBtYXRjaCAidW5peCIgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSldfSB7CiAgICBiaW5kIENoZWNrYnV0dG9uIDxSZXR1cm4+IHsKCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgkgICAgdGtDaGVja1JhZGlvSW52b2tlICVXCgl9CiAgICB9CiAgICBiaW5kIFJhZGlvYnV0dG9uIDxSZXR1cm4+IHsKCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgkgICAgdGtDaGVja1JhZGlvSW52b2tlICVXCgl9CiAgICB9CiAgICBiaW5kIENoZWNrYnV0dG9uIDwxPiB7Cgl0a0NoZWNrUmFkaW9JbnZva2UgJVcKICAgIH0KICAgIGJpbmQgUmFkaW9idXR0b24gPDE+IHsKCXRrQ2hlY2tSYWRpb0ludm9rZSAlVwogICAgfQogICAgYmluZCBDaGVja2J1dHRvbiA8RW50ZXI+IHsKCXRrQnV0dG9uRW50ZXIgJVcKICAgIH0KICAgIGJpbmQgUmFkaW9idXR0b24gPEVudGVyPiB7Cgl0a0J1dHRvbkVudGVyICVXCiAgICB9Cn0KCmJpbmQgQnV0dG9uIDxzcGFjZT4gewogICAgdGtCdXR0b25JbnZva2UgJVcKfQpiaW5kIENoZWNrYnV0dG9uIDxzcGFjZT4gewogICAgdGtDaGVja1JhZGlvSW52b2tlICVXCn0KYmluZCBSYWRpb2J1dHRvbiA8c3BhY2U+IHsKICAgIHRrQ2hlY2tSYWRpb0ludm9rZSAlVwp9CgpiaW5kIEJ1dHRvbiA8Rm9jdXNJbj4ge30KYmluZCBCdXR0b24gPEVudGVyPiB7CiAgICB0a0J1dHRvbkVudGVyICVXCn0KYmluZCBCdXR0b24gPExlYXZlPiB7CiAgICB0a0J1dHRvbkxlYXZlICVXCn0KYmluZCBCdXR0b24gPDE+IHsKICAgIHRrQnV0dG9uRG93biAlVwp9CmJpbmQgQnV0dG9uIDxCdXR0b25SZWxlYXNlLTE+IHsKICAgIHRrQnV0dG9uVXAgJVcKfQoKYmluZCBDaGVja2J1dHRvbiA8Rm9jdXNJbj4ge30KYmluZCBDaGVja2J1dHRvbiA8TGVhdmU+IHsKICAgIHRrQnV0dG9uTGVhdmUgJVcKfQoKYmluZCBSYWRpb2J1dHRvbiA8Rm9jdXNJbj4ge30KYmluZCBSYWRpb2J1dHRvbiA8TGVhdmU+IHsKICAgIHRrQnV0dG9uTGVhdmUgJVcKfQoKaWYge1tzdHJpbmcgbWF0Y2ggIndpbmRvd3MiICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gewoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgdGtCdXR0b25FbnRlciAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyBhCiMgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGJ1dHRvbiB3ZSdyZSBpbiBhbmQgY2hhbmdlcyB0aGUKIyBzdGF0ZSBvZiB0aGUgYnV0dG9uIHRvIGFjdGl2ZSB1bmxlc3MgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uRW50ZXIgdyB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl0gXAoJICAgICYmIFtzdHJpbmcgZXF1YWwgJHRrUHJpdihidXR0b25XaW5kb3cpICR3XX0gewoJJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUgLXJlbGllZiBzdW5rZW4KICAgIH0KICAgIHNldCB0a1ByaXYod2luZG93KSAkdwp9CgojIHRrQnV0dG9uTGVhdmUgLS0KIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBsZWF2ZXMgYQojIGJ1dHRvbiB3aWRnZXQuICBJdCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGJhY2sgdG8KIyBpbmFjdGl2ZS4gIElmIHdlJ3JlIGxlYXZpbmcgdGhlIGJ1dHRvbiB3aW5kb3cgd2l0aCBhIG1vdXNlIGJ1dHRvbgojIHByZXNzZWQgKHRrUHJpdihidXR0b25XaW5kb3cpID09ICR3KSwgcmVzdG9yZSB0aGUgcmVsaWVmIG9mIHRoZQojIGJ1dHRvbiB0b28uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgoKcHJvYyB0a0J1dHRvbkxlYXZlIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkkdyBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAogICAgfQogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihidXR0b25XaW5kb3cpICR3XX0gewoJJHcgY29uZmlndXJlIC1yZWxpZWYgJHRrUHJpdihyZWxpZWYpCiAgICB9CiAgICBzZXQgdGtQcml2KHdpbmRvdykgIiIKfQoKIyB0a0NoZWNrUmFkaW9FbnRlciAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyBhCiMgY2hlY2tidXR0b24gb3IgcmFkaW9idXR0b24gd2lkZ2V0LiAgSXQgcmVjb3JkcyB0aGUgYnV0dG9uIHdlJ3JlIGluCiMgYW5kIGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBidXR0b24gdG8gYWN0aXZlIHVubGVzcyB0aGUgYnV0dG9uIGlzCiMgZGlzYWJsZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgoKcHJvYyB0a0NoZWNrUmFkaW9FbnRlciB3IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXSBcCgkgICAgJiYgW3N0cmluZyBlcXVhbCAkdGtQcml2KGJ1dHRvbldpbmRvdykgJHddfSB7CgkkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZQogICAgfQogICAgc2V0IHRrUHJpdih3aW5kb3cpICR3Cn0KCiMgdGtCdXR0b25Eb3duIC0tCiMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIGluCiMgYSBidXR0b24gd2lkZ2V0LiAgSXQgcmVjb3JkcyB0aGUgZmFjdCB0aGF0IHRoZSBtb3VzZSBpcyBpbiB0aGUgYnV0dG9uLAojIHNhdmVzIHRoZSBidXR0b24ncyByZWxpZWYgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLCBhbmQgY2hhbmdlcwojIHRoZSByZWxpZWYgdG8gc3Vua2VuLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4KCnByb2MgdGtCdXR0b25Eb3duIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgc2V0IHRrUHJpdihyZWxpZWYpIFskdyBjZ2V0IC1yZWxpZWZdCiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCXNldCB0a1ByaXYoYnV0dG9uV2luZG93KSAkdwoJJHcgY29uZmlndXJlIC1yZWxpZWYgc3Vua2VuIC1zdGF0ZSBhY3RpdmUKICAgIH0KfQoKIyB0a0NoZWNrUmFkaW9Eb3duIC0tCiMgVGhlIHByb2NlZHVyZSBiZWxvdyBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIGluCiMgYSBidXR0b24gd2lkZ2V0LiAgSXQgcmVjb3JkcyB0aGUgZmFjdCB0aGF0IHRoZSBtb3VzZSBpcyBpbiB0aGUgYnV0dG9uLAojIHNhdmVzIHRoZSBidXR0b24ncyByZWxpZWYgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLCBhbmQgY2hhbmdlcwojIHRoZSByZWxpZWYgdG8gc3Vua2VuLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4KCnByb2MgdGtDaGVja1JhZGlvRG93biB3IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCB0a1ByaXYocmVsaWVmKSBbJHcgY2dldCAtcmVsaWVmXQogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CglzZXQgdGtQcml2KGJ1dHRvbldpbmRvdykgJHcKCSR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlCiAgICB9Cn0KCiMgdGtCdXR0b25VcCAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQKIyBpbiBhIGJ1dHRvbiB3aWRnZXQuICBJdCByZXN0b3JlcyB0aGUgYnV0dG9uJ3MgcmVsaWVmIGFuZCBpbnZva2VzCiMgdGhlIGNvbW1hbmQgYXMgbG9uZyBhcyB0aGUgbW91c2UgaGFzbid0IGxlZnQgdGhlIGJ1dHRvbi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uVXAgdyB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGJ1dHRvbldpbmRvdykgJHddfSB7CglzZXQgdGtQcml2KGJ1dHRvbldpbmRvdykgIiIKCSR3IGNvbmZpZ3VyZSAtcmVsaWVmICR0a1ByaXYocmVsaWVmKQoJaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdih3aW5kb3cpICR3XQogICAgICAgICAgICAgICYmIFtzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkgICAgJHcgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKCSAgICB1cGxldmVsICMwIFtsaXN0ICR3IGludm9rZV0KCX0KICAgIH0KfQoKfQoKaWYge1tzdHJpbmcgbWF0Y2ggInVuaXgiICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gewoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVW5peCBpbXBsZW1lbnRhdGlvbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgdGtCdXR0b25FbnRlciAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyBhCiMgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGJ1dHRvbiB3ZSdyZSBpbiBhbmQgY2hhbmdlcyB0aGUKIyBzdGF0ZSBvZiB0aGUgYnV0dG9uIHRvIGFjdGl2ZSB1bmxlc3MgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uRW50ZXIge3d9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gewoJJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUKCWlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoYnV0dG9uV2luZG93KSAkd119IHsKCSAgICAkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZSAtcmVsaWVmIHN1bmtlbgoJfQogICAgfQogICAgc2V0IHRrUHJpdih3aW5kb3cpICR3Cn0KCiMgdGtCdXR0b25MZWF2ZSAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGxlYXZlcyBhCiMgYnV0dG9uIHdpZGdldC4gIEl0IGNoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBidXR0b24gYmFjayB0bwojIGluYWN0aXZlLiAgSWYgd2UncmUgbGVhdmluZyB0aGUgYnV0dG9uIHdpbmRvdyB3aXRoIGEgbW91c2UgYnV0dG9uCiMgcHJlc3NlZCAodGtQcml2KGJ1dHRvbldpbmRvdykgPT0gJHcpLCByZXN0b3JlIHRoZSByZWxpZWYgb2YgdGhlCiMgYnV0dG9uIHRvby4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uTGVhdmUgdyB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCiAgICB9CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGJ1dHRvbldpbmRvdykgJHddfSB7CgkkdyBjb25maWd1cmUgLXJlbGllZiAkdGtQcml2KHJlbGllZikKICAgIH0KICAgIHNldCB0a1ByaXYod2luZG93KSAiIgp9CgojIHRrQnV0dG9uRG93biAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBpbgojIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgbW91c2UgaXMgaW4gdGhlIGJ1dHRvbiwKIyBzYXZlcyB0aGUgYnV0dG9uJ3MgcmVsaWVmIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciwgYW5kIGNoYW5nZXMKIyB0aGUgcmVsaWVmIHRvIHN1bmtlbi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uRG93biB3IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCB0a1ByaXYocmVsaWVmKSBbJHcgY2dldCAtcmVsaWVmXQogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CglzZXQgdGtQcml2KGJ1dHRvbldpbmRvdykgJHcKCSR3IGNvbmZpZ3VyZSAtcmVsaWVmIHN1bmtlbgogICAgfQp9CgojIHRrQnV0dG9uVXAgLS0KIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkCiMgaW4gYSBidXR0b24gd2lkZ2V0LiAgSXQgcmVzdG9yZXMgdGhlIGJ1dHRvbidzIHJlbGllZiBhbmQgaW52b2tlcwojIHRoZSBjb21tYW5kIGFzIGxvbmcgYXMgdGhlIG1vdXNlIGhhc24ndCBsZWZ0IHRoZSBidXR0b24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgoKcHJvYyB0a0J1dHRvblVwIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHcgJHRrUHJpdihidXR0b25XaW5kb3cpXX0gewoJc2V0IHRrUHJpdihidXR0b25XaW5kb3cpICIiCgkkdyBjb25maWd1cmUgLXJlbGllZiAkdGtQcml2KHJlbGllZikKCWlmIHtbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYod2luZG93KV0gXAoJCSYmIFtzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkgICAgdXBsZXZlbCAjMCBbbGlzdCAkdyBpbnZva2VdCgl9CiAgICB9Cn0KCn0KCmlmIHtbc3RyaW5nIG1hdGNoICJtYWNpbnRvc2giICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gewoKIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBNYWMgaW1wbGVtZW50YXRpb24KIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgdGtCdXR0b25FbnRlciAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIGVudGVycyBhCiMgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGJ1dHRvbiB3ZSdyZSBpbiBhbmQgY2hhbmdlcyB0aGUKIyBzdGF0ZSBvZiB0aGUgYnV0dG9uIHRvIGFjdGl2ZSB1bmxlc3MgdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uRW50ZXIge3d9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gewogICAgICBpZiB7W3N0cmluZyBlcXVhbCAkdyAkdGtQcml2KGJ1dHRvbldpbmRvdyldfSB7CgkgICAgJHcgY29uZmlndXJlIC1zdGF0ZSBhY3RpdmUKCX0KICAgIH0KICAgIHNldCB0a1ByaXYod2luZG93KSAkdwp9CgojIHRrQnV0dG9uTGVhdmUgLS0KIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBsZWF2ZXMgYQojIGJ1dHRvbiB3aWRnZXQuICBJdCBjaGFuZ2VzIHRoZSBzdGF0ZSBvZiB0aGUgYnV0dG9uIGJhY2sgdG8KIyBpbmFjdGl2ZS4gIElmIHdlJ3JlIGxlYXZpbmcgdGhlIGJ1dHRvbiB3aW5kb3cgd2l0aCBhIG1vdXNlIGJ1dHRvbgojIHByZXNzZWQgKHRrUHJpdihidXR0b25XaW5kb3cpID09ICR3KSwgcmVzdG9yZSB0aGUgcmVsaWVmIG9mIHRoZQojIGJ1dHRvbiB0b28uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgoKcHJvYyB0a0J1dHRvbkxlYXZlIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHcgJHRrUHJpdihidXR0b25XaW5kb3cpXX0gewoJJHcgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKICAgIH0KICAgIHNldCB0a1ByaXYod2luZG93KSAiIgp9CgojIHRrQnV0dG9uRG93biAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBpbgojIGEgYnV0dG9uIHdpZGdldC4gIEl0IHJlY29yZHMgdGhlIGZhY3QgdGhhdCB0aGUgbW91c2UgaXMgaW4gdGhlIGJ1dHRvbiwKIyBzYXZlcyB0aGUgYnV0dG9uJ3MgcmVsaWVmIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlciwgYW5kIGNoYW5nZXMKIyB0aGUgcmVsaWVmIHRvIHN1bmtlbi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrQnV0dG9uRG93biB3IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gewoJc2V0IHRrUHJpdihidXR0b25XaW5kb3cpICR3CgkkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZQogICAgfQp9CgojIHRrQnV0dG9uVXAgLS0KIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkCiMgaW4gYSBidXR0b24gd2lkZ2V0LiAgSXQgcmVzdG9yZXMgdGhlIGJ1dHRvbidzIHJlbGllZiBhbmQgaW52b2tlcwojIHRoZSBjb21tYW5kIGFzIGxvbmcgYXMgdGhlIG1vdXNlIGhhc24ndCBsZWZ0IHRoZSBidXR0b24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgoKcHJvYyB0a0J1dHRvblVwIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHcgJHRrUHJpdihidXR0b25XaW5kb3cpXX0gewoJJHcgY29uZmlndXJlIC1zdGF0ZSBub3JtYWwKCXNldCB0a1ByaXYoYnV0dG9uV2luZG93KSAiIgoJaWYge1tzdHJpbmcgZXF1YWwgJHcgJHRrUHJpdih3aW5kb3cpXQogICAgICAgICAgICAgICYmIFtzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkgICAgdXBsZXZlbCAjMCBbbGlzdCAkdyBpbnZva2VdCgl9CiAgICB9Cn0KCn0KCiMjIyMjIyMjIyMjIyMjIyMjIwojIFNoYXJlZCByb3V0aW5lcwojIyMjIyMjIyMjIyMjIyMjIyMKCiMgdGtCdXR0b25JbnZva2UgLS0KIyBUaGUgcHJvY2VkdXJlIGJlbG93IGlzIGNhbGxlZCB3aGVuIGEgYnV0dG9uIGlzIGludm9rZWQgdGhyb3VnaAojIHRoZSBrZXlib2FyZC4gIEl0IHNpbXVsYXRlIGEgcHJlc3Mgb2YgdGhlIGJ1dHRvbiB2aWEgdGhlIG1vdXNlLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIG5hbWUgb2YgdGhlIHdpZGdldC4KCnByb2MgdGtCdXR0b25JbnZva2UgdyB7CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCXNldCBvbGRSZWxpZWYgWyR3IGNnZXQgLXJlbGllZl0KCXNldCBvbGRTdGF0ZSBbJHcgY2dldCAtc3RhdGVdCgkkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZSAtcmVsaWVmIHN1bmtlbgoJdXBkYXRlIGlkbGV0YXNrcwoJYWZ0ZXIgMTAwCgkkdyBjb25maWd1cmUgLXN0YXRlICRvbGRTdGF0ZSAtcmVsaWVmICRvbGRSZWxpZWYKCXVwbGV2ZWwgIzAgW2xpc3QgJHcgaW52b2tlXQogICAgfQp9CgojIHRrQ2hlY2tSYWRpb0ludm9rZSAtLQojIFRoZSBwcm9jZWR1cmUgYmVsb3cgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZCBpbgojIGEgY2hlY2tidXR0b24gb3IgcmFkaW9idXR0b24gd2lkZ2V0LCBvciB3aGVuIHRoZSB3aWRnZXQgaXMgaW52b2tlZAojIHRocm91Z2ggdGhlIGtleWJvYXJkLiAgSXQgaW52b2tlcyB0aGUgd2lkZ2V0IGlmIGl0CiMgaXNuJ3QgZGlzYWJsZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbmFtZSBvZiB0aGUgd2lkZ2V0LgojIGNtZCAtCQlUaGUgc3ViY29tbWFuZCB0byBpbnZva2UgKG9uZSBvZiBpbnZva2UsIHNlbGVjdCwgb3IgZGVzZWxlY3QpLgoKcHJvYyB0a0NoZWNrUmFkaW9JbnZva2Uge3cge2NtZCBpbnZva2V9fSB7CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCXVwbGV2ZWwgIzAgW2xpc3QgJHcgJGNtZF0KICAgIH0KfQoKAAAXcyMgZGlhbG9nLnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHByb2NlZHVyZSB0a19kaWFsb2csIHdoaWNoIGNyZWF0ZXMgYSBkaWFsb2cKIyBib3ggY29udGFpbmluZyBhIGJpdG1hcCwgYSBtZXNzYWdlLCBhbmQgb25lIG9yIG1vcmUgYnV0dG9ucy4KIwojIFJDUzogQCgjKSAkSWQ6IGRpYWxvZy50Y2wsdiAxLjcgMjAwMC8wMS8xMiAxMTo0NToxNCBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojCiMgdGtfZGlhbG9nOgojCiMgVGhpcyBwcm9jZWR1cmUgZGlzcGxheXMgYSBkaWFsb2cgYm94LCB3YWl0cyBmb3IgYSBidXR0b24gaW4gdGhlIGRpYWxvZwojIHRvIGJlIGludm9rZWQsIHRoZW4gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGJ1dHRvbi4gIElmIHRoZQojIGRpYWxvZyBzb21laG93IGdldHMgZGVzdHJveWVkLCAtMSBpcyByZXR1cm5lZC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVdpbmRvdyB0byB1c2UgZm9yIGRpYWxvZyB0b3AtbGV2ZWwuCiMgdGl0bGUgLQlUaXRsZSB0byBkaXNwbGF5IGluIGRpYWxvZydzIGRlY29yYXRpdmUgZnJhbWUuCiMgdGV4dCAtCU1lc3NhZ2UgdG8gZGlzcGxheSBpbiBkaWFsb2cuCiMgYml0bWFwIC0JQml0bWFwIHRvIGRpc3BsYXkgaW4gZGlhbG9nIChlbXB0eSBzdHJpbmcgbWVhbnMgbm9uZSkuCiMgZGVmYXVsdCAtCUluZGV4IG9mIGJ1dHRvbiB0aGF0IGlzIHRvIGRpc3BsYXkgdGhlIGRlZmF1bHQgcmluZwojCQkoLTEgbWVhbnMgbm9uZSkuCiMgYXJncyAtCU9uZSBvciBtb3JlIHN0cmluZ3MgdG8gZGlzcGxheSBpbiBidXR0b25zIGFjcm9zcyB0aGUKIwkJYm90dG9tIG9mIHRoZSBkaWFsb2cgYm94LgoKcHJvYyB0a19kaWFsb2cge3cgdGl0bGUgdGV4dCBiaXRtYXAgZGVmYXVsdCBhcmdzfSB7CiAgICBnbG9iYWwgdGtQcml2IHRjbF9wbGF0Zm9ybQoKICAgICMgQ2hlY2sgdGhhdCAkZGVmYXVsdCB3YXMgcHJvcGVybHkgZ2l2ZW4KICAgIGlmIHtbc3RyaW5nIGlzIGludCAkZGVmYXVsdF19IHsKCWlmIHskZGVmYXVsdCA+PSBbbGxlbmd0aCAkYXJnc119IHsKCSAgICByZXR1cm4gLWNvZGUgZXJyb3IgImRlZmF1bHQgYnV0dG9uIGluZGV4IGdyZWF0ZXIgdGhhbiBudW1iZXIgb2ZcCgkJICAgIGJ1dHRvbnMgc3BlY2lmaWVkIGZvciB0a19kaWFsb2ciCgl9CiAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCB7fSAkZGVmYXVsdF19IHsKCXNldCBkZWZhdWx0IC0xCiAgICB9IGVsc2UgewoJc2V0IGRlZmF1bHQgW2xzZWFyY2ggLWV4YWN0ICRhcmdzICRkZWZhdWx0XQogICAgfQoKICAgICMgMS4gQ3JlYXRlIHRoZSB0b3AtbGV2ZWwgd2luZG93IGFuZCBkaXZpZGUgaXQgaW50byB0b3AKICAgICMgYW5kIGJvdHRvbSBwYXJ0cy4KCiAgICBjYXRjaCB7ZGVzdHJveSAkd30KICAgIHRvcGxldmVsICR3IC1jbGFzcyBEaWFsb2cKICAgIHdtIHRpdGxlICR3ICR0aXRsZQogICAgd20gaWNvbm5hbWUgJHcgRGlhbG9nCiAgICB3bSBwcm90b2NvbCAkdyBXTV9ERUxFVEVfV0lORE9XIHsgfQoKICAgICMgVGhlIGZvbGxvd2luZyBjb21tYW5kIG1lYW5zIHRoYXQgdGhlIGRpYWxvZyB3b24ndCBiZSBwb3N0ZWQgaWYKICAgICMgW3dpbmZvIHBhcmVudCAkd10gaXMgaWNvbmlmaWVkLCBidXQgaXQncyByZWFsbHkgbmVlZGVkOyAgb3RoZXJ3aXNlCiAgICAjIHRoZSBkaWFsb2cgY2FuIGJlY29tZSBvYnNjdXJlZCBieSBvdGhlciB3aW5kb3dzIGluIHRoZSBhcHBsaWNhdGlvbiwKICAgICMgZXZlbiB0aG91Z2ggaXRzIGdyYWIga2VlcHMgdGhlIHJlc3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGZyb20gYmVpbmcgdXNlZC4KCiAgICB3bSB0cmFuc2llbnQgJHcgW3dpbmZvIHRvcGxldmVsIFt3aW5mbyBwYXJlbnQgJHddXQogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7Cgl1bnN1cHBvcnRlZDEgc3R5bGUgJHcgZEJveFByb2MKICAgIH0KCiAgICBmcmFtZSAkdy5ib3QKICAgIGZyYW1lICR3LnRvcAogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgInVuaXgiXX0gewoJJHcuYm90IGNvbmZpZ3VyZSAtcmVsaWVmIHJhaXNlZCAtYmQgMQoJJHcudG9wIGNvbmZpZ3VyZSAtcmVsaWVmIHJhaXNlZCAtYmQgMQogICAgfQogICAgcGFjayAkdy5ib3QgLXNpZGUgYm90dG9tIC1maWxsIGJvdGgKICAgIHBhY2sgJHcudG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQoKICAgICMgMi4gRmlsbCB0aGUgdG9wIHBhcnQgd2l0aCBiaXRtYXAgYW5kIG1lc3NhZ2UgKHVzZSB0aGUgb3B0aW9uCiAgICAjIGRhdGFiYXNlIGZvciAtd3JhcGxlbmd0aCBhbmQgLWZvbnQgc28gdGhhdCB0aGV5IGNhbiBiZQogICAgIyBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIpLgoKICAgIG9wdGlvbiBhZGQgKkRpYWxvZy5tc2cud3JhcExlbmd0aCAzaSB3aWRnZXREZWZhdWx0CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKCW9wdGlvbiBhZGQgKkRpYWxvZy5tc2cuZm9udCBzeXN0ZW0gd2lkZ2V0RGVmYXVsdAogICAgfSBlbHNlIHsKCW9wdGlvbiBhZGQgKkRpYWxvZy5tc2cuZm9udCB7VGltZXMgMTJ9IHdpZGdldERlZmF1bHQKICAgIH0KCiAgICBsYWJlbCAkdy5tc2cgLWp1c3RpZnkgbGVmdCAtdGV4dCAkdGV4dAogICAgcGFjayAkdy5tc2cgLWluICR3LnRvcCAtc2lkZSByaWdodCAtZXhwYW5kIDEgLWZpbGwgYm90aCAtcGFkeCAzbSAtcGFkeSAzbQogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkYml0bWFwICIiXX0gewoJaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdICYmIFwKCQlbc3RyaW5nIGVxdWFsICRiaXRtYXAgImVycm9yIl19IHsKCSAgICBzZXQgYml0bWFwICJzdG9wIgoJfQoJbGFiZWwgJHcuYml0bWFwIC1iaXRtYXAgJGJpdG1hcAoJcGFjayAkdy5iaXRtYXAgLWluICR3LnRvcCAtc2lkZSBsZWZ0IC1wYWR4IDNtIC1wYWR5IDNtCiAgICB9CgogICAgIyAzLiBDcmVhdGUgYSByb3cgb2YgYnV0dG9ucyBhdCB0aGUgYm90dG9tIG9mIHRoZSBkaWFsb2cuCgogICAgc2V0IGkgMAogICAgZm9yZWFjaCBidXQgJGFyZ3MgewoJYnV0dG9uICR3LmJ1dHRvbiRpIC10ZXh0ICRidXQgLWNvbW1hbmQgW2xpc3Qgc2V0IHRrUHJpdihidXR0b24pICRpXQoJaWYgeyRpID09ICRkZWZhdWx0fSB7CgkgICAgJHcuYnV0dG9uJGkgY29uZmlndXJlIC1kZWZhdWx0IGFjdGl2ZQoJfSBlbHNlIHsKCSAgICAkdy5idXR0b24kaSBjb25maWd1cmUgLWRlZmF1bHQgbm9ybWFsCgl9CglncmlkICR3LmJ1dHRvbiRpIC1pbiAkdy5ib3QgLWNvbHVtbiAkaSAtcm93IDAgLXN0aWNreSBldyAtcGFkeCAxMAoJZ3JpZCBjb2x1bW5jb25maWd1cmUgJHcuYm90ICRpCgkjIFdlIGJvb3N0IHRoZSBzaXplIG9mIHNvbWUgTWFjIGJ1dHRvbnMgZm9yIGwmZgoJaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7CgkgICAgc2V0IHRtcCBbc3RyaW5nIHRvbG93ZXIgJGJ1dF0KCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdG1wICJvayJdIHx8IFtzdHJpbmcgZXF1YWwgJHRtcCAiY2FuY2VsIl19IHsKCQlncmlkIGNvbHVtbmNvbmZpZ3VyZSAkdy5ib3QgJGkgLW1pbnNpemUgW2V4cHIgezU5ICsgMjB9XQoJICAgIH0KCX0KCWluY3IgaQogICAgfQoKICAgICMgNC4gQ3JlYXRlIGEgYmluZGluZyBmb3IgPFJldHVybj4gb24gdGhlIGRpYWxvZyBpZiB0aGVyZSBpcyBhCiAgICAjIGRlZmF1bHQgYnV0dG9uLgoKICAgIGlmIHskZGVmYXVsdCA+PSAwfSB7CgliaW5kICR3IDxSZXR1cm4+ICIKCVtsaXN0ICR3LmJ1dHRvbiRkZWZhdWx0XSBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZSAtcmVsaWVmIHN1bmtlbgoJdXBkYXRlIGlkbGV0YXNrcwoJYWZ0ZXIgMTAwCglzZXQgdGtQcml2KGJ1dHRvbikgJGRlZmF1bHQKCSIKICAgIH0KCiAgICAjIDUuIENyZWF0ZSBhIDxEZXN0cm95PiBiaW5kaW5nIGZvciB0aGUgd2luZG93IHRoYXQgc2V0cyB0aGUKICAgICMgYnV0dG9uIHZhcmlhYmxlIHRvIC0xOyAgdGhpcyBpcyBuZWVkZWQgaW4gY2FzZSBzb21ldGhpbmcgaGFwcGVucwogICAgIyB0aGF0IGRlc3Ryb3lzIHRoZSB3aW5kb3csIHN1Y2ggYXMgaXRzIHBhcmVudCB3aW5kb3cgYmVpbmcgZGVzdHJveWVkLgoKICAgIGJpbmQgJHcgPERlc3Ryb3k+IHtzZXQgdGtQcml2KGJ1dHRvbikgLTF9CgogICAgIyA2LiBXaXRoZHJhdyB0aGUgd2luZG93LCB0aGVuIHVwZGF0ZSBhbGwgdGhlIGdlb21ldHJ5IGluZm9ybWF0aW9uCiAgICAjIHNvIHdlIGtub3cgaG93IGJpZyBpdCB3YW50cyB0byBiZSwgdGhlbiBjZW50ZXIgdGhlIHdpbmRvdyBpbiB0aGUKICAgICMgZGlzcGxheSBhbmQgZGUtaWNvbmlmeSBpdC4KCiAgICB3bSB3aXRoZHJhdyAkdwogICAgdXBkYXRlIGlkbGV0YXNrcwogICAgc2V0IHggW2V4cHIge1t3aW5mbyBzY3JlZW53aWR0aCAkd10vMiAtIFt3aW5mbyByZXF3aWR0aCAkd10vMiBcCgkgICAgLSBbd2luZm8gdnJvb3R4IFt3aW5mbyBwYXJlbnQgJHddXX1dCiAgICBzZXQgeSBbZXhwciB7W3dpbmZvIHNjcmVlbmhlaWdodCAkd10vMiAtIFt3aW5mbyByZXFoZWlnaHQgJHddLzIgXAoJICAgIC0gW3dpbmZvIHZyb290eSBbd2luZm8gcGFyZW50ICR3XV19XQogICAgd20gZ2VvbSAkdyArJHgrJHkKICAgIHdtIGRlaWNvbmlmeSAkdwoKICAgICMgNy4gU2V0IGEgZ3JhYiBhbmQgY2xhaW0gdGhlIGZvY3VzIHRvby4KCiAgICBzZXQgb2xkRm9jdXMgW2ZvY3VzXQogICAgc2V0IG9sZEdyYWIgW2dyYWIgY3VycmVudCAkd10KICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJG9sZEdyYWIgIiJdfSB7CglzZXQgZ3JhYlN0YXR1cyBbZ3JhYiBzdGF0dXMgJG9sZEdyYWJdCiAgICB9CiAgICBncmFiICR3CiAgICBpZiB7JGRlZmF1bHQgPj0gMH0gewoJZm9jdXMgJHcuYnV0dG9uJGRlZmF1bHQKICAgIH0gZWxzZSB7Cglmb2N1cyAkdwogICAgfQoKICAgICMgOC4gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcmVzcG9uZCwgdGhlbiByZXN0b3JlIHRoZSBmb2N1cyBhbmQKICAgICMgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYnV0dG9uLiAgUmVzdG9yZSB0aGUgZm9jdXMKICAgICMgYmVmb3JlIGRlbGV0aW5nIHRoZSB3aW5kb3csIHNpbmNlIG90aGVyd2lzZSB0aGUgd2luZG93IG1hbmFnZXIKICAgICMgbWF5IHRha2UgdGhlIGZvY3VzIGF3YXkgc28gd2UgY2FuJ3QgcmVkaXJlY3QgaXQuICBGaW5hbGx5LAogICAgIyByZXN0b3JlIGFueSBncmFiIHRoYXQgd2FzIGluIGVmZmVjdC4KCiAgICB0a3dhaXQgdmFyaWFibGUgdGtQcml2KGJ1dHRvbikKICAgIGNhdGNoIHtmb2N1cyAkb2xkRm9jdXN9CiAgICBjYXRjaCB7CgkjIEl0J3MgcG9zc2libGUgdGhhdCB0aGUgd2luZG93IGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLAoJIyBoZW5jZSB0aGlzICJjYXRjaCIuICBEZWxldGUgdGhlIERlc3Ryb3kgaGFuZGxlciBzbyB0aGF0CgkjIHRrUHJpdihidXR0b24pIGRvZXNuJ3QgZ2V0IHJlc2V0IGJ5IGl0LgoKCWJpbmQgJHcgPERlc3Ryb3k+IHt9CglkZXN0cm95ICR3CiAgICB9CiAgICBpZiB7W3N0cmluZyBjb21wYXJlICRvbGRHcmFiICIiXX0gewogICAgICBpZiB7W3N0cmluZyBjb21wYXJlICRncmFiU3RhdHVzICJnbG9iYWwiXX0gewoJICAgIGdyYWIgJG9sZEdyYWIKICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdyYWIgLWdsb2JhbCAkb2xkR3JhYgoJfQogICAgfQogICAgcmV0dXJuICR0a1ByaXYoYnV0dG9uKQp9CgAAPfojIGVudHJ5LnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIGVudHJ5IHdpZGdldHMgYW5kIHByb3ZpZGVzCiMgcHJvY2VkdXJlcyB0aGF0IGhlbHAgaW4gaW1wbGVtZW50aW5nIHRob3NlIGJpbmRpbmdzLgojCiMgUkNTOiBAKCMpICRJZDogZW50cnkudGNsLHYgMS4xMSAyMDAwLzAxLzA2IDAyOjIyOjI0IGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTItMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgojIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRWxlbWVudHMgb2YgdGtQcml2IHRoYXQgYXJlIHVzZWQgaW4gdGhpcyBmaWxlOgojCiMgYWZ0ZXJJZCAtCQlJZiBub24tbnVsbCwgaXQgbWVhbnMgdGhhdCBhdXRvLXNjYW5uaW5nIGlzIHVuZGVyd2F5CiMJCQlhbmQgaXQgZ2l2ZXMgdGhlICJhZnRlciIgaWQgZm9yIHRoZSBuZXh0IGF1dG8tc2NhbgojCQkJY29tbWFuZCB0byBiZSBleGVjdXRlZC4KIyBtb3VzZU1vdmVkIC0JCU5vbi16ZXJvIG1lYW5zIHRoZSBtb3VzZSBoYXMgbW92ZWQgYSBzaWduaWZpY2FudAojCQkJYW1vdW50IHNpbmNlIHRoZSBidXR0b24gd2VudCBkb3duIChzbywgZm9yIGV4YW1wbGUsCiMJCQlzdGFydCBkcmFnZ2luZyBvdXQgYSBzZWxlY3Rpb24pLgojIHByZXNzWCAtCQlYLWNvb3JkaW5hdGUgYXQgd2hpY2ggdGhlIG1vdXNlIGJ1dHRvbiB3YXMgcHJlc3NlZC4KIyBzZWxlY3RNb2RlIC0JCVRoZSBzdHlsZSBvZiBzZWxlY3Rpb24gY3VycmVudGx5IHVuZGVyd2F5OgojCQkJY2hhciwgd29yZCwgb3IgbGluZS4KIyB4LCB5IC0JCUxhc3Qga25vd24gbW91c2UgY29vcmRpbmF0ZXMgZm9yIHNjYW5uaW5nCiMJCQlhbmQgYXV0by1zY2FubmluZy4KIyBkYXRhIC0JCVVzZWQgZm9yIEN1dCBhbmQgQ29weQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBlbnRyaWVzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpiaW5kIEVudHJ5IDw8Q3V0Pj4gewogICAgaWYgeyFbY2F0Y2gge3RrRW50cnlHZXRTZWxlY3Rpb24gJVd9IHRrUHJpdihkYXRhKV19IHsKCWNsaXBib2FyZCBjbGVhciAtZGlzcGxheW9mICVXCgljbGlwYm9hcmQgYXBwZW5kIC1kaXNwbGF5b2YgJVcgJHRrUHJpdihkYXRhKQoJJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdAoJdW5zZXQgdGtQcml2KGRhdGEpCiAgICB9Cn0KYmluZCBFbnRyeSA8PENvcHk+PiB7CiAgICBpZiB7IVtjYXRjaCB7dGtFbnRyeUdldFNlbGVjdGlvbiAlV30gdGtQcml2KGRhdGEpXX0gewoJY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJVcKCWNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAlVyAkdGtQcml2KGRhdGEpCgl1bnNldCB0a1ByaXYoZGF0YSkKICAgIH0KfQpiaW5kIEVudHJ5IDw8UGFzdGU+PiB7CiAgICBnbG9iYWwgdGNsX3BsYXRmb3JtCiAgICBjYXRjaCB7CglpZiB7W3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il19IHsKCSAgICBjYXRjaCB7CgkJJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdAoJICAgIH0KCX0KCSVXIGluc2VydCBpbnNlcnQgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAlVyAtc2VsZWN0aW9uIENMSVBCT0FSRF0KCXRrRW50cnlTZWVJbnNlcnQgJVcKICAgIH0KfQpiaW5kIEVudHJ5IDw8Q2xlYXI+PiB7CiAgICAlVyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0Cn0KYmluZCBFbnRyeSA8PFBhc3RlU2VsZWN0aW9uPj4gewogICAgaWYgeyEkdGtQcml2KG1vdXNlTW92ZWQpIHx8ICR0a19zdHJpY3RNb3RpZn0gewoJdGtFbnRyeVBhc3RlICVXICV4CiAgICB9Cn0KCiMgU3RhbmRhcmQgTW90aWYgYmluZGluZ3M6CgpiaW5kIEVudHJ5IDwxPiB7CiAgICB0a0VudHJ5QnV0dG9uMSAlVyAleAogICAgJVcgc2VsZWN0aW9uIGNsZWFyCn0KYmluZCBFbnRyeSA8QjEtTW90aW9uPiB7CiAgICBzZXQgdGtQcml2KHgpICV4CiAgICB0a0VudHJ5TW91c2VTZWxlY3QgJVcgJXgKfQpiaW5kIEVudHJ5IDxEb3VibGUtMT4gewogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSB3b3JkCiAgICB0a0VudHJ5TW91c2VTZWxlY3QgJVcgJXgKICAgIGNhdGNoIHslVyBpY3Vyc29yIHNlbC5maXJzdH0KfQpiaW5kIEVudHJ5IDxUcmlwbGUtMT4gewogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBsaW5lCiAgICB0a0VudHJ5TW91c2VTZWxlY3QgJVcgJXgKICAgICVXIGljdXJzb3IgMAp9CmJpbmQgRW50cnkgPFNoaWZ0LTE+IHsKICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgY2hhcgogICAgJVcgc2VsZWN0aW9uIGFkanVzdCBAJXgKfQpiaW5kIEVudHJ5IDxEb3VibGUtU2hpZnQtMT4JewogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSB3b3JkCiAgICB0a0VudHJ5TW91c2VTZWxlY3QgJVcgJXgKfQpiaW5kIEVudHJ5IDxUcmlwbGUtU2hpZnQtMT4JewogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBsaW5lCiAgICB0a0VudHJ5TW91c2VTZWxlY3QgJVcgJXgKfQpiaW5kIEVudHJ5IDxCMS1MZWF2ZT4gewogICAgc2V0IHRrUHJpdih4KSAleAogICAgdGtFbnRyeUF1dG9TY2FuICVXCn0KYmluZCBFbnRyeSA8QjEtRW50ZXI+IHsKICAgIHRrQ2FuY2VsUmVwZWF0Cn0KYmluZCBFbnRyeSA8QnV0dG9uUmVsZWFzZS0xPiB7CiAgICB0a0NhbmNlbFJlcGVhdAp9CmJpbmQgRW50cnkgPENvbnRyb2wtMT4gewogICAgJVcgaWN1cnNvciBAJXgKfQoKYmluZCBFbnRyeSA8TGVmdD4gewogICAgdGtFbnRyeVNldEN1cnNvciAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gLSAxfV0KfQpiaW5kIEVudHJ5IDxSaWdodD4gewogICAgdGtFbnRyeVNldEN1cnNvciAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gKyAxfV0KfQpiaW5kIEVudHJ5IDxTaGlmdC1MZWZ0PiB7CiAgICB0a0VudHJ5S2V5U2VsZWN0ICVXIFtleHByIHtbJVcgaW5kZXggaW5zZXJ0XSAtIDF9XQogICAgdGtFbnRyeVNlZUluc2VydCAlVwp9CmJpbmQgRW50cnkgPFNoaWZ0LVJpZ2h0PiB7CiAgICB0a0VudHJ5S2V5U2VsZWN0ICVXIFtleHByIHtbJVcgaW5kZXggaW5zZXJ0XSArIDF9XQogICAgdGtFbnRyeVNlZUluc2VydCAlVwp9CmJpbmQgRW50cnkgPENvbnRyb2wtTGVmdD4gewogICAgdGtFbnRyeVNldEN1cnNvciAlVyBbdGtFbnRyeVByZXZpb3VzV29yZCAlVyBpbnNlcnRdCn0KYmluZCBFbnRyeSA8Q29udHJvbC1SaWdodD4gewogICAgdGtFbnRyeVNldEN1cnNvciAlVyBbdGtFbnRyeU5leHRXb3JkICVXIGluc2VydF0KfQpiaW5kIEVudHJ5IDxTaGlmdC1Db250cm9sLUxlZnQ+IHsKICAgIHRrRW50cnlLZXlTZWxlY3QgJVcgW3RrRW50cnlQcmV2aW91c1dvcmQgJVcgaW5zZXJ0XQogICAgdGtFbnRyeVNlZUluc2VydCAlVwp9CmJpbmQgRW50cnkgPFNoaWZ0LUNvbnRyb2wtUmlnaHQ+IHsKICAgIHRrRW50cnlLZXlTZWxlY3QgJVcgW3RrRW50cnlOZXh0V29yZCAlVyBpbnNlcnRdCiAgICB0a0VudHJ5U2VlSW5zZXJ0ICVXCn0KYmluZCBFbnRyeSA8SG9tZT4gewogICAgdGtFbnRyeVNldEN1cnNvciAlVyAwCn0KYmluZCBFbnRyeSA8U2hpZnQtSG9tZT4gewogICAgdGtFbnRyeUtleVNlbGVjdCAlVyAwCiAgICB0a0VudHJ5U2VlSW5zZXJ0ICVXCn0KYmluZCBFbnRyeSA8RW5kPiB7CiAgICB0a0VudHJ5U2V0Q3Vyc29yICVXIGVuZAp9CmJpbmQgRW50cnkgPFNoaWZ0LUVuZD4gewogICAgdGtFbnRyeUtleVNlbGVjdCAlVyBlbmQKICAgIHRrRW50cnlTZWVJbnNlcnQgJVcKfQoKYmluZCBFbnRyeSA8RGVsZXRlPiB7CiAgICBpZiB7WyVXIHNlbGVjdGlvbiBwcmVzZW50XX0gewoJJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdAogICAgfSBlbHNlIHsKCSVXIGRlbGV0ZSBpbnNlcnQKICAgIH0KfQpiaW5kIEVudHJ5IDxCYWNrU3BhY2U+IHsKICAgIHRrRW50cnlCYWNrc3BhY2UgJVcKfQoKYmluZCBFbnRyeSA8Q29udHJvbC1zcGFjZT4gewogICAgJVcgc2VsZWN0aW9uIGZyb20gaW5zZXJ0Cn0KYmluZCBFbnRyeSA8U2VsZWN0PiB7CiAgICAlVyBzZWxlY3Rpb24gZnJvbSBpbnNlcnQKfQpiaW5kIEVudHJ5IDxDb250cm9sLVNoaWZ0LXNwYWNlPiB7CiAgICAlVyBzZWxlY3Rpb24gYWRqdXN0IGluc2VydAp9CmJpbmQgRW50cnkgPFNoaWZ0LVNlbGVjdD4gewogICAgJVcgc2VsZWN0aW9uIGFkanVzdCBpbnNlcnQKfQpiaW5kIEVudHJ5IDxDb250cm9sLXNsYXNoPiB7CiAgICAlVyBzZWxlY3Rpb24gcmFuZ2UgMCBlbmQKfQpiaW5kIEVudHJ5IDxDb250cm9sLWJhY2tzbGFzaD4gewogICAgJVcgc2VsZWN0aW9uIGNsZWFyCn0KYmluZCBFbnRyeSA8S2V5UHJlc3M+IHsKICAgIHRrRW50cnlJbnNlcnQgJVcgJUEKfQoKIyBJZ25vcmUgYWxsIEFsdCwgTWV0YSwgYW5kIENvbnRyb2wga2V5cHJlc3NlcyB1bmxlc3MgZXhwbGljaXRseSBib3VuZC4KIyBPdGhlcndpc2UsIGlmIGEgd2lkZ2V0IGJpbmRpbmcgZm9yIG9uZSBvZiB0aGVzZSBpcyBkZWZpbmVkLCB0aGUKIyA8S2V5UHJlc3M+IGNsYXNzIGJpbmRpbmcgd2lsbCBhbHNvIGZpcmUgYW5kIGluc2VydCB0aGUgY2hhcmFjdGVyLAojIHdoaWNoIGlzIHdyb25nLiAgRGl0dG8gZm9yIEVzY2FwZSwgUmV0dXJuLCBhbmQgVGFiLgoKYmluZCBFbnRyeSA8QWx0LUtleVByZXNzPiB7IyBub3RoaW5nfQpiaW5kIEVudHJ5IDxNZXRhLUtleVByZXNzPiB7IyBub3RoaW5nfQpiaW5kIEVudHJ5IDxDb250cm9sLUtleVByZXNzPiB7IyBub3RoaW5nfQpiaW5kIEVudHJ5IDxFc2NhcGU+IHsjIG5vdGhpbmd9CmJpbmQgRW50cnkgPFJldHVybj4geyMgbm90aGluZ30KYmluZCBFbnRyeSA8S1BfRW50ZXI+IHsjIG5vdGhpbmd9CmJpbmQgRW50cnkgPFRhYj4geyMgbm90aGluZ30KaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7CgliaW5kIEVudHJ5IDxDb21tYW5kLUtleVByZXNzPiB7IyBub3RoaW5nfQp9CgojIE9uIFdpbmRvd3MsIHBhc3RlIGlzIGRvbmUgdXNpbmcgU2hpZnQtSW5zZXJ0LiAgU2hpZnQtSW5zZXJ0IGFscmVhZHkKIyBnZW5lcmF0ZXMgdGhlIDw8UGFzdGU+PiBldmVudCwgc28gd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBoZXJlLgppZiB7W3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19IHsKICAgIGJpbmQgRW50cnkgPEluc2VydD4gewoJY2F0Y2gge3RrRW50cnlJbnNlcnQgJVcgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAlV119CiAgICB9Cn0KCiMgQWRkaXRpb25hbCBlbWFjcy1saWtlIGJpbmRpbmdzOgoKYmluZCBFbnRyeSA8Q29udHJvbC1hPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJdGtFbnRyeVNldEN1cnNvciAlVyAwCiAgICB9Cn0KYmluZCBFbnRyeSA8Q29udHJvbC1iPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJdGtFbnRyeVNldEN1cnNvciAlVyBbZXhwciB7WyVXIGluZGV4IGluc2VydF0gLSAxfV0KICAgIH0KfQpiaW5kIEVudHJ5IDxDb250cm9sLWQ+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgklVyBkZWxldGUgaW5zZXJ0CiAgICB9Cn0KYmluZCBFbnRyeSA8Q29udHJvbC1lPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJdGtFbnRyeVNldEN1cnNvciAlVyBlbmQKICAgIH0KfQpiaW5kIEVudHJ5IDxDb250cm9sLWY+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7Cgl0a0VudHJ5U2V0Q3Vyc29yICVXIFtleHByIHtbJVcgaW5kZXggaW5zZXJ0XSArIDF9XQogICAgfQp9CmJpbmQgRW50cnkgPENvbnRyb2wtaD4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrRW50cnlCYWNrc3BhY2UgJVcKICAgIH0KfQpiaW5kIEVudHJ5IDxDb250cm9sLWs+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgklVyBkZWxldGUgaW5zZXJ0IGVuZAogICAgfQp9CmJpbmQgRW50cnkgPENvbnRyb2wtdD4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrRW50cnlUcmFuc3Bvc2UgJVcKICAgIH0KfQpiaW5kIEVudHJ5IDxNZXRhLWI+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7Cgl0a0VudHJ5U2V0Q3Vyc29yICVXIFt0a0VudHJ5UHJldmlvdXNXb3JkICVXIGluc2VydF0KICAgIH0KfQpiaW5kIEVudHJ5IDxNZXRhLWQ+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgklVyBkZWxldGUgaW5zZXJ0IFt0a0VudHJ5TmV4dFdvcmQgJVcgaW5zZXJ0XQogICAgfQp9CmJpbmQgRW50cnkgPE1ldGEtZj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrRW50cnlTZXRDdXJzb3IgJVcgW3RrRW50cnlOZXh0V29yZCAlVyBpbnNlcnRdCiAgICB9Cn0KYmluZCBFbnRyeSA8TWV0YS1CYWNrU3BhY2U+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgklVyBkZWxldGUgW3RrRW50cnlQcmV2aW91c1dvcmQgJVcgaW5zZXJ0XSBpbnNlcnQKICAgIH0KfQpiaW5kIEVudHJ5IDxNZXRhLURlbGV0ZT4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCSVXIGRlbGV0ZSBbdGtFbnRyeVByZXZpb3VzV29yZCAlVyBpbnNlcnRdIGluc2VydAogICAgfQp9CgojIEEgZmV3IGFkZGl0aW9uYWwgYmluZGluZ3Mgb2YgbXkgb3duLgoKYmluZCBFbnRyeSA8Mj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCSVXIHNjYW4gbWFyayAleAoJc2V0IHRrUHJpdih4KSAleAoJc2V0IHRrUHJpdih5KSAleQoJc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAwCiAgICB9Cn0KYmluZCBFbnRyeSA8QjItTW90aW9uPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJaWYge2FicygleC0kdGtQcml2KHgpKSA+IDJ9IHsKCSAgICBzZXQgdGtQcml2KG1vdXNlTW92ZWQpIDEKCX0KCSVXIHNjYW4gZHJhZ3RvICV4CiAgICB9Cn0KCiMgdGtFbnRyeUNsb3Nlc3RHYXAgLS0KIyBHaXZlbiB4IGFuZCB5IGNvb3JkaW5hdGVzLCB0aGlzIHByb2NlZHVyZSBmaW5kcyB0aGUgY2xvc2VzdCBib3VuZGFyeQojIGJldHdlZW4gY2hhcmFjdGVycyB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHJldHVybnMgdGhlIGluZGV4CiMgb2YgdGhlIGNoYXJhY3RlciBqdXN0IGFmdGVyIHRoZSBib3VuZGFyeS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuCiMgeCAtCQlYLWNvb3JkaW5hdGUgd2l0aGluIHRoZSB3aW5kb3cuCgpwcm9jIHRrRW50cnlDbG9zZXN0R2FwIHt3IHh9IHsKICAgIHNldCBwb3MgWyR3IGluZGV4IEAkeF0KICAgIHNldCBiYm94IFskdyBiYm94ICRwb3NdCiAgICBpZiB7KCR4IC0gW2xpbmRleCAkYmJveCAwXSkgPCAoW2xpbmRleCAkYmJveCAyXS8yKX0gewoJcmV0dXJuICRwb3MKICAgIH0KICAgIGluY3IgcG9zCn0KCiMgdGtFbnRyeUJ1dHRvbjEgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGhhbmRsZSBidXR0b24tMSBwcmVzc2VzIGluIGVudHJ5CiMgd2lkZ2V0cy4gIEl0IG1vdmVzIHRoZSBpbnNlcnRpb24gY3Vyc29yLCBzZXRzIHRoZSBzZWxlY3Rpb24gYW5jaG9yLAojIGFuZCBjbGFpbXMgdGhlIGlucHV0IGZvY3VzLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdyBpbiB3aGljaCB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkLgojIHggLQkJVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYnV0dG9uIHByZXNzLgoKcHJvYyB0a0VudHJ5QnV0dG9uMSB7dyB4fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBjaGFyCiAgICBzZXQgdGtQcml2KG1vdXNlTW92ZWQpIDAKICAgIHNldCB0a1ByaXYocHJlc3NYKSAkeAogICAgJHcgaWN1cnNvciBbdGtFbnRyeUNsb3Nlc3RHYXAgJHcgJHhdCiAgICAkdyBzZWxlY3Rpb24gZnJvbSBpbnNlcnQKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zdGF0ZV0gIm5vcm1hbCJdfSB7Zm9jdXMgJHd9Cn0KCiMgdGtFbnRyeU1vdXNlU2VsZWN0IC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIGRyYWdnaW5nIG91dCBhIHNlbGVjdGlvbiB3aXRoCiMgdGhlIG1vdXNlLiAgRGVwZW5kaW5nIG9uIHRoZSBzZWxlY3Rpb24gbW9kZSAoY2hhcmFjdGVyLCB3b3JkLAojIGxpbmUpIGl0IHNlbGVjdHMgaW4gZGlmZmVyZW50LXNpemVkIHVuaXRzLiAgVGhpcyBwcm9jZWR1cmUKIyBpZ25vcmVzIG1vdXNlIG1vdGlvbnMgaW5pdGlhbGx5IHVudGlsIHRoZSBtb3VzZSBoYXMgbW92ZWQgZnJvbQojIG9uZSBjaGFyYWN0ZXIgdG8gYW5vdGhlciBvciB1bnRpbCB0aGVyZSBoYXZlIGJlZW4gbXVsdGlwbGUgY2xpY2tzLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdyBpbiB3aGljaCB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkLgojIHggLQkJVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgbW91c2UuCgpwcm9jIHRrRW50cnlNb3VzZVNlbGVjdCB7dyB4fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgc2V0IGN1ciBbdGtFbnRyeUNsb3Nlc3RHYXAgJHcgJHhdCiAgICBzZXQgYW5jaG9yIFskdyBpbmRleCBhbmNob3JdCiAgICBpZiB7KCRjdXIgIT0gJGFuY2hvcikgfHwgKGFicygkdGtQcml2KHByZXNzWCkgLSAkeCkgPj0gMyl9IHsKCXNldCB0a1ByaXYobW91c2VNb3ZlZCkgMQogICAgfQogICAgc3dpdGNoICR0a1ByaXYoc2VsZWN0TW9kZSkgewoJY2hhciB7CgkgICAgaWYgeyR0a1ByaXYobW91c2VNb3ZlZCl9IHsKCQlpZiB7JGN1ciA8ICRhbmNob3J9IHsKCQkgICAgJHcgc2VsZWN0aW9uIHJhbmdlICRjdXIgJGFuY2hvcgoJCX0gZWxzZWlmIHskY3VyID4gJGFuY2hvcn0gewoJCSAgICAkdyBzZWxlY3Rpb24gcmFuZ2UgJGFuY2hvciAkY3VyCgkJfSBlbHNlIHsKCQkgICAgJHcgc2VsZWN0aW9uIGNsZWFyCgkJfQoJICAgIH0KCX0KCXdvcmQgewoJICAgIGlmIHskY3VyIDwgWyR3IGluZGV4IGFuY2hvcl19IHsKCQlzZXQgYmVmb3JlIFt0Y2xfd29yZEJyZWFrQmVmb3JlIFskdyBnZXRdICRjdXJdCgkJc2V0IGFmdGVyIFt0Y2xfd29yZEJyZWFrQWZ0ZXIgWyR3IGdldF0gW2V4cHIgeyRhbmNob3ItMX1dXQoJICAgIH0gZWxzZSB7CgkJc2V0IGJlZm9yZSBbdGNsX3dvcmRCcmVha0JlZm9yZSBbJHcgZ2V0XSAkYW5jaG9yXQoJCXNldCBhZnRlciBbdGNsX3dvcmRCcmVha0FmdGVyIFskdyBnZXRdIFtleHByIHskY3VyIC0gMX1dXQoJICAgIH0KCSAgICBpZiB7JGJlZm9yZSA8IDB9IHsKCQlzZXQgYmVmb3JlIDAKCSAgICB9CgkgICAgaWYgeyRhZnRlciA8IDB9IHsKCQlzZXQgYWZ0ZXIgZW5kCgkgICAgfQoJICAgICR3IHNlbGVjdGlvbiByYW5nZSAkYmVmb3JlICRhZnRlcgoJfQoJbGluZSB7CgkgICAgJHcgc2VsZWN0aW9uIHJhbmdlIDAgZW5kCgl9CiAgICB9CiAgICB1cGRhdGUgaWRsZXRhc2tzCn0KCiMgdGtFbnRyeVBhc3RlIC0tCiMgVGhpcyBwcm9jZWR1cmUgc2V0cyB0aGUgaW5zZXJ0aW9uIGN1cnNvciB0byB0aGUgY3VycmVudCBtb3VzZSBwb3NpdGlvbiwKIyBwYXN0ZXMgdGhlIHNlbGVjdGlvbiB0aGVyZSwgYW5kIHNldHMgdGhlIGZvY3VzIHRvIHRoZSB3aW5kb3cuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgZW50cnkgd2luZG93LgojIHggLQkJWCBwb3NpdGlvbiBvZiB0aGUgbW91c2UuCgpwcm9jIHRrRW50cnlQYXN0ZSB7dyB4fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgJHcgaWN1cnNvciBbdGtFbnRyeUNsb3Nlc3RHYXAgJHcgJHhdCiAgICBjYXRjaCB7JHcgaW5zZXJ0IGluc2VydCBbc2VsZWN0aW9uIGdldCAtZGlzcGxheW9mICR3XX0KICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zdGF0ZV0gIm5vcm1hbCJdfSB7Zm9jdXMgJHd9Cn0KCiMgdGtFbnRyeUF1dG9TY2FuIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYW4gZW50cnkgd2luZG93CiMgd2l0aCBidXR0b24gMSBkb3duLiAgSXQgc2Nyb2xscyB0aGUgd2luZG93IGxlZnQgb3IgcmlnaHQsCiMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBtb3VzZSBpcywgYW5kIHJlc2NoZWR1bGVzIGl0c2VsZiBhcyBhbgojICJhZnRlciIgY29tbWFuZCBzbyB0aGF0IHRoZSB3aW5kb3cgY29udGludWVzIHRvIHNjcm9sbCB1bnRpbCB0aGUKIyBtb3VzZSBtb3ZlcyBiYWNrIGludG8gdGhlIHdpbmRvdyBvciB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdy4KCnByb2MgdGtFbnRyeUF1dG9TY2FuIHt3fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBzZXQgeCAkdGtQcml2KHgpCiAgICBpZiB7IVt3aW5mbyBleGlzdHMgJHddfSByZXR1cm4KICAgIGlmIHskeCA+PSBbd2luZm8gd2lkdGggJHddfSB7CgkkdyB4dmlldyBzY3JvbGwgMiB1bml0cwoJdGtFbnRyeU1vdXNlU2VsZWN0ICR3ICR4CiAgICB9IGVsc2VpZiB7JHggPCAwfSB7CgkkdyB4dmlldyBzY3JvbGwgLTIgdW5pdHMKCXRrRW50cnlNb3VzZVNlbGVjdCAkdyAkeAogICAgfQogICAgc2V0IHRrUHJpdihhZnRlcklkKSBbYWZ0ZXIgNTAgW2xpc3QgdGtFbnRyeUF1dG9TY2FuICR3XV0KfQoKIyB0a0VudHJ5S2V5U2VsZWN0IC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHN0cm9raW5nIG91dCBzZWxlY3Rpb25zIHVzaW5nIHRoZQojIGtleWJvYXJkLiAgSXQgbW92ZXMgdGhlIGN1cnNvciB0byBhIG5ldyBwb3NpdGlvbiwgdGhlbiBleHRlbmRzCiMgdGhlIHNlbGVjdGlvbiB0byB0aGF0IHBvc2l0aW9uLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdy4KIyBuZXcgLQkJQSBuZXcgcG9zaXRpb24gZm9yIHRoZSBpbnNlcnRpb24gY3Vyc29yICh0aGUgY3Vyc29yIGhhc24ndAojCQlhY3R1YWxseSBiZWVuIG1vdmVkIHRvIHRoaXMgcG9zaXRpb24geWV0KS4KCnByb2MgdGtFbnRyeUtleVNlbGVjdCB7dyBuZXd9IHsKICAgIGlmIHshWyR3IHNlbGVjdGlvbiBwcmVzZW50XX0gewoJJHcgc2VsZWN0aW9uIGZyb20gaW5zZXJ0CgkkdyBzZWxlY3Rpb24gdG8gJG5ldwogICAgfSBlbHNlIHsKCSR3IHNlbGVjdGlvbiBhZGp1c3QgJG5ldwogICAgfQogICAgJHcgaWN1cnNvciAkbmV3Cn0KCiMgdGtFbnRyeUluc2VydCAtLQojIEluc2VydCBhIHN0cmluZyBpbnRvIGFuIGVudHJ5IGF0IHRoZSBwb2ludCBvZiB0aGUgaW5zZXJ0aW9uIGN1cnNvci4KIyBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBpbiB0aGUgZW50cnksIGFuZCBpdCBjb3ZlcnMgdGhlIHBvaW50IG9mIHRoZQojIGluc2VydGlvbiBjdXJzb3IsIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24gYmVmb3JlIGluc2VydGluZy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cgaW4gd2hpY2ggdG8gaW5zZXJ0IHRoZSBzdHJpbmcKIyBzIC0JCVRoZSBzdHJpbmcgdG8gaW5zZXJ0ICh1c3VhbGx5IGp1c3QgYSBzaW5nbGUgY2hhcmFjdGVyKQoKcHJvYyB0a0VudHJ5SW5zZXJ0IHt3IHN9IHsKICAgIGlmIHtbc3RyaW5nIGVxdWFsICRzICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBjYXRjaCB7CglzZXQgaW5zZXJ0IFskdyBpbmRleCBpbnNlcnRdCglpZiB7KFskdyBpbmRleCBzZWwuZmlyc3RdIDw9ICRpbnNlcnQpCgkJJiYgKFskdyBpbmRleCBzZWwubGFzdF0gPj0gJGluc2VydCl9IHsKCSAgICAkdyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0Cgl9CiAgICB9CiAgICAkdyBpbnNlcnQgaW5zZXJ0ICRzCiAgICB0a0VudHJ5U2VlSW5zZXJ0ICR3Cn0KCiMgdGtFbnRyeUJhY2tzcGFjZSAtLQojIEJhY2tzcGFjZSBvdmVyIHRoZSBjaGFyYWN0ZXIganVzdCBiZWZvcmUgdGhlIGluc2VydGlvbiBjdXJzb3IuCiMgSWYgYmFja3NwYWNpbmcgd291bGQgbW92ZSB0aGUgY3Vyc29yIG9mZiB0aGUgbGVmdCBlZGdlIG9mIHRoZQojIHdpbmRvdywgcmVwb3NpdGlvbiB0aGUgY3Vyc29yIGF0IGFib3V0IHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cgaW4gd2hpY2ggdG8gYmFja3NwYWNlLgoKcHJvYyB0a0VudHJ5QmFja3NwYWNlIHcgewogICAgaWYge1skdyBzZWxlY3Rpb24gcHJlc2VudF19IHsKCSR3IGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QKICAgIH0gZWxzZSB7CglzZXQgeCBbZXhwciB7WyR3IGluZGV4IGluc2VydF0gLSAxfV0KCWlmIHskeCA+PSAwfSB7JHcgZGVsZXRlICR4fQoJaWYge1skdyBpbmRleCBAMF0gPj0gWyR3IGluZGV4IGluc2VydF19IHsKCSAgICBzZXQgcmFuZ2UgWyR3IHh2aWV3XQoJICAgIHNldCBsZWZ0IFtsaW5kZXggJHJhbmdlIDBdCgkgICAgc2V0IHJpZ2h0IFtsaW5kZXggJHJhbmdlIDFdCgkgICAgJHcgeHZpZXcgbW92ZXRvIFtleHByIHskbGVmdCAtICgkcmlnaHQgLSAkbGVmdCkvMi4wfV0KCX0KICAgIH0KfQoKIyB0a0VudHJ5U2VlSW5zZXJ0IC0tCiMgTWFrZSBzdXJlIHRoYXQgdGhlIGluc2VydGlvbiBjdXJzb3IgaXMgdmlzaWJsZSBpbiB0aGUgZW50cnkgd2luZG93LgojIElmIG5vdCwgYWRqdXN0IHRoZSB2aWV3IHNvIHRoYXQgaXQgaXMuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgZW50cnkgd2luZG93LgoKcHJvYyB0a0VudHJ5U2VlSW5zZXJ0IHcgewogICAgc2V0IGMgWyR3IGluZGV4IGluc2VydF0KICAgIGlmIHsoJGMgPCBbJHcgaW5kZXggQDBdKSB8fCAoJGMgPiBbJHcgaW5kZXggQFt3aW5mbyB3aWR0aCAkd11dKX0gewoJJHcgeHZpZXcgJGMKICAgIH0KfQoKIyB0a0VudHJ5U2V0Q3Vyc29yIC0KIyBNb3ZlIHRoZSBpbnNlcnRpb24gY3Vyc29yIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gYW4gZW50cnkuICBBbHNvCiMgY2xlYXJzIHRoZSBzZWxlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZSBpbiB0aGUgZW50cnksIGFuZCBtYWtlcyBzdXJlCiMgdGhhdCB0aGUgaW5zZXJ0aW9uIGN1cnNvciBpcyB2aXNpYmxlLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdy4KIyBwb3MgLQkJVGhlIGRlc2lyZWQgbmV3IHBvc2l0aW9uIGZvciB0aGUgY3Vyc29yIGluIHRoZSB3aW5kb3cuCgpwcm9jIHRrRW50cnlTZXRDdXJzb3Ige3cgcG9zfSB7CiAgICAkdyBpY3Vyc29yICRwb3MKICAgICR3IHNlbGVjdGlvbiBjbGVhcgogICAgdGtFbnRyeVNlZUluc2VydCAkdwp9CgojIHRrRW50cnlUcmFuc3Bvc2UgLQojIFRoaXMgcHJvY2VkdXJlIGltcGxlbWVudHMgdGhlICJ0cmFuc3Bvc2UiIGZ1bmN0aW9uIGZvciBlbnRyeSB3aWRnZXRzLgojIEl0IHRyYW5wb3NlcyB0aGUgY2hhcmFjdGVycyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgaW5zZXJ0aW9uIGN1cnNvciwKIyB1bmxlc3MgdGhlIGN1cnNvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiAgSW4gdGhpcyBjYXNlIGl0CiMgdHJhbnNwb3NlcyB0aGUgdHdvIGNoYXJhY3RlcnMgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvci4gIEluIGVpdGhlcgojIGNhc2UsIHRoZSBjdXJzb3IgZW5kcyB1cCB0byB0aGUgcmlnaHQgb2YgdGhlIHRyYW5zcG9zZWQgY2hhcmFjdGVycy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBlbnRyeSB3aW5kb3cuCgpwcm9jIHRrRW50cnlUcmFuc3Bvc2UgdyB7CiAgICBzZXQgaSBbJHcgaW5kZXggaW5zZXJ0XQogICAgaWYgeyRpIDwgWyR3IGluZGV4IGVuZF19IHsKCWluY3IgaQogICAgfQogICAgc2V0IGZpcnN0IFtleHByIHskaS0yfV0KICAgIGlmIHskZmlyc3QgPCAwfSB7CglyZXR1cm4KICAgIH0KICAgIHNldCBuZXcgW3N0cmluZyBpbmRleCBbJHcgZ2V0XSBbZXhwciB7JGktMX1dXVtzdHJpbmcgaW5kZXggWyR3IGdldF0gJGZpcnN0XQogICAgJHcgZGVsZXRlICRmaXJzdCAkaQogICAgJHcgaW5zZXJ0IGluc2VydCAkbmV3CiAgICB0a0VudHJ5U2VlSW5zZXJ0ICR3Cn0KCiMgdGtFbnRyeU5leHRXb3JkIC0tCiMgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgd29yZCBwb3NpdGlvbiBhZnRlciBhIGdpdmVuIHBvc2l0aW9uIGluIHRoZQojIGVudHJ5LiAgVGhlIG5leHQgd29yZCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQgYW5kIG1heSBiZSBlaXRoZXIgdGhlIG5leHQKIyBlbmQtb2Ytd29yZCBwb3NpdGlvbiBvciB0aGUgbmV4dCBzdGFydC1vZi13b3JkIHBvc2l0aW9uIGFmdGVyIHRoZSBuZXh0CiMgZW5kLW9mLXdvcmQgcG9zaXRpb24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgZW50cnkgd2luZG93IGluIHdoaWNoIHRoZSBjdXJzb3IgaXMgdG8gbW92ZS4KIyBzdGFydCAtCVBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaC4KCmlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19ICB7CiAgICBwcm9jIHRrRW50cnlOZXh0V29yZCB7dyBzdGFydH0gewoJc2V0IHBvcyBbdGNsX2VuZE9mV29yZCBbJHcgZ2V0XSBbJHcgaW5kZXggJHN0YXJ0XV0KCWlmIHskcG9zID49IDB9IHsKCSAgICBzZXQgcG9zIFt0Y2xfc3RhcnRPZk5leHRXb3JkIFskdyBnZXRdICRwb3NdCgl9CglpZiB7JHBvcyA8IDB9IHsKCSAgICByZXR1cm4gZW5kCgl9CglyZXR1cm4gJHBvcwogICAgfQp9IGVsc2UgewogICAgcHJvYyB0a0VudHJ5TmV4dFdvcmQge3cgc3RhcnR9IHsKCXNldCBwb3MgW3RjbF9lbmRPZldvcmQgWyR3IGdldF0gWyR3IGluZGV4ICRzdGFydF1dCglpZiB7JHBvcyA8IDB9IHsKCSAgICByZXR1cm4gZW5kCgl9CglyZXR1cm4gJHBvcwogICAgfQp9CgojIHRrRW50cnlQcmV2aW91c1dvcmQgLS0KIwojIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyB3b3JkIHBvc2l0aW9uIGJlZm9yZSBhIGdpdmVuCiMgcG9zaXRpb24gaW4gdGhlIGVudHJ5LgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuCiMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guCgpwcm9jIHRrRW50cnlQcmV2aW91c1dvcmQge3cgc3RhcnR9IHsKICAgIHNldCBwb3MgW3RjbF9zdGFydE9mUHJldmlvdXNXb3JkIFskdyBnZXRdIFskdyBpbmRleCAkc3RhcnRdXQogICAgaWYgeyRwb3MgPCAwfSB7CglyZXR1cm4gMAogICAgfQogICAgcmV0dXJuICRwb3MKfQojIHRrRW50cnlHZXRTZWxlY3Rpb24gLS0KIwojIFJldHVybnMgdGhlIHNlbGVjdGVkIHRleHQgb2YgdGhlIGVudHJ5IHdpdGggcmVzcGVjdCB0byB0aGUgLXNob3cgb3B0aW9uLgojCiMgQXJndW1lbnRzOgojIHcgLSAgICAgICAgIFRoZSBlbnRyeSB3aW5kb3cgZnJvbSB3aGljaCB0aGUgdGV4dCB0byBnZXQKCnByb2MgdGtFbnRyeUdldFNlbGVjdGlvbiB7d30gewogICAgc2V0IGVudHJ5U3RyaW5nIFtzdHJpbmcgcmFuZ2UgWyR3IGdldF0gWyR3IGluZGV4IHNlbC5maXJzdF0gXAoJICAgIFtleHByIHtbJHcgaW5kZXggc2VsLmxhc3RdIC0gMX1dXQogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJHcgY2dldCAtc2hvd10gIiJdfSB7CglyZWdzdWIgLWFsbCAuICRlbnRyeVN0cmluZyBbc3RyaW5nIGluZGV4IFskdyBjZ2V0IC1zaG93XSAwXSBlbnRyeVN0cmluZwogICAgfQogICAgcmV0dXJuICRlbnRyeVN0cmluZwp9CgAAE8UjIGZvY3VzLnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgc2V2ZXJhbCBwcm9jZWR1cmVzIGZvciBtYW5hZ2luZyB0aGUgaW5wdXQKIyBmb2N1cy4KIwojIFJDUzogQCgjKSAkSWQ6IGZvY3VzLnRjbCx2IDEuNSAxOTk5LzA5LzAyIDE3OjAyOjUyIGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NSBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIHRrX2ZvY3VzTmV4dCAtLQojIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5leHQgd2luZG93IGFmdGVyICJ3IiBpbgojICJmb2N1cyBvcmRlciIgKHRoZSB3aW5kb3cgdGhhdCBzaG91bGQgcmVjZWl2ZSB0aGUgZm9jdXMgbmV4dCBpZgojIFRhYiBpcyB0eXBlZCBpbiB3KS4gICJOZXh0IiBpcyBkZWZpbmVkIGJ5IGEgcHJlLW9yZGVyIHNlYXJjaAojIG9mIGEgdG9wLWxldmVsIGFuZCBpdHMgbm9uLXRvcC1sZXZlbCBkZXNjZW5kYW50cywgd2l0aCB0aGUgc3RhY2tpbmcKIyBvcmRlciBkZXRlcm1pbmluZyB0aGUgb3JkZXIgb2Ygc2libGluZ3MuICBUaGUgIi10YWtlZm9jdXMiIG9wdGlvbnMKIyBvbiB3aW5kb3dzIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGV5IHNob3VsZCBiZSBza2lwcGVkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJTmFtZSBvZiBhIHdpbmRvdy4KCnByb2MgdGtfZm9jdXNOZXh0IHcgewogICAgc2V0IGN1ciAkdwogICAgd2hpbGUgMSB7CgoJIyBEZXNjZW5kIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY3VycmVudCB3aWRnZXQuCgoJc2V0IHBhcmVudCAkY3VyCglzZXQgY2hpbGRyZW4gW3dpbmZvIGNoaWxkcmVuICRjdXJdCglzZXQgaSAtMQoKCSMgTG9vayBmb3IgdGhlIG5leHQgc2libGluZyB0aGF0IGlzbid0IGEgdG9wLWxldmVsLgoKCXdoaWxlIDEgewoJICAgIGluY3IgaQoJICAgIGlmIHskaSA8IFtsbGVuZ3RoICRjaGlsZHJlbl19IHsKCQlzZXQgY3VyIFtsaW5kZXggJGNoaWxkcmVuICRpXQogICAgICAgICAgICAgIGlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyB0b3BsZXZlbCAkY3VyXSAkY3VyXX0gewoJCSAgICBjb250aW51ZQoJCX0gZWxzZSB7CgkJICAgIGJyZWFrCgkJfQoJICAgIH0KCgkgICAgIyBObyBtb3JlIHNpYmxpbmdzLCBzbyBnbyB0byB0aGUgY3VycmVudCB3aWRnZXQncyBwYXJlbnQuCgkgICAgIyBJZiBpdCdzIGEgdG9wLWxldmVsLCBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG90aGVyd2lzZQoJICAgICMgbG9vayBmb3IgaXRzIG5leHQgc2libGluZy4KCgkgICAgc2V0IGN1ciAkcGFyZW50CgkgICAgaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIHRvcGxldmVsICRjdXJdICRjdXJdfSB7CgkJYnJlYWsKCSAgICB9CgkgICAgc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRwYXJlbnRdCgkgICAgc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkcGFyZW50XQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4gJGN1cl0KCX0KCWlmIHtbc3RyaW5nIGVxdWFsICR3ICRjdXJdIHx8IFt0a0ZvY3VzT0sgJGN1cl19IHsKCSAgICByZXR1cm4gJGN1cgoJfQogICAgfQp9CgojIHRrX2ZvY3VzUHJldiAtLQojIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByZXZpb3VzIHdpbmRvdyBiZWZvcmUgInciIGluCiMgImZvY3VzIG9yZGVyIiAodGhlIHdpbmRvdyB0aGF0IHNob3VsZCByZWNlaXZlIHRoZSBmb2N1cyBuZXh0IGlmCiMgU2hpZnQtVGFiIGlzIHR5cGVkIGluIHcpLiAgIk5leHQiIGlzIGRlZmluZWQgYnkgYSBwcmUtb3JkZXIgc2VhcmNoCiMgb2YgYSB0b3AtbGV2ZWwgYW5kIGl0cyBub24tdG9wLWxldmVsIGRlc2NlbmRhbnRzLCB3aXRoIHRoZSBzdGFja2luZwojIG9yZGVyIGRldGVybWluaW5nIHRoZSBvcmRlciBvZiBzaWJsaW5ncy4gIFRoZSAiLXRha2Vmb2N1cyIgb3B0aW9ucwojIG9uIHdpbmRvd3MgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZXkgc2hvdWxkIGJlIHNraXBwZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlOYW1lIG9mIGEgd2luZG93LgoKcHJvYyB0a19mb2N1c1ByZXYgdyB7CiAgICBzZXQgY3VyICR3CiAgICB3aGlsZSAxIHsKCgkjIENvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgd2luZG93J3MgcG9zaXRpb24KCSMgYW1vbmcgaXRzIHNpYmxpbmdzLiAgQWxzbywgaWYgdGhlIHdpbmRvdyBpcyBhIHRvcC1sZXZlbCwKCSMgdGhlbiByZXBvc2l0aW9uIHRvIGp1c3QgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgb2YgdGhlIHdpbmRvdy4KCglpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gdG9wbGV2ZWwgJGN1cl0gJGN1cl19ICB7CgkgICAgc2V0IHBhcmVudCAkY3VyCgkgICAgc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkY3VyXQoJICAgIHNldCBpIFtsbGVuZ3RoICRjaGlsZHJlbl0KCX0gZWxzZSB7CgkgICAgc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRjdXJdCgkgICAgc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkcGFyZW50XQoJICAgIHNldCBpIFtsc2VhcmNoIC1leGFjdCAkY2hpbGRyZW4gJGN1cl0KCX0KCgkjIEdvIHRvIHRoZSBwcmV2aW91cyBzaWJsaW5nLCB0aGVuIGRlc2NlbmQgdG8gaXRzIGxhc3QgZGVzY2VuZGFudAoJIyAoaGlnaGVzdCBpbiBzdGFja2luZyBvcmRlci4gIFdoaWxlIGRvaW5nIHRoaXMsIGlnbm9yZSB0b3AtbGV2ZWxzCgkjIGFuZCB0aGVpciBkZXNjZW5kYW50cy4gIFdoZW4gd2UgcnVuIG91dCBvZiBkZXNjZW5kYW50cywgZ28gdXAKCSMgb25lIGxldmVsIHRvIHRoZSBwYXJlbnQuCgoJd2hpbGUgeyRpID4gMH0gewoJICAgIGluY3IgaSAtMQoJICAgIHNldCBjdXIgW2xpbmRleCAkY2hpbGRyZW4gJGldCgkgICAgaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIHRvcGxldmVsICRjdXJdICRjdXJdfSB7CgkJY29udGludWUKCSAgICB9CgkgICAgc2V0IHBhcmVudCAkY3VyCgkgICAgc2V0IGNoaWxkcmVuIFt3aW5mbyBjaGlsZHJlbiAkcGFyZW50XQoJICAgIHNldCBpIFtsbGVuZ3RoICRjaGlsZHJlbl0KCX0KCXNldCBjdXIgJHBhcmVudAoJaWYge1tzdHJpbmcgZXF1YWwgJHcgJGN1cl0gfHwgW3RrRm9jdXNPSyAkY3VyXX0gewoJICAgIHJldHVybiAkY3VyCgl9CiAgICB9Cn0KCiMgdGtGb2N1c09LIC0tCiMKIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBmb2N1cyBvbgojIGEgZ2l2ZW4gd2luZG93LiAgSXQgcmV0dXJucyAxIGlmIGl0J3MgT0sgdG8gZm9jdXMgb24gdGhlIHdpbmRvdywKIyAwIGlmIGl0J3Mgbm90IE9LLiAgVGhlIGNvZGUgZmlyc3QgY2hlY2tzIHdoZXRoZXIgdGhlIHdpbmRvdyBpcwojIHZpZXdhYmxlLiAgSWYgbm90LCB0aGVuIGl0IG5ldmVyIGZvY3VzZXMgb24gdGhlIHdpbmRvdy4gIFRoZW4gaXQKIyBjaGVja3MgdGhlIC10YWtlZm9jdXMgb3B0aW9uIGZvciB0aGUgd2luZG93IGFuZCB1c2VzIGl0IGlmIGl0J3MKIyBzZXQuICBJZiB0aGVyZSdzIG5vIC10YWtlZm9jdXMgb3B0aW9uLCB0aGUgcHJvY2VkdXJlIGNoZWNrcyB0bwojIHNlZSBpZiAoYSkgdGhlIHdpZGdldCBpc24ndCBkaXNhYmxlZCwgYW5kIChiKSBpdCBoYXMgc29tZSBrZXkKIyBiaW5kaW5ncy4gIElmIGFsbCBvZiB0aGVzZSBhcmUgdHJ1ZSwgdGhlbiAxIGlzIHJldHVybmVkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJTmFtZSBvZiBhIHdpbmRvdy4KCnByb2MgdGtGb2N1c09LIHcgewogICAgc2V0IGNvZGUgW2NhdGNoIHskdyBjZ2V0IC10YWtlZm9jdXN9IHZhbHVlXQogICAgaWYgeygkY29kZSA9PSAwKSAmJiBbc3RyaW5nIGNvbXBhcmUgJHZhbHVlICIiXX0gewoJaWYgeyR2YWx1ZSA9PSAwfSB7CgkgICAgcmV0dXJuIDAKCX0gZWxzZWlmIHskdmFsdWUgPT0gMX0gewoJICAgIHJldHVybiBbd2luZm8gdmlld2FibGUgJHddCgl9IGVsc2UgewoJICAgIHNldCB2YWx1ZSBbdXBsZXZlbCAjMCAkdmFsdWUgJHddCgkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdmFsdWUgIiJdfSB7CgkJcmV0dXJuICR2YWx1ZQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlICR3XX0gewoJcmV0dXJuIDAKICAgIH0KICAgIHNldCBjb2RlIFtjYXRjaCB7JHcgY2dldCAtc3RhdGV9IHZhbHVlXQogICAgaWYgeygkY29kZSA9PSAwKSAmJiBbc3RyaW5nIGVxdWFsICR2YWx1ZSAiZGlzYWJsZWQiXX0gewoJcmV0dXJuIDAKICAgIH0KICAgIHJlZ2V4cCBLZXl8Rm9jdXMgIltiaW5kICR3XSBbYmluZCBbd2luZm8gY2xhc3MgJHddXSIKfQoKIyB0a19mb2N1c0ZvbGxvd3NNb3VzZSAtLQojCiMgSWYgdGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCwgVGsgd2lsbCBlbnRlciAiZm9jdXMtZm9sbG93cy1tb3VzZSIKIyBtb2RlLCB3aGVyZSB0aGUgZm9jdXMgaXMgYWx3YXlzIG9uIHdoYXRldmVyIHdpbmRvdyBjb250YWlucyB0aGUKIyBtb3VzZS4gIElmIHRoaXMgcHJvY2VkdXJlIGlzbid0IGludm9rZWQsIHRoZW4gdGhlIHVzZXIgdHlwaWNhbGx5CiMgaGFzIHRvIGNsaWNrIG9uIGEgd2luZG93IHRvIGdpdmUgaXQgdGhlIGZvY3VzLgojCiMgQXJndW1lbnRzOgojIE5vbmUuCgpwcm9jIHRrX2ZvY3VzRm9sbG93c01vdXNlIHt9IHsKICAgIHNldCBvbGQgW2JpbmQgYWxsIDxFbnRlcj5dCiAgICBzZXQgc2NyaXB0IHsKCWlmIHtbc3RyaW5nIGVxdWFsICIlZCIgIk5vdGlmeUFuY2VzdG9yIl0gXAoJCXx8IFtzdHJpbmcgZXF1YWwgIiVkIiAiTm90aWZ5Tm9ubGluZWFyIl0gXAoJCXx8IFtzdHJpbmcgZXF1YWwgIiVkIiAiTm90aWZ5SW5mZXJpb3IiXX0gewoJICAgIGlmIHtbdGtGb2N1c09LICVXXX0gewoJCWZvY3VzICVXCgkgICAgfQoJfQogICAgfQogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkb2xkICIiXX0gewoJYmluZCBhbGwgPEVudGVyPiAiJG9sZDsgJHNjcmlwdCIKICAgIH0gZWxzZSB7CgliaW5kIGFsbCA8RW50ZXI+ICRzY3JpcHQKICAgIH0KfQoAADRiIyBsaXN0Ym94LnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIFRrIGxpc3Rib3ggd2lkZ2V0cwojIGFuZCBwcm92aWRlcyBwcm9jZWR1cmVzIHRoYXQgaGVscCBpbiBpbXBsZW1lbnRpbmcgdGhvc2UgYmluZGluZ3MuCiMKIyBSQ1M6IEAoIykgJElkOiBsaXN0Ym94LnRjbCx2IDEuMTAgMjAwMC8wMi8xMCAwODo1Mjo1MCBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTk0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgojIENvcHlyaWdodCAoYykgMTk5OCBieSBTY3JpcHRpY3MgQ29ycG9yYXRpb24uCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGtQcml2IGVsZW1lbnRzIHVzZWQgaW4gdGhpcyBmaWxlOgojCiMgYWZ0ZXJJZCAtCQlUb2tlbiByZXR1cm5lZCBieSAiYWZ0ZXIiIGZvciBhdXRvc2Nhbm5pbmcuCiMgbGlzdGJveFByZXYgLQkJVGhlIGxhc3QgZWxlbWVudCB0byBiZSBzZWxlY3RlZCBvciBkZXNlbGVjdGVkCiMJCQlkdXJpbmcgYSBzZWxlY3Rpb24gb3BlcmF0aW9uLgojIGxpc3Rib3hTZWxlY3Rpb24gLQlBbGwgb2YgdGhlIGl0ZW1zIHRoYXQgd2VyZSBzZWxlY3RlZCBiZWZvcmUgdGhlCiMJCQljdXJyZW50IHNlbGVjdGlvbiBvcGVyYXRpb24gKHN1Y2ggYXMgYSBtb3VzZQojCQkJZHJhZykgc3RhcnRlZDsgIHVzZWQgdG8gY2FuY2VsIGFuIG9wZXJhdGlvbi4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoZSBjb2RlIGJlbG93IGNyZWF0ZXMgdGhlIGRlZmF1bHQgY2xhc3MgYmluZGluZ3MgZm9yIGxpc3Rib3hlcy4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTm90ZTogdGhlIGNoZWNrIGZvciBleGlzdGVuY2Ugb2YgJVcgYmVsb3cgaXMgYmVjYXVzZSB0aGlzIGJpbmRpbmcKIyBpcyBzb21ldGltZXMgaW52b2tlZCBhZnRlciBhIHdpbmRvdyBoYXMgYmVlbiBkZWxldGVkIChlLmcuIGJlY2F1c2UKIyB0aGVyZSBpcyBhIGRvdWJsZS1jbGljayBiaW5kaW5nIG9uIHRoZSB3aWRnZXQgdGhhdCBkZWxldGVzIGl0KS4gIFVzZXJzCiMgY2FuIHB1dCAiYnJlYWsicyBpbiB0aGVpciBiaW5kaW5ncyB0byBhdm9pZCB0aGUgZXJyb3IsIGJ1dCB0aGlzIGNoZWNrCiMgbWFrZXMgdGhhdCB1bm5lY2Vzc2FyeS4KCmJpbmQgTGlzdGJveCA8MT4gewogICAgaWYge1t3aW5mbyBleGlzdHMgJVddfSB7Cgl0a0xpc3Rib3hCZWdpblNlbGVjdCAlVyBbJVcgaW5kZXggQCV4LCV5XQogICAgfQp9CgojIElnbm9yZSBkb3VibGUgY2xpY2tzIHNvIHRoYXQgdXNlcnMgY2FuIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3JzLgojIEFtb25nIG90aGVyIHRoaW5ncywgdGhpcyBwcmV2ZW50cyBlcnJvcnMgaWYgdGhlIHVzZXIgZGVsZXRlcyB0aGUKIyBsaXN0Ym94IG9uIGEgZG91YmxlIGNsaWNrLgoKYmluZCBMaXN0Ym94IDxEb3VibGUtMT4gewogICAgIyBFbXB0eSBzY3JpcHQKfQoKYmluZCBMaXN0Ym94IDxCMS1Nb3Rpb24+IHsKICAgIHNldCB0a1ByaXYoeCkgJXgKICAgIHNldCB0a1ByaXYoeSkgJXkKICAgIHRrTGlzdGJveE1vdGlvbiAlVyBbJVcgaW5kZXggQCV4LCV5XQp9CmJpbmQgTGlzdGJveCA8QnV0dG9uUmVsZWFzZS0xPiB7CiAgICB0a0NhbmNlbFJlcGVhdAogICAgJVcgYWN0aXZhdGUgQCV4LCV5Cn0KYmluZCBMaXN0Ym94IDxTaGlmdC0xPiB7CiAgICB0a0xpc3Rib3hCZWdpbkV4dGVuZCAlVyBbJVcgaW5kZXggQCV4LCV5XQp9CmJpbmQgTGlzdGJveCA8Q29udHJvbC0xPiB7CiAgICB0a0xpc3Rib3hCZWdpblRvZ2dsZSAlVyBbJVcgaW5kZXggQCV4LCV5XQp9CmJpbmQgTGlzdGJveCA8QjEtTGVhdmU+IHsKICAgIHNldCB0a1ByaXYoeCkgJXgKICAgIHNldCB0a1ByaXYoeSkgJXkKICAgIHRrTGlzdGJveEF1dG9TY2FuICVXCn0KYmluZCBMaXN0Ym94IDxCMS1FbnRlcj4gewogICAgdGtDYW5jZWxSZXBlYXQKfQoKYmluZCBMaXN0Ym94IDxVcD4gewogICAgdGtMaXN0Ym94VXBEb3duICVXIC0xCn0KYmluZCBMaXN0Ym94IDxTaGlmdC1VcD4gewogICAgdGtMaXN0Ym94RXh0ZW5kVXBEb3duICVXIC0xCn0KYmluZCBMaXN0Ym94IDxEb3duPiB7CiAgICB0a0xpc3Rib3hVcERvd24gJVcgMQp9CmJpbmQgTGlzdGJveCA8U2hpZnQtRG93bj4gewogICAgdGtMaXN0Ym94RXh0ZW5kVXBEb3duICVXIDEKfQpiaW5kIExpc3Rib3ggPExlZnQ+IHsKICAgICVXIHh2aWV3IHNjcm9sbCAtMSB1bml0cwp9CmJpbmQgTGlzdGJveCA8Q29udHJvbC1MZWZ0PiB7CiAgICAlVyB4dmlldyBzY3JvbGwgLTEgcGFnZXMKfQpiaW5kIExpc3Rib3ggPFJpZ2h0PiB7CiAgICAlVyB4dmlldyBzY3JvbGwgMSB1bml0cwp9CmJpbmQgTGlzdGJveCA8Q29udHJvbC1SaWdodD4gewogICAgJVcgeHZpZXcgc2Nyb2xsIDEgcGFnZXMKfQpiaW5kIExpc3Rib3ggPFByaW9yPiB7CiAgICAlVyB5dmlldyBzY3JvbGwgLTEgcGFnZXMKICAgICVXIGFjdGl2YXRlIEAwLDAKfQpiaW5kIExpc3Rib3ggPE5leHQ+IHsKICAgICVXIHl2aWV3IHNjcm9sbCAxIHBhZ2VzCiAgICAlVyBhY3RpdmF0ZSBAMCwwCn0KYmluZCBMaXN0Ym94IDxDb250cm9sLVByaW9yPiB7CiAgICAlVyB4dmlldyBzY3JvbGwgLTEgcGFnZXMKfQpiaW5kIExpc3Rib3ggPENvbnRyb2wtTmV4dD4gewogICAgJVcgeHZpZXcgc2Nyb2xsIDEgcGFnZXMKfQpiaW5kIExpc3Rib3ggPEhvbWU+IHsKICAgICVXIHh2aWV3IG1vdmV0byAwCn0KYmluZCBMaXN0Ym94IDxFbmQ+IHsKICAgICVXIHh2aWV3IG1vdmV0byAxCn0KYmluZCBMaXN0Ym94IDxDb250cm9sLUhvbWU+IHsKICAgICVXIGFjdGl2YXRlIDAKICAgICVXIHNlZSAwCiAgICAlVyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQKICAgICVXIHNlbGVjdGlvbiBzZXQgMAogICAgZXZlbnQgZ2VuZXJhdGUgJVcgPDxMaXN0Ym94U2VsZWN0Pj4KfQpiaW5kIExpc3Rib3ggPFNoaWZ0LUNvbnRyb2wtSG9tZT4gewogICAgdGtMaXN0Ym94RGF0YUV4dGVuZCAlVyAwCn0KYmluZCBMaXN0Ym94IDxDb250cm9sLUVuZD4gewogICAgJVcgYWN0aXZhdGUgZW5kCiAgICAlVyBzZWUgZW5kCiAgICAlVyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQKICAgICVXIHNlbGVjdGlvbiBzZXQgZW5kCiAgICBldmVudCBnZW5lcmF0ZSAlVyA8PExpc3Rib3hTZWxlY3Q+Pgp9CmJpbmQgTGlzdGJveCA8U2hpZnQtQ29udHJvbC1FbmQ+IHsKICAgIHRrTGlzdGJveERhdGFFeHRlbmQgJVcgWyVXIGluZGV4IGVuZF0KfQpiaW5kIExpc3Rib3ggPDxDb3B5Pj4gewogICAgaWYge1tzdHJpbmcgZXF1YWwgW3NlbGVjdGlvbiBvd24gLWRpc3BsYXlvZiAlV10gIiVXIl19IHsKCWNsaXBib2FyZCBjbGVhciAtZGlzcGxheW9mICVXCgljbGlwYm9hcmQgYXBwZW5kIC1kaXNwbGF5b2YgJVcgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAlV10KICAgIH0KfQpiaW5kIExpc3Rib3ggPHNwYWNlPiB7CiAgICB0a0xpc3Rib3hCZWdpblNlbGVjdCAlVyBbJVcgaW5kZXggYWN0aXZlXQp9CmJpbmQgTGlzdGJveCA8U2VsZWN0PiB7CiAgICB0a0xpc3Rib3hCZWdpblNlbGVjdCAlVyBbJVcgaW5kZXggYWN0aXZlXQp9CmJpbmQgTGlzdGJveCA8Q29udHJvbC1TaGlmdC1zcGFjZT4gewogICAgdGtMaXN0Ym94QmVnaW5FeHRlbmQgJVcgWyVXIGluZGV4IGFjdGl2ZV0KfQpiaW5kIExpc3Rib3ggPFNoaWZ0LVNlbGVjdD4gewogICAgdGtMaXN0Ym94QmVnaW5FeHRlbmQgJVcgWyVXIGluZGV4IGFjdGl2ZV0KfQpiaW5kIExpc3Rib3ggPEVzY2FwZT4gewogICAgdGtMaXN0Ym94Q2FuY2VsICVXCn0KYmluZCBMaXN0Ym94IDxDb250cm9sLXNsYXNoPiB7CiAgICB0a0xpc3Rib3hTZWxlY3RBbGwgJVcKfQpiaW5kIExpc3Rib3ggPENvbnRyb2wtYmFja3NsYXNoPiB7CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFslVyBjZ2V0IC1zZWxlY3Rtb2RlXSAiYnJvd3NlIl19IHsKCSVXIHNlbGVjdGlvbiBjbGVhciAwIGVuZAoJZXZlbnQgZ2VuZXJhdGUgJVcgPDxMaXN0Ym94U2VsZWN0Pj4KICAgIH0KfQoKIyBBZGRpdGlvbmFsIFRrIGJpbmRpbmdzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE1vdGlmIGxvb2sgYW5kIGZlZWw6CgpiaW5kIExpc3Rib3ggPDI+IHsKICAgICVXIHNjYW4gbWFyayAleCAleQp9CmJpbmQgTGlzdGJveCA8QjItTW90aW9uPiB7CiAgICAlVyBzY2FuIGRyYWd0byAleCAleQp9CgojIFRoZSBNb3VzZVdoZWVsIHdpbGwgdHlwaWNhbGx5IG9ubHkgZmlyZSBvbiBXaW5kb3dzLiAgSG93ZXZlciwKIyBzb21lb25lIGNvdWxkIHVzZSB0aGUgImV2ZW50IGdlbmVyYXRlIiBjb21tYW5kIHRvIHByb2R1Y2Ugb25lCiMgb24gb3RoZXIgcGxhdGZvcm1zLgoKYmluZCBMaXN0Ym94IDxNb3VzZVdoZWVsPiB7CiAgICAlVyB5dmlldyBzY3JvbGwgW2V4cHIgey0gKCVEIC8gMTIwKSAqIDR9XSB1bml0cwp9CgppZiB7W3N0cmluZyBlcXVhbCAidW5peCIgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSldfSB7CiAgICAjIFN1cHBvcnQgZm9yIG1vdXNld2hlZWxzIG9uIExpbnV4L1VuaXggY29tbW9ubHkgY29tZXMgdGhyb3VnaCBtYXBwaW5nCiAgICAjIHRoZSB3aGVlbCB0byB0aGUgZXh0ZW5kZWQgYnV0dG9ucy4gIElmIHlvdSBoYXZlIGEgbW91c2V3aGVlbCwgZmluZAogICAgIyBMaW51eCBjb25maWd1cmF0aW9uIGluZm8gYXQ6CiAgICAjCWh0dHA6Ly93d3cuaW5yaWEuZnIva29hbGEvY29sYXMvbW91c2Utd2hlZWwtc2Nyb2xsLwogICAgYmluZCBMaXN0Ym94IDw0PiB7CglpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJICAgICVXIHl2aWV3IHNjcm9sbCAtNSB1bml0cwoJfQogICAgfQogICAgYmluZCBMaXN0Ym94IDw1PiB7CglpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJICAgICVXIHl2aWV3IHNjcm9sbCA1IHVuaXRzCgl9CiAgICB9Cn0KCiMgdGtMaXN0Ym94QmVnaW5TZWxlY3QgLS0KIwojIFRoaXMgcHJvY2VkdXJlIGlzIHR5cGljYWxseSBpbnZva2VkIG9uIGJ1dHRvbi0xIHByZXNzZXMuICBJdCBiZWdpbnMKIyB0aGUgcHJvY2VzcyBvZiBtYWtpbmcgYSBzZWxlY3Rpb24gaW4gdGhlIGxpc3Rib3guICBJdHMgZXhhY3QgYmVoYXZpb3IKIyBkZXBlbmRzIG9uIHRoZSBzZWxlY3Rpb24gbW9kZSBjdXJyZW50bHkgaW4gZWZmZWN0IGZvciB0aGUgbGlzdGJveDsKIyBzZWUgdGhlIE1vdGlmIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgbGlzdGJveCB3aWRnZXQuCiMgZWwgLQkJVGhlIGVsZW1lbnQgZm9yIHRoZSBzZWxlY3Rpb24gb3BlcmF0aW9uICh0eXBpY2FsbHkgdGhlCiMJCW9uZSB1bmRlciB0aGUgcG9pbnRlcikuICBNdXN0IGJlIGluIG51bWVyaWNhbCBmb3JtLgoKcHJvYyB0a0xpc3Rib3hCZWdpblNlbGVjdCB7dyBlbH0gewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXNlbGVjdG1vZGVdICJtdWx0aXBsZSJdfSB7CglpZiB7WyR3IHNlbGVjdGlvbiBpbmNsdWRlcyAkZWxdfSB7CgkgICAgJHcgc2VsZWN0aW9uIGNsZWFyICRlbAoJfSBlbHNlIHsKCSAgICAkdyBzZWxlY3Rpb24gc2V0ICRlbAoJfQogICAgfSBlbHNlIHsKCSR3IHNlbGVjdGlvbiBjbGVhciAwIGVuZAoJJHcgc2VsZWN0aW9uIHNldCAkZWwKCSR3IHNlbGVjdGlvbiBhbmNob3IgJGVsCglzZXQgdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pIHt9CglzZXQgdGtQcml2KGxpc3Rib3hQcmV2KSAkZWwKICAgIH0KICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+Cn0KCiMgdGtMaXN0Ym94TW90aW9uIC0tCiMKIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgdG8gcHJvY2VzcyBtb3VzZSBtb3Rpb24gZXZlbnRzIHdoaWxlCiMgYnV0dG9uIDEgaXMgZG93bi4gIEl0IG1heSBtb3ZlIG9yIGV4dGVuZCB0aGUgc2VsZWN0aW9uLCBkZXBlbmRpbmcKIyBvbiB0aGUgbGlzdGJveCdzIHNlbGVjdGlvbiBtb2RlLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0LgojIGVsIC0JCVRoZSBlbGVtZW50IHVuZGVyIHRoZSBwb2ludGVyIChtdXN0IGJlIGEgbnVtYmVyKS4KCnByb2MgdGtMaXN0Ym94TW90aW9uIHt3IGVsfSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7JGVsID09ICR0a1ByaXYobGlzdGJveFByZXYpfSB7CglyZXR1cm4KICAgIH0KICAgIHNldCBhbmNob3IgWyR3IGluZGV4IGFuY2hvcl0KICAgIHN3aXRjaCBbJHcgY2dldCAtc2VsZWN0bW9kZV0gewoJYnJvd3NlIHsKCSAgICAkdyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQKCSAgICAkdyBzZWxlY3Rpb24gc2V0ICRlbAoJICAgIHNldCB0a1ByaXYobGlzdGJveFByZXYpICRlbAoJICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+Cgl9CglleHRlbmRlZCB7CgkgICAgc2V0IGkgJHRrUHJpdihsaXN0Ym94UHJldikKCSAgICBpZiB7W3N0cmluZyBlcXVhbCB7fSAkaV19IHsKCQlzZXQgaSAkZWwKCQkkdyBzZWxlY3Rpb24gc2V0ICRlbAoJICAgIH0KCSAgICBpZiB7WyR3IHNlbGVjdGlvbiBpbmNsdWRlcyBhbmNob3JdfSB7CgkJJHcgc2VsZWN0aW9uIGNsZWFyICRpICRlbAoJCSR3IHNlbGVjdGlvbiBzZXQgYW5jaG9yICRlbAoJICAgIH0gZWxzZSB7CgkJJHcgc2VsZWN0aW9uIGNsZWFyICRpICRlbAoJCSR3IHNlbGVjdGlvbiBjbGVhciBhbmNob3IgJGVsCgkgICAgfQoJICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihsaXN0Ym94U2VsZWN0aW9uKV19IHsKCQlzZXQgdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pIFskdyBjdXJzZWxlY3Rpb25dCgkgICAgfQoJICAgIHdoaWxlIHsoJGkgPCAkZWwpICYmICgkaSA8ICRhbmNob3IpfSB7CgkJaWYge1tsc2VhcmNoICR0a1ByaXYobGlzdGJveFNlbGVjdGlvbikgJGldID49IDB9IHsKCQkgICAgJHcgc2VsZWN0aW9uIHNldCAkaQoJCX0KCQlpbmNyIGkKCSAgICB9CgkgICAgd2hpbGUgeygkaSA+ICRlbCkgJiYgKCRpID4gJGFuY2hvcil9IHsKCQlpZiB7W2xzZWFyY2ggJHRrUHJpdihsaXN0Ym94U2VsZWN0aW9uKSAkaV0gPj0gMH0gewoJCSAgICAkdyBzZWxlY3Rpb24gc2V0ICRpCgkJfQoJCWluY3IgaSAtMQoJICAgIH0KCSAgICBzZXQgdGtQcml2KGxpc3Rib3hQcmV2KSAkZWwKCSAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+PgoJfQogICAgfQp9CgojIHRrTGlzdGJveEJlZ2luRXh0ZW5kIC0tCiMKIyBUaGlzIHByb2NlZHVyZSBpcyB0eXBpY2FsbHkgaW52b2tlZCBvbiBzaGlmdC1idXR0b24tMSBwcmVzc2VzLiAgSXQKIyBiZWdpbnMgdGhlIHByb2Nlc3Mgb2YgZXh0ZW5kaW5nIGEgc2VsZWN0aW9uIGluIHRoZSBsaXN0Ym94LiAgSXRzCiMgZXhhY3QgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgc2VsZWN0aW9uIG1vZGUgY3VycmVudGx5IGluIGVmZmVjdAojIGZvciB0aGUgbGlzdGJveDsgIHNlZSB0aGUgTW90aWYgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4KIyBlbCAtCQlUaGUgZWxlbWVudCBmb3IgdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24gKHR5cGljYWxseSB0aGUKIwkJb25lIHVuZGVyIHRoZSBwb2ludGVyKS4gIE11c3QgYmUgaW4gbnVtZXJpY2FsIGZvcm0uCgpwcm9jIHRrTGlzdGJveEJlZ2luRXh0ZW5kIHt3IGVsfSB7CiAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc2VsZWN0bW9kZV0gImV4dGVuZGVkIl19IHsKCWlmIHtbJHcgc2VsZWN0aW9uIGluY2x1ZGVzIGFuY2hvcl19IHsKCSAgICB0a0xpc3Rib3hNb3Rpb24gJHcgJGVsCgl9IGVsc2UgewoJICAgICMgTm8gc2VsZWN0aW9uIHlldDsgc2ltdWxhdGUgdGhlIGJlZ2luLXNlbGVjdCBvcGVyYXRpb24uCgkgICAgdGtMaXN0Ym94QmVnaW5TZWxlY3QgJHcgJGVsCgl9CiAgICB9Cn0KCiMgdGtMaXN0Ym94QmVnaW5Ub2dnbGUgLS0KIwojIFRoaXMgcHJvY2VkdXJlIGlzIHR5cGljYWxseSBpbnZva2VkIG9uIGNvbnRyb2wtYnV0dG9uLTEgcHJlc3Nlcy4gIEl0CiMgYmVnaW5zIHRoZSBwcm9jZXNzIG9mIHRvZ2dsaW5nIGEgc2VsZWN0aW9uIGluIHRoZSBsaXN0Ym94LiAgSXRzCiMgZXhhY3QgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgc2VsZWN0aW9uIG1vZGUgY3VycmVudGx5IGluIGVmZmVjdAojIGZvciB0aGUgbGlzdGJveDsgIHNlZSB0aGUgTW90aWYgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4KIyBlbCAtCQlUaGUgZWxlbWVudCBmb3IgdGhlIHNlbGVjdGlvbiBvcGVyYXRpb24gKHR5cGljYWxseSB0aGUKIwkJb25lIHVuZGVyIHRoZSBwb2ludGVyKS4gIE11c3QgYmUgaW4gbnVtZXJpY2FsIGZvcm0uCgpwcm9jIHRrTGlzdGJveEJlZ2luVG9nZ2xlIHt3IGVsfSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc2VsZWN0bW9kZV0gImV4dGVuZGVkIl19IHsKCXNldCB0a1ByaXYobGlzdGJveFNlbGVjdGlvbikgWyR3IGN1cnNlbGVjdGlvbl0KCXNldCB0a1ByaXYobGlzdGJveFByZXYpICRlbAoJJHcgc2VsZWN0aW9uIGFuY2hvciAkZWwKCWlmIHtbJHcgc2VsZWN0aW9uIGluY2x1ZGVzICRlbF19IHsKCSAgICAkdyBzZWxlY3Rpb24gY2xlYXIgJGVsCgl9IGVsc2UgewoJICAgICR3IHNlbGVjdGlvbiBzZXQgJGVsCgl9CglldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+PgogICAgfQp9CgojIHRrTGlzdGJveEF1dG9TY2FuIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYW4gZW50cnkgd2luZG93CiMgd2l0aCBidXR0b24gMSBkb3duLiAgSXQgc2Nyb2xscyB0aGUgd2luZG93IHVwLCBkb3duLCBsZWZ0LCBvcgojIHJpZ2h0LCBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIG1vdXNlIGxlZnQgdGhlIHdpbmRvdywgYW5kIHJlc2NoZWR1bGVzCiMgaXRzZWxmIGFzIGFuICJhZnRlciIgY29tbWFuZCBzbyB0aGF0IHRoZSB3aW5kb3cgY29udGludWVzIHRvIHNjcm9sbCB1bnRpbAojIHRoZSBtb3VzZSBtb3ZlcyBiYWNrIGludG8gdGhlIHdpbmRvdyBvciB0aGUgbW91c2UgYnV0dG9uIGlzIHJlbGVhc2VkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGVudHJ5IHdpbmRvdy4KCnByb2MgdGtMaXN0Ym94QXV0b1NjYW4ge3d9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHJldHVybgogICAgc2V0IHggJHRrUHJpdih4KQogICAgc2V0IHkgJHRrUHJpdih5KQogICAgaWYgeyR5ID49IFt3aW5mbyBoZWlnaHQgJHddfSB7CgkkdyB5dmlldyBzY3JvbGwgMSB1bml0cwogICAgfSBlbHNlaWYgeyR5IDwgMH0gewoJJHcgeXZpZXcgc2Nyb2xsIC0xIHVuaXRzCiAgICB9IGVsc2VpZiB7JHggPj0gW3dpbmZvIHdpZHRoICR3XX0gewoJJHcgeHZpZXcgc2Nyb2xsIDIgdW5pdHMKICAgIH0gZWxzZWlmIHskeCA8IDB9IHsKCSR3IHh2aWV3IHNjcm9sbCAtMiB1bml0cwogICAgfSBlbHNlIHsKCXJldHVybgogICAgfQogICAgdGtMaXN0Ym94TW90aW9uICR3IFskdyBpbmRleCBAJHgsJHldCiAgICBzZXQgdGtQcml2KGFmdGVySWQpIFthZnRlciA1MCBbbGlzdCB0a0xpc3Rib3hBdXRvU2NhbiAkd11dCn0KCiMgdGtMaXN0Ym94VXBEb3duIC0tCiMKIyBNb3ZlcyB0aGUgbG9jYXRpb24gY3Vyc29yIChhY3RpdmUgZWxlbWVudCkgdXAgb3IgZG93biBieSBvbmUgZWxlbWVudCwKIyBhbmQgY2hhbmdlcyB0aGUgc2VsZWN0aW9uIGlmIHdlJ3JlIGluIGJyb3dzZSBvciBleHRlbmRlZCBzZWxlY3Rpb24KIyBtb2RlLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0LgojIGFtb3VudCAtCSsxIHRvIG1vdmUgZG93biBvbmUgaXRlbSwgLTEgdG8gbW92ZSBiYWNrIG9uZSBpdGVtLgoKcHJvYyB0a0xpc3Rib3hVcERvd24ge3cgYW1vdW50fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICAkdyBhY3RpdmF0ZSBbZXhwciB7WyR3IGluZGV4IGFjdGl2ZV0gKyAkYW1vdW50fV0KICAgICR3IHNlZSBhY3RpdmUKICAgIHN3aXRjaCBbJHcgY2dldCAtc2VsZWN0bW9kZV0gewoJYnJvd3NlIHsKCSAgICAkdyBzZWxlY3Rpb24gY2xlYXIgMCBlbmQKCSAgICAkdyBzZWxlY3Rpb24gc2V0IGFjdGl2ZQoJICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+Cgl9CglleHRlbmRlZCB7CgkgICAgJHcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kCgkgICAgJHcgc2VsZWN0aW9uIHNldCBhY3RpdmUKCSAgICAkdyBzZWxlY3Rpb24gYW5jaG9yIGFjdGl2ZQoJICAgIHNldCB0a1ByaXYobGlzdGJveFByZXYpIFskdyBpbmRleCBhY3RpdmVdCgkgICAgc2V0IHRrUHJpdihsaXN0Ym94U2VsZWN0aW9uKSB7fQoJICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+Cgl9CiAgICB9Cn0KCiMgdGtMaXN0Ym94RXh0ZW5kVXBEb3duIC0tCiMKIyBEb2VzIG5vdGhpbmcgdW5sZXNzIHdlJ3JlIGluIGV4dGVuZGVkIHNlbGVjdGlvbiBtb2RlOyAgaW4gdGhpcwojIGNhc2UgaXQgbW92ZXMgdGhlIGxvY2F0aW9uIGN1cnNvciAoYWN0aXZlIGVsZW1lbnQpIHVwIG9yIGRvd24gYnkKIyBvbmUgZWxlbWVudCwgYW5kIGV4dGVuZHMgdGhlIHNlbGVjdGlvbiB0byB0aGF0IHBvaW50LgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0LgojIGFtb3VudCAtCSsxIHRvIG1vdmUgZG93biBvbmUgaXRlbSwgLTEgdG8gbW92ZSBiYWNrIG9uZSBpdGVtLgoKcHJvYyB0a0xpc3Rib3hFeHRlbmRVcERvd24ge3cgYW1vdW50fSB7CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zZWxlY3Rtb2RlXSAiZXh0ZW5kZWQiXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgYWN0aXZlIFskdyBpbmRleCBhY3RpdmVdCiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0a1ByaXYobGlzdGJveFNlbGVjdGlvbildfSB7CglnbG9iYWwgdGtQcml2CgkkdyBzZWxlY3Rpb24gc2V0ICRhY3RpdmUKCXNldCB0a1ByaXYobGlzdGJveFNlbGVjdGlvbikgWyR3IGN1cnNlbGVjdGlvbl0KICAgIH0KICAgICR3IGFjdGl2YXRlIFtleHByIHskYWN0aXZlICsgJGFtb3VudH1dCiAgICAkdyBzZWUgYWN0aXZlCiAgICB0a0xpc3Rib3hNb3Rpb24gJHcgWyR3IGluZGV4IGFjdGl2ZV0KfQoKIyB0a0xpc3Rib3hEYXRhRXh0ZW5kCiMKIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgZm9yIGtleS1wcmVzc2VzIHN1Y2ggYXMgU2hpZnQtS0VuZERhdGEuCiMgSWYgdGhlIHNlbGVjdGlvbiBtb2RlIGlzbid0IG11bHRpcGxlIG9yIGV4dGVuZCB0aGVuIGl0IGRvZXMgbm90aGluZy4KIyBPdGhlcndpc2UgaXQgbW92ZXMgdGhlIGFjdGl2ZSBlbGVtZW50IHRvIGVsIGFuZCwgaWYgd2UncmUgaW4KIyBleHRlbmRlZCBtb2RlLCBleHRlbmRzIHRoZSBzZWxlY3Rpb24gdG8gdGhhdCBwb2ludC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBsaXN0Ym94IHdpZGdldC4KIyBlbCAtCQlBbiBpbnRlZ2VyIGVsZW1lbnQgbnVtYmVyLgoKcHJvYyB0a0xpc3Rib3hEYXRhRXh0ZW5kIHt3IGVsfSB7CiAgICBzZXQgbW9kZSBbJHcgY2dldCAtc2VsZWN0bW9kZV0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRtb2RlICJleHRlbmRlZCJdfSB7CgkkdyBhY3RpdmF0ZSAkZWwKCSR3IHNlZSAkZWwKICAgICAgICBpZiB7WyR3IHNlbGVjdGlvbiBpbmNsdWRlcyBhbmNob3JdfSB7CgkgICAgdGtMaXN0Ym94TW90aW9uICR3ICRlbAoJfQogICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJG1vZGUgIm11bHRpcGxlIl19IHsKCSR3IGFjdGl2YXRlICRlbAoJJHcgc2VlICRlbAogICAgfQp9CgojIHRrTGlzdGJveENhbmNlbAojCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBjYW5jZWwgYW4gZXh0ZW5kZWQgc2VsZWN0aW9uIGluCiMgcHJvZ3Jlc3MuICBJZiB0aGVyZSBpcyBhbiBleHRlbmRlZCBzZWxlY3Rpb24gaW4gcHJvZ3Jlc3MsIGl0CiMgcmVzdG9yZXMgYWxsIG9mIHRoZSBpdGVtcyBiZXR3ZWVuIHRoZSBhY3RpdmUgb25lIGFuZCB0aGUgYW5jaG9yCiMgdG8gdGhlaXIgcHJldmlvdXMgc2VsZWN0aW9uIHN0YXRlLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0LgoKcHJvYyB0a0xpc3Rib3hDYW5jZWwgdyB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zZWxlY3Rtb2RlXSAiZXh0ZW5kZWQiXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgZmlyc3QgWyR3IGluZGV4IGFuY2hvcl0KICAgIHNldCBsYXN0ICR0a1ByaXYobGlzdGJveFByZXYpCiAgICBpZiB7JGZpcnN0ID4gJGxhc3R9IHsKCXNldCB0bXAgJGZpcnN0CglzZXQgZmlyc3QgJGxhc3QKCXNldCBsYXN0ICR0bXAKICAgIH0KICAgICR3IHNlbGVjdGlvbiBjbGVhciAkZmlyc3QgJGxhc3QKICAgIHdoaWxlIHskZmlyc3QgPD0gJGxhc3R9IHsKCWlmIHtbbHNlYXJjaCAkdGtQcml2KGxpc3Rib3hTZWxlY3Rpb24pICRmaXJzdF0gPj0gMH0gewoJICAgICR3IHNlbGVjdGlvbiBzZXQgJGZpcnN0Cgl9CglpbmNyIGZpcnN0CiAgICB9CiAgICBldmVudCBnZW5lcmF0ZSAkdyA8PExpc3Rib3hTZWxlY3Q+Pgp9CgojIHRrTGlzdGJveFNlbGVjdEFsbAojCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBoYW5kbGUgdGhlICJzZWxlY3QgYWxsIiBvcGVyYXRpb24uCiMgRm9yIHNpbmdsZSBhbmQgYnJvd3NlIG1vZGUsIGl0IGp1c3Qgc2VsZWN0cyB0aGUgYWN0aXZlIGVsZW1lbnQuCiMgT3RoZXJ3aXNlIGl0IHNlbGVjdHMgZXZlcnl0aGluZyBpbiB0aGUgd2lkZ2V0LgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIGxpc3Rib3ggd2lkZ2V0LgoKcHJvYyB0a0xpc3Rib3hTZWxlY3RBbGwgdyB7CiAgICBzZXQgbW9kZSBbJHcgY2dldCAtc2VsZWN0bW9kZV0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRtb2RlICJzaW5nbGUiXSB8fCBbc3RyaW5nIGVxdWFsICRtb2RlICJicm93c2UiXX0gewoJJHcgc2VsZWN0aW9uIGNsZWFyIDAgZW5kCgkkdyBzZWxlY3Rpb24gc2V0IGFjdGl2ZQogICAgfSBlbHNlIHsKCSR3IHNlbGVjdGlvbiBzZXQgMCBlbmQKICAgIH0KICAgIGV2ZW50IGdlbmVyYXRlICR3IDw8TGlzdGJveFNlbGVjdD4+Cn0KAACMHiMgbWVudS50Y2wgLS0KIwojIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayBtZW51cyBhbmQgbWVudWJ1dHRvbnMuCiMgSXQgYWxzbyBpbXBsZW1lbnRzIGtleWJvYXJkIHRyYXZlcnNhbCBvZiBtZW51cyBhbmQgaW1wbGVtZW50cyBhIGZldwojIG90aGVyIHV0aWxpdHkgcHJvY2VkdXJlcyByZWxhdGVkIHRvIG1lbnVzLgojCiMgUkNTOiBAKCMpICRJZDogbWVudS50Y2wsdiAxLjggMTk5OS8wOS8wMiAxNzowMjo1MiBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMgQ29weXJpZ2h0IChjKSAxOTk4LTE5OTkgYnkgU2NyaXB0aWNzIENvcnBvcmF0aW9uLgojCiMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uCiMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KIwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFbGVtZW50cyBvZiB0a1ByaXYgdGhhdCBhcmUgdXNlZCBpbiB0aGlzIGZpbGU6CiMKIyBjdXJzb3IgLQkJU2F2ZXMgdGhlIC1jdXJzb3Igb3B0aW9uIGZvciB0aGUgcG9zdGVkIG1lbnVidXR0b24uCiMgZm9jdXMgLQkJU2F2ZXMgdGhlIGZvY3VzIGR1cmluZyBhIG1lbnUgc2VsZWN0aW9uIG9wZXJhdGlvbi4KIwkJCUZvY3VzIGdldHMgcmVzdG9yZWQgaGVyZSB3aGVuIHRoZSBtZW51IGlzIHVucG9zdGVkLgojIGdyYWJHbG9iYWwgLQkJVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRrUHJpdihvbGRHcmFiKTogIGlmCiMJCQl0a1ByaXYob2xkR3JhYikgaXMgbm9uLWVtcHR5LCB0aGVuIHRrUHJpdihncmFiR2xvYmFsKQojCQkJY29udGFpbnMgZWl0aGVyIGFuIGVtcHR5IHN0cmluZyBvciAiLWdsb2JhbCIgdG8KIwkJCWluZGljYXRlIHdoZXRoZXIgdGhlIG9sZCBncmFiIHdhcyBhIGxvY2FsIG9uZSBvcgojCQkJYSBnbG9iYWwgb25lLgojIGluTWVudWJ1dHRvbiAtCVRoZSBuYW1lIG9mIHRoZSBtZW51YnV0dG9uIHdpZGdldCBjb250YWluaW5nCiMJCQl0aGUgbW91c2UsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgbW91c2UgaXMKIwkJCW5vdCBvdmVyIGFueSBtZW51YnV0dG9uLgojIG1lbnVCYXIgLQkJVGhlIG5hbWUgb2YgdGhlIG1lbnViYXIgdGhhdCBpcyB0aGUgcm9vdAojCQkJb2YgdGhlIGNhc2NhZGUgaGllcmFyY2h5IHdoaWNoIGlzIGN1cnJlbnRseQojCQkJcG9zdGVkLiBUaGlzIGlzIG51bGwgd2hlbiB0aGVyZSBpcyBubyBtZW51IGN1cnJlbnRseQojCQkJYmVpbmcgcHVsbGVkIGRvd24gZnJvbSBhIG1lbnUgYmFyLgojIG9sZEdyYWIgLQkJV2luZG93IHRoYXQgaGFkIHRoZSBncmFiIGJlZm9yZSBhIG1lbnUgd2FzIHBvc3RlZC4KIwkJCVVzZWQgdG8gcmVzdG9yZSB0aGUgZ3JhYiBzdGF0ZSBhZnRlciB0aGUgbWVudQojCQkJaXMgdW5wb3N0ZWQuICBFbXB0eSBzdHJpbmcgbWVhbnMgdGhlcmUgd2FzIG5vCiMJCQlncmFiIHByZXZpb3VzbHkgc2V0LgojIHBvcHVwIC0JCUlmIGEgbWVudSBoYXMgYmVlbiBwb3BwZWQgdXAgdmlhIHRrX3BvcHVwLCB0aGlzCiMJCQlnaXZlcyB0aGUgbmFtZSBvZiB0aGUgbWVudS4gIE90aGVyd2lzZSB0aGlzCiMJCQl2YWx1ZSBpcyBlbXB0eS4KIyBwb3N0ZWRNYiAtCQlOYW1lIG9mIHRoZSBtZW51YnV0dG9uIHdob3NlIG1lbnUgaXMgY3VycmVudGx5CiMJCQlwb3N0ZWQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIGlzIHBvc3RlZAojCQkJQSBncmFiIGlzIHNldCBvbiB0aGlzIHdpZGdldC4KIyByZWxpZWYgLQkJVXNlZCB0byBzYXZlIHRoZSBvcmlnaW5hbCByZWxpZWYgb2YgdGhlIGN1cnJlbnQKIwkJCW1lbnVidXR0b24uCiMgd2luZG93IC0JCVdoZW4gdGhlIG1vdXNlIGlzIG92ZXIgYSBtZW51LCB0aGlzIGhvbGRzIHRoZQojCQkJbmFtZSBvZiB0aGUgbWVudTsgIGl0J3MgY2xlYXJlZCB3aGVuIHRoZSBtb3VzZQojCQkJbGVhdmVzIHRoZSBtZW51LgojIHRlYXJvZmYgLQkJV2hldGhlciB0aGUgbGFzdCBtZW51IHBvc3RlZCB3YXMgYSB0ZWFyb2ZmIG9yIG5vdC4KIwkJCVRoaXMgaXMgdHJ1ZSBhbHdheXMgZm9yIHVuaXgsIGZvciB0ZWFyb2ZmcyBmb3IgTWFjCiMJCQlhbmQgV2luZG93cy4KIyBhY3RpdmVNZW51IC0JCVRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIG1lbnUgZm9yIHVzZQojCQkJd2l0aCB0aGUgPDxNZW51U2VsZWN0Pj4gdmlydHVhbCBldmVudC4KIyBhY3RpdmVJdGVtIC0JCVRoaXMgaXMgdGhlIGxhc3QgYWN0aXZlIG1lbnUgaXRlbSBmb3IKIwkJCXVzZSB3aXRoIHRoZSA8PE1lbnVTZWxlY3Q+PiB2aXJ0dWFsIGV2ZW50LgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBPdmVyYWxsIG5vdGU6CiMgVGhpcyBmaWxlIGlzIHRyaWNreSBiZWNhdXNlIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCB3YXlzIHRoYXQgbWVudXMKIyBjYW4gYmUgdXNlZDoKIwojIDEuIEFzIGEgcHVsbGRvd24gZnJvbSBhIG1lbnVidXR0b24uIEluIHRoaXMgc3R5bGUsIHRoZSB2YXJpYWJsZSAKIyAgICB0a1ByaXYocG9zdGVkTWIpIGlkZW50aWZpZXMgdGhlIHBvc3RlZCBtZW51YnV0dG9uLgojIDIuIEFzIGEgdG9ybi1vZmYgbWVudSBjb3BpZWQgZnJvbSBzb21lIG90aGVyIG1lbnUuICBJbiB0aGlzIHN0eWxlCiMgICAgdGtQcml2KHBvc3RlZE1iKSBpcyBlbXB0eSwgYW5kIG1lbnUncyB0eXBlIGlzICJ0ZWFyb2ZmIi4KIyAzLiBBcyBhbiBvcHRpb24gbWVudSwgdHJpZ2dlcmVkIGZyb20gYW4gb3B0aW9uIG1lbnVidXR0b24uICBJbiB0aGlzCiMgICAgc3R5bGUgdGtQcml2KHBvc3RlZE1iKSBpZGVudGlmaWVzIHRoZSBwb3N0ZWQgbWVudWJ1dHRvbi4KIyA0LiBBcyBhIHBvcHVwIG1lbnUuICBJbiB0aGlzIHN0eWxlIHRrUHJpdihwb3N0ZWRNYikgaXMgZW1wdHkgYW5kCiMgICAgdGhlIHRvcC1sZXZlbCBtZW51J3MgdHlwZSBpcyAibm9ybWFsIi4KIyA1LiBBcyBhIHB1bGxkb3duIGZyb20gYSBtZW51YmFyLiBUaGUgdmFyaWFibGUgdGtQcml2KG1lbnViYXIpIGhhcwojICAgIHRoZSBvd25pbmcgbWVudWJhciwgYW5kIHRoZSBtZW51IGl0c2VsZiBpcyBvZiB0eXBlICJub3JtYWwiLgojCiMgVGhlIHZhcmlvdXMgYmluZGluZyBwcm9jZWR1cmVzIHVzZSB0aGUgIHN0YXRlIGRlc2NyaWJlZCBhYm92ZSB0bwojIGRpc3Rpbmd1aXNoIHRoZSB2YXJpb3VzIGNhc2VzIGFuZCB0YWtlIGRpZmZlcmVudCBhY3Rpb25zIGluIGVhY2gKIyBjYXNlLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBtZW51cwojIGFuZCBtZW51YnV0dG9ucy4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmJpbmQgTWVudWJ1dHRvbiA8Rm9jdXNJbj4ge30KYmluZCBNZW51YnV0dG9uIDxFbnRlcj4gewogICAgdGtNYkVudGVyICVXCn0KYmluZCBNZW51YnV0dG9uIDxMZWF2ZT4gewogICAgdGtNYkxlYXZlICVXCn0KYmluZCBNZW51YnV0dG9uIDwxPiB7CiAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYoaW5NZW51YnV0dG9uKSAiIl19IHsKCXRrTWJQb3N0ICR0a1ByaXYoaW5NZW51YnV0dG9uKSAlWCAlWQogICAgfQp9CmJpbmQgTWVudWJ1dHRvbiA8TW90aW9uPiB7CiAgICB0a01iTW90aW9uICVXIHVwICVYICVZCn0KYmluZCBNZW51YnV0dG9uIDxCMS1Nb3Rpb24+IHsKICAgIHRrTWJNb3Rpb24gJVcgZG93biAlWCAlWQp9CmJpbmQgTWVudWJ1dHRvbiA8QnV0dG9uUmVsZWFzZS0xPiB7CiAgICB0a01iQnV0dG9uVXAgJVcKfQpiaW5kIE1lbnVidXR0b24gPHNwYWNlPiB7CiAgICB0a01iUG9zdCAlVwogICAgdGtNZW51Rmlyc3RFbnRyeSBbJVcgY2dldCAtbWVudV0KfQoKIyBNdXN0IHNldCBmb2N1cyB3aGVuIG1vdXNlIGVudGVycyBhIG1lbnUsIGluIG9yZGVyIHRvIGFsbG93CiMgbWl4ZWQtbW9kZSBwcm9jZXNzaW5nIHVzaW5nIGJvdGggdGhlIG1vdXNlIGFuZCB0aGUga2V5Ym9hcmQuCiMgRG9uJ3Qgc2V0IHRoZSBmb2N1cyBpZiB0aGUgZXZlbnQgY29tZXMgZnJvbSBhIGdyYWIgcmVsZWFzZSwKIyB0aG91Z2g6ICBzdWNoIGFuIGV2ZW50IGNhbiBoYXBwZW4gYWZ0ZXIgYXMgcGFydCBvZiB1bnBvc3RpbmcKIyBhIGNhc2NhZGVkIGNoYWluIG9mIG1lbnVzLCBhZnRlciB0aGUgZm9jdXMgaGFzIGFscmVhZHkgYmVlbgojIHJlc3RvcmVkIHRvIHdoZXJldmVyIGl0IHdhcyBiZWZvcmUgbWVudSBzZWxlY3Rpb24gc3RhcnRlZC4KCmJpbmQgTWVudSA8Rm9jdXNJbj4ge30KCmJpbmQgTWVudSA8RW50ZXI+IHsKICAgIHNldCB0a1ByaXYod2luZG93KSAlVwogICAgaWYge1tzdHJpbmcgZXF1YWwgWyVXIGNnZXQgLXR5cGVdICJ0ZWFyb2ZmIl19IHsKCWlmIHtbc3RyaW5nIGNvbXBhcmUgIiVtIiAiTm90aWZ5VW5ncmFiIl19IHsKCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7CgkJdGtfbWVudVNldEZvY3VzICVXCgkgICAgfQoJfQogICAgfQogICAgdGtNZW51TW90aW9uICVXICV4ICV5ICVzCn0KCmJpbmQgTWVudSA8TGVhdmU+IHsKICAgIHRrTWVudUxlYXZlICVXICVYICVZICVzCn0KYmluZCBNZW51IDxNb3Rpb24+IHsKICAgIHRrTWVudU1vdGlvbiAlVyAleCAleSAlcwp9CmJpbmQgTWVudSA8QnV0dG9uUHJlc3M+IHsKICAgIHRrTWVudUJ1dHRvbkRvd24gJVcKfQpiaW5kIE1lbnUgPEJ1dHRvblJlbGVhc2U+IHsKICAgdGtNZW51SW52b2tlICVXIDEKfQpiaW5kIE1lbnUgPHNwYWNlPiB7CiAgICB0a01lbnVJbnZva2UgJVcgMAp9CmJpbmQgTWVudSA8UmV0dXJuPiB7CiAgICB0a01lbnVJbnZva2UgJVcgMAp9CmJpbmQgTWVudSA8RXNjYXBlPiB7CiAgICB0a01lbnVFc2NhcGUgJVcKfQpiaW5kIE1lbnUgPExlZnQ+IHsKICAgIHRrTWVudUxlZnRBcnJvdyAlVwp9CmJpbmQgTWVudSA8UmlnaHQ+IHsKICAgIHRrTWVudVJpZ2h0QXJyb3cgJVcKfQpiaW5kIE1lbnUgPFVwPiB7CiAgICB0a01lbnVVcEFycm93ICVXCn0KYmluZCBNZW51IDxEb3duPiB7CiAgICB0a01lbnVEb3duQXJyb3cgJVcKfQpiaW5kIE1lbnUgPEtleVByZXNzPiB7CiAgICB0a1RyYXZlcnNlV2l0aGluTWVudSAlVyAlQQp9CgojIFRoZSBmb2xsb3dpbmcgYmluZGluZ3MgYXBwbHkgdG8gYWxsIHdpbmRvd3MsIGFuZCBhcmUgdXNlZCB0bwojIGltcGxlbWVudCBrZXlib2FyZCBtZW51IHRyYXZlcnNhbC4KCmlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il19IHsKICAgIGJpbmQgYWxsIDxBbHQtS2V5UHJlc3M+IHsKCXRrVHJhdmVyc2VUb01lbnUgJVcgJUEKICAgIH0KCiAgICBiaW5kIGFsbCA8RjEwPiB7Cgl0a0ZpcnN0TWVudSAlVwogICAgfQp9IGVsc2UgewogICAgYmluZCBNZW51YnV0dG9uIDxBbHQtS2V5UHJlc3M+IHsKCXRrVHJhdmVyc2VUb01lbnUgJVcgJUEKICAgIH0KCiAgICBiaW5kIE1lbnVidXR0b24gPEYxMD4gewoJdGtGaXJzdE1lbnUgJVcKICAgIH0KfQoKIyB0a01iRW50ZXIgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gdGhlIG1vdXNlIGVudGVycyBhIG1lbnVidXR0b24KIyB3aWRnZXQuICBJdCBhY3RpdmF0ZXMgdGhlIHdpZGdldCB1bmxlc3MgaXQgaXMgZGlzYWJsZWQuICBOb3RlOgojIHRoaXMgcHJvY2VkdXJlIGlzIG9ubHkgaW52b2tlZCB3aGVuIG1vdXNlIGJ1dHRvbiAxIGlzICpub3QqIGRvd24uCiMgVGhlIHByb2NlZHVyZSB0a01iQjFFbnRlciBpcyBpbnZva2VkIGlmIHRoZSBidXR0b24gaXMgZG93bi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCQlUaGUgIG5hbWUgb2YgdGhlIHdpZGdldC4KCnByb2MgdGtNYkVudGVyIHcgewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihpbk1lbnVidXR0b24pICIiXX0gewoJdGtNYkxlYXZlICR0a1ByaXYoaW5NZW51YnV0dG9uKQogICAgfQogICAgc2V0IHRrUHJpdihpbk1lbnVidXR0b24pICR3CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCSR3IGNvbmZpZ3VyZSAtc3RhdGUgYWN0aXZlCiAgICB9Cn0KCiMgdGtNYkxlYXZlIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSBtZW51YnV0dG9uIHdpZGdldC4KIyBJdCBkZS1hY3RpdmF0ZXMgdGhlIHdpZGdldCwgaWYgdGhlIHdpZGdldCBzdGlsbCBleGlzdHMuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJVGhlICBuYW1lIG9mIHRoZSB3aWRnZXQuCgpwcm9jIHRrTWJMZWF2ZSB3IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICBzZXQgdGtQcml2KGluTWVudWJ1dHRvbikge30KICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkd119IHsKCXJldHVybgogICAgfQogICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAiYWN0aXZlIl19IHsKCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCiAgICB9Cn0KCiMgdGtNYlBvc3QgLS0KIyBHaXZlbiBhIG1lbnVidXR0b24sIHRoaXMgcHJvY2VkdXJlIGRvZXMgYWxsIHRoZSB3b3JrIG9mIHBvc3RpbmcKIyBpdHMgYXNzb2NpYXRlZCBtZW51IGFuZCB1bnBvc3RpbmcgYW55IG90aGVyIG1lbnUgdGhhdCBpcyBjdXJyZW50bHkKIyBwb3N0ZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJVGhlIG5hbWUgb2YgdGhlIG1lbnVidXR0b24gd2lkZ2V0IHdob3NlIG1lbnUKIwkJCWlzIHRvIGJlIHBvc3RlZC4KIyB4LCB5IC0JCVJvb3QgY29vcmRpbmF0ZXMgb2YgY3Vyc29yLCB1c2VkIGZvciBwb3NpdGlvbmluZwojCQkJb3B0aW9uIG1lbnVzLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgY2VudGVyCiMJCQlvZiB0aGUgbWVudWJ1dHRvbiBpcyB1c2VkIGZvciBhbiBvcHRpb24gbWVudS4KCnByb2MgdGtNYlBvc3Qge3cge3gge319IHt5IHt9fX0gewogICAgZ2xvYmFsIHRrUHJpdiBlcnJvckluZm8KICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KCiAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdIHx8IFwKCSAgICBbc3RyaW5nIGVxdWFsICR3ICR0a1ByaXYocG9zdGVkTWIpXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgbWVudSBbJHcgY2dldCAtbWVudV0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRtZW51ICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgdGVhcm9mZiBbZXhwciB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdIFwKCSAgICB8fCBbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAidGVhcm9mZiJdfV0KICAgIGlmIHtbc3RyaW5nIGZpcnN0ICR3ICRtZW51XSAhPSAwfSB7CgllcnJvciAiY2FuJ3QgcG9zdCAkbWVudTogIGl0IGlzbid0IGEgZGVzY2VuZGFudCBvZiAkdyAodGhpcyBpcyBhIG5ldyByZXF1aXJlbWVudCBpbiBUayB2ZXJzaW9ucyAzLjAgYW5kIGxhdGVyKSIKICAgIH0KICAgIHNldCBjdXIgJHRrUHJpdihwb3N0ZWRNYikKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGN1ciAiIl19IHsKCXRrTWVudVVucG9zdCB7fQogICAgfQogICAgc2V0IHRrUHJpdihjdXJzb3IpIFskdyBjZ2V0IC1jdXJzb3JdCiAgICBzZXQgdGtQcml2KHJlbGllZikgWyR3IGNnZXQgLXJlbGllZl0KICAgICR3IGNvbmZpZ3VyZSAtY3Vyc29yIGFycm93CiAgICAkdyBjb25maWd1cmUgLXJlbGllZiByYWlzZWQKCiAgICBzZXQgdGtQcml2KHBvc3RlZE1iKSAkdwogICAgc2V0IHRrUHJpdihmb2N1cykgW2ZvY3VzXQogICAgJG1lbnUgYWN0aXZhdGUgbm9uZQogICAgdGtHZW5lcmF0ZU1lbnVTZWxlY3QgJG1lbnUKCiAgICAjIElmIHRoaXMgbG9va3MgbGlrZSBhbiBvcHRpb24gbWVudWJ1dHRvbiB0aGVuIHBvc3QgdGhlIG1lbnUgc28KICAgICMgdGhhdCB0aGUgY3VycmVudCBlbnRyeSBpcyBvbiB0b3Agb2YgdGhlIG1vdXNlLiAgT3RoZXJ3aXNlIHBvc3QKICAgICMgdGhlIG1lbnUganVzdCBiZWxvdyB0aGUgbWVudWJ1dHRvbiwgYXMgZm9yIGEgcHVsbC1kb3duLgoKICAgIHVwZGF0ZSBpZGxldGFza3MKICAgIGlmIHtbY2F0Y2ggewoJc3dpdGNoIFskdyBjZ2V0IC1kaXJlY3Rpb25dIHsKICAgIAkgICAgYWJvdmUgewogICAgCSAgICAJc2V0IHggW3dpbmZvIHJvb3R4ICR3XQogICAgCSAgICAJc2V0IHkgW2V4cHIge1t3aW5mbyByb290eSAkd10gLSBbd2luZm8gcmVxaGVpZ2h0ICRtZW51XX1dCiAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5CiAgICAJICAgIH0KICAgIAkgICAgYmVsb3cgewogICAgCSAgICAJc2V0IHggW3dpbmZvIHJvb3R4ICR3XQogICAgCSAgICAJc2V0IHkgW2V4cHIge1t3aW5mbyByb290eSAkd10gKyBbd2luZm8gaGVpZ2h0ICR3XX1dCiAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5CiAgICAJICAgIH0KICAgIAkgICAgbGVmdCB7CiAgICAJICAgIAlzZXQgeCBbZXhwciB7W3dpbmZvIHJvb3R4ICR3XSAtIFt3aW5mbyByZXF3aWR0aCAkbWVudV19XQogICAgCSAgICAJc2V0IHkgW2V4cHIgeygyICogW3dpbmZvIHJvb3R5ICR3XSArIFt3aW5mbyBoZWlnaHQgJHddKSAvIDJ9XQogICAgCSAgICAJc2V0IGVudHJ5IFt0a01lbnVGaW5kTmFtZSAkbWVudSBbJHcgY2dldCAtdGV4dF1dCiAgICAJICAgIAlpZiB7WyR3IGNnZXQgLWluZGljYXRvcm9uXX0gewoJCSAgICBpZiB7JGVudHJ5ID09IFskbWVudSBpbmRleCBsYXN0XX0gewoJCSAgICAJaW5jciB5IFtleHByIHstKFskbWVudSB5cG9zaXRpb24gJGVudHJ5XSBcCgkJCSAgICAJKyBbd2luZm8gcmVxaGVpZ2h0ICRtZW51XSkvMn1dCgkJICAgIH0gZWxzZSB7CgkJICAgIAlpbmNyIHkgW2V4cHIgey0oWyRtZW51IHlwb3NpdGlvbiAkZW50cnldIFwKCQkJICAgICAgICArIFskbWVudSB5cG9zaXRpb24gW2V4cHIgeyRlbnRyeSsxfV1dKS8yfV0KCQkgICAgfQogICAgCSAgICAJfQogICAgCSAgICAJJG1lbnUgcG9zdCAkeCAkeQoJCWlmIHtbc3RyaW5nIGNvbXBhcmUgJGVudHJ5IHt9XSAmJiBbc3RyaW5nIGNvbXBhcmUgWyRtZW51IGVudHJ5Y2dldCAkZW50cnkgLXN0YXRlXSAiZGlzYWJsZWQiXX0gewogICAgCSAgICAJICAgICRtZW51IGFjdGl2YXRlICRlbnRyeQoJCSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQogICAgCSAgICAJfQogICAgCSAgICB9CiAgICAJICAgIHJpZ2h0IHsKICAgIAkgICAgCXNldCB4IFtleHByIHtbd2luZm8gcm9vdHggJHddICsgW3dpbmZvIHdpZHRoICR3XX1dCiAgICAJICAgIAlzZXQgeSBbZXhwciB7KDIgKiBbd2luZm8gcm9vdHkgJHddICsgW3dpbmZvIGhlaWdodCAkd10pIC8gMn1dCiAgICAJICAgIAlzZXQgZW50cnkgW3RrTWVudUZpbmROYW1lICRtZW51IFskdyBjZ2V0IC10ZXh0XV0KICAgIAkgICAgCWlmIHtbJHcgY2dldCAtaW5kaWNhdG9yb25dfSB7CgkJICAgIGlmIHskZW50cnkgPT0gWyRtZW51IGluZGV4IGxhc3RdfSB7CgkJICAgIAlpbmNyIHkgW2V4cHIgey0oWyRtZW51IHlwb3NpdGlvbiAkZW50cnldIFwKCQkJICAgIAkrIFt3aW5mbyByZXFoZWlnaHQgJG1lbnVdKS8yfV0KCQkgICAgfSBlbHNlIHsKCQkgICAgCWluY3IgeSBbZXhwciB7LShbJG1lbnUgeXBvc2l0aW9uICRlbnRyeV0gXAoJCQkgICAgICAgICsgWyRtZW51IHlwb3NpdGlvbiBbZXhwciB7JGVudHJ5KzF9XV0pLzJ9XQoJCSAgICB9CiAgICAJICAgIAl9CiAgICAJICAgIAkkbWVudSBwb3N0ICR4ICR5CgkJaWYge1tzdHJpbmcgY29tcGFyZSAkZW50cnkge31dICYmIFtzdHJpbmcgY29tcGFyZSBbJG1lbnUgZW50cnljZ2V0ICRlbnRyeSAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CiAgICAJICAgIAkgICAgJG1lbnUgYWN0aXZhdGUgJGVudHJ5CgkJICAgIHRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51CiAgICAJICAgIAl9CiAgICAJICAgIH0KICAgIAkgICAgZGVmYXVsdCB7CiAgICAJICAgIAlpZiB7WyR3IGNnZXQgLWluZGljYXRvcm9uXX0gewoJCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkeSB7fV19IHsKCQkJc2V0IHggW2V4cHIge1t3aW5mbyByb290eCAkd10gKyBbd2luZm8gd2lkdGggJHddLzJ9XQoJCQlzZXQgeSBbZXhwciB7W3dpbmZvIHJvb3R5ICR3XSArIFt3aW5mbyBoZWlnaHQgJHddLzJ9XQoJICAgIAkgICAgfQoJICAgICAgICAgICAgdGtQb3N0T3ZlclBvaW50ICRtZW51ICR4ICR5IFt0a01lbnVGaW5kTmFtZSAkbWVudSBbJHcgY2dldCAtdGV4dF1dCgkJfSBlbHNlIHsKCSAgICAJICAgICRtZW51IHBvc3QgW3dpbmZvIHJvb3R4ICR3XSBbZXhwciB7W3dpbmZvIHJvb3R5ICR3XStbd2luZm8gaGVpZ2h0ICR3XX1dCiAgICAJICAgIAl9ICAKICAgIAkgICAgfQoJfQogICAgfSBtc2ddfSB7CgkjIEVycm9yIHBvc3RpbmcgbWVudSAoZS5nLiBib2d1cyAtcG9zdGNvbW1hbmQpLiBVbnBvc3QgaXQgYW5kCgkjIHJlZmxlY3QgdGhlIGVycm9yLgoJCglzZXQgc2F2ZWRJbmZvICRlcnJvckluZm8KCXRrTWVudVVucG9zdCB7fQoJZXJyb3IgJG1zZyAkc2F2ZWRJbmZvCgogICAgfQoKICAgIHNldCB0a1ByaXYodGVhcm9mZikgJHRlYXJvZmYKICAgIGlmIHskdGVhcm9mZiAhPSAwfSB7CiAgICAJZm9jdXMgJG1lbnUKICAgIAl0a1NhdmVHcmFiSW5mbyAkdwogICAgCWdyYWIgLWdsb2JhbCAkdwogICAgfQp9CgojIHRrTWVudVVucG9zdCAtLQojIFRoaXMgcHJvY2VkdXJlIHVucG9zdHMgYSBnaXZlbiBtZW51LCBwbHVzIGFsbCBvZiBpdHMgYW5jZXN0b3JzIHVwCiMgdG8gKGFuZCBpbmNsdWRpbmcpIGEgbWVudWJ1dHRvbiwgaWYgYW55LiAgSXQgYWxzbyByZXN0b3JlcyB2YXJpb3VzCiMgdmFsdWVzIHRvIHdoYXQgdGhleSB3ZXJlIGJlZm9yZSB0aGUgbWVudSB3YXMgcG9zdGVkLCBhbmQgcmVsZWFzZXMKIyBhIGdyYWIgaWYgdGhlcmUncyBhIG1lbnVidXR0b24gaW52b2x2ZWQuICBTcGVjaWFsIG5vdGVzOgojIDEuIEl0J3MgaW1wb3J0YW50IHRvIHVucG9zdCBhbGwgbWVudXMgYmVmb3JlIHJlbGVhc2luZyB0aGUgZ3JhYiwgc28KIyAgICB0aGF0IGFueSBFbnRlci1MZWF2ZSBldmVudHMgKGUuZy4gZnJvbSBtZW51IGJhY2sgdG8gbWFpbgojICAgIGFwcGxpY2F0aW9uKSBoYXZlIG1vZGUgTm90aWZ5R3JhYi4KIyAyLiBCZSBzdXJlIHRvIGVuY2xvc2UgdmFyaW91cyBncm91cHMgb2YgY29tbWFuZHMgaW4gImNhdGNoIiBzbyB0aGF0CiMgICAgdGhlIHByb2NlZHVyZSB3aWxsIGNvbXBsZXRlIGV2ZW4gaWYgdGhlIG1lbnVidXR0b24gb3IgdGhlIG1lbnUKIyAgICBvciB0aGUgZ3JhYiB3aW5kb3cgaGFzIGJlZW4gZGVsZXRlZC4KIwojIEFyZ3VtZW50czoKIyBtZW51IC0JCU5hbWUgb2YgYSBtZW51IHRvIHVucG9zdC4gIElnbm9yZWQgaWYgdGhlcmUKIwkJCWlzIGEgcG9zdGVkIG1lbnVidXR0b24uCgpwcm9jIHRrTWVudVVucG9zdCBtZW51IHsKICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCBtYiAkdGtQcml2KHBvc3RlZE1iKQoKICAgICMgUmVzdG9yZSBmb2N1cyByaWdodCBhd2F5IChvdGhlcndpc2UgWCB3aWxsIHRha2UgZm9jdXMgYXdheSB3aGVuCiAgICAjIHRoZSBtZW51IGlzIHVubWFwcGVkIGFuZCB1bmRlciBzb21lIHdpbmRvdyBtYW5hZ2VycyAoZS5nLiBvbHZ3bSkKICAgICMgd2UnbGwgbG9zZSB0aGUgZm9jdXMgY29tcGxldGVseSkuCgogICAgY2F0Y2gge2ZvY3VzICR0a1ByaXYoZm9jdXMpfQogICAgc2V0IHRrUHJpdihmb2N1cykgIiIKCiAgICAjIFVucG9zdCBtZW51KHMpIGFuZCByZXN0b3JlIHNvbWUgc3R1ZmYgdGhhdCdzIGRlcGVuZGVudCBvbgogICAgIyB3aGF0IHdhcyBwb3N0ZWQuCgogICAgY2F0Y2ggewoJaWYge1tzdHJpbmcgY29tcGFyZSAkbWIgIiJdfSB7CgkgICAgc2V0IG1lbnUgWyRtYiBjZ2V0IC1tZW51XQoJICAgICRtZW51IHVucG9zdAoJICAgIHNldCB0a1ByaXYocG9zdGVkTWIpIHt9CgkgICAgJG1iIGNvbmZpZ3VyZSAtY3Vyc29yICR0a1ByaXYoY3Vyc29yKQoJICAgICRtYiBjb25maWd1cmUgLXJlbGllZiAkdGtQcml2KHJlbGllZikKCX0gZWxzZWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihwb3B1cCkgIiJdfSB7CgkgICAgJHRrUHJpdihwb3B1cCkgdW5wb3N0CgkgICAgc2V0IHRrUHJpdihwb3B1cCkge30KCX0gZWxzZWlmIHtbc3RyaW5nIGNvbXBhcmUgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl0gXAoJCSYmIFtzdHJpbmcgY29tcGFyZSBbJG1lbnUgY2dldCAtdHlwZV0gInRlYXJvZmYiXX0gewoJICAgICMgV2UncmUgaW4gYSBjYXNjYWRlZCBzdWItbWVudSBmcm9tIGEgdG9ybi1vZmYgbWVudSBvciBwb3B1cC4KCSAgICAjIFVucG9zdCBhbGwgdGhlIG1lbnVzIHVwIHRvIHRoZSB0b3BsZXZlbCBvbmUgKGJ1dCBub3QKCSAgICAjIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIHRvcm4tb2ZmIG9uZSkgYW5kIGRlYWN0aXZhdGUgdGhlCgkgICAgIyB0b3AtbGV2ZWwgdG9ybiBvZmYgbWVudSBpZiB0aGVyZSBpcyBvbmUuCgoJICAgIHdoaWxlIDEgewoJCXNldCBwYXJlbnQgW3dpbmZvIHBhcmVudCAkbWVudV0KCQlpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyBjbGFzcyAkcGFyZW50XSAiTWVudSJdIFwKCQkJfHwgIVt3aW5mbyBpc21hcHBlZCAkcGFyZW50XX0gewoJCSAgICBicmVhawoJCX0KCQkkcGFyZW50IGFjdGl2YXRlIG5vbmUKCQkkcGFyZW50IHBvc3RjYXNjYWRlIG5vbmUKCQl0a0dlbmVyYXRlTWVudVNlbGVjdCAkcGFyZW50CgkJc2V0IHR5cGUgWyRwYXJlbnQgY2dldCAtdHlwZV0KCQlpZiB7W3N0cmluZyBlcXVhbCAkdHlwZSAibWVudWJhciJdIHx8IFwKCQkJW3N0cmluZyBlcXVhbCAkdHlwZSAidGVhcm9mZiJdfSB7CgkJICAgIGJyZWFrCgkJfQoJCXNldCBtZW51ICRwYXJlbnQKCSAgICB9CgkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJG1lbnUgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gewoJCSRtZW51IHVucG9zdAoJICAgIH0KCX0KICAgIH0KCiAgICBpZiB7KCR0a1ByaXYodGVhcm9mZikgIT0gMCkgfHwgW3N0cmluZyBjb21wYXJlICR0a1ByaXYobWVudUJhcikgIiJdfSB7CiAgICAJIyBSZWxlYXNlIGdyYWIsIGlmIGFueSwgYW5kIHJlc3RvcmUgdGhlIHByZXZpb3VzIGdyYWIsIGlmIHRoZXJlCiAgICAJIyB3YXMgb25lLgoJaWYge1tzdHJpbmcgY29tcGFyZSAkbWVudSAiIl19IHsKCSAgICBzZXQgZ3JhYiBbZ3JhYiBjdXJyZW50ICRtZW51XQoJICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGdyYWIgIiJdfSB7CgkJZ3JhYiByZWxlYXNlICRncmFiCgkgICAgfQoJfQoJdGtSZXN0b3JlT2xkR3JhYgoJaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KG1lbnVCYXIpICIiXX0gewoJICAgICR0a1ByaXYobWVudUJhcikgY29uZmlndXJlIC1jdXJzb3IgJHRrUHJpdihjdXJzb3IpCgkgICAgc2V0IHRrUHJpdihtZW51QmFyKSB7fQoJfQoJaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7CgkgICAgc2V0IHRrUHJpdih0ZWFyb2ZmKSAwCgl9CiAgICB9Cn0KCiMgdGtNYk1vdGlvbiAtLQojIFRoaXMgcHJvY2VkdXJlIGhhbmRsZXMgbW91c2UgbW90aW9uIGV2ZW50cyBpbnNpZGUgbWVudWJ1dHRvbnMsIGFuZAojIGFsc28gb3V0c2lkZSBtZW51YnV0dG9ucyB3aGVuIGEgbWVudWJ1dHRvbiBoYXMgYSBncmFiIChlLmcuIHdoZW4gYQojIG1lbnUgc2VsZWN0aW9uIG9wZXJhdGlvbiBpcyBpbiBwcm9ncmVzcykuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJVGhlIG5hbWUgb2YgdGhlIG1lbnVidXR0b24gd2lkZ2V0LgojIHVwRG93biAtIAkJImRvd24iIG1lYW5zIGJ1dHRvbiAxIGlzIHByZXNzZWQsICJ1cCIgbWVhbnMKIwkJCWl0IGlzbid0LgojIHJvb3R4LCByb290eSAtCUNvb3JkaW5hdGVzIG9mIG1vdXNlLCBpbiAodmlydHVhbD8pIHJvb3Qgd2luZG93LgoKcHJvYyB0a01iTW90aW9uIHt3IHVwRG93biByb290eCByb290eX0gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoaW5NZW51YnV0dG9uKSAkd119IHsKCXJldHVybgogICAgfQogICAgc2V0IG5ldyBbd2luZm8gY29udGFpbmluZyAkcm9vdHggJHJvb3R5XQogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkbmV3ICR0a1ByaXYoaW5NZW51YnV0dG9uKV0gXAoJICAgICYmIChbc3RyaW5nIGVxdWFsICRuZXcgIiJdIFwKCSAgICB8fCBbc3RyaW5nIGVxdWFsIFt3aW5mbyB0b3BsZXZlbCAkbmV3XSBbd2luZm8gdG9wbGV2ZWwgJHddXSl9IHsKCWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihpbk1lbnVidXR0b24pICIiXX0gewoJICAgIHRrTWJMZWF2ZSAkdGtQcml2KGluTWVudWJ1dHRvbikKCX0KCWlmIHtbc3RyaW5nIGNvbXBhcmUgJG5ldyAiIl0gXAoJCSYmIFtzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICRuZXddICJNZW51YnV0dG9uIl0gXAoJCSYmIChbJG5ldyBjZ2V0IC1pbmRpY2F0b3Jvbl0gPT0gMCkgXAoJCSYmIChbJHcgY2dldCAtaW5kaWNhdG9yb25dID09IDApfSB7CgkgICAgaWYge1tzdHJpbmcgZXF1YWwgJHVwRG93biAiZG93biJdfSB7CgkJdGtNYlBvc3QgJG5ldyAkcm9vdHggJHJvb3R5CgkgICAgfSBlbHNlIHsKCQl0a01iRW50ZXIgJG5ldwoJICAgIH0KCX0KICAgIH0KfQoKIyB0a01iQnV0dG9uVXAgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGhhbmRsZSBidXR0b24gMSByZWxlYXNlcyBmb3IgbWVudWJ1dHRvbnMuCiMgSWYgdGhlIHJlbGVhc2UgaGFwcGVucyBpbnNpZGUgdGhlIG1lbnVidXR0b24gdGhlbiBsZWF2ZSBpdHMgbWVudQojIHBvc3RlZCB3aXRoIGVsZW1lbnQgMCBhY3RpdmF0ZWQuICBPdGhlcndpc2UsIHVucG9zdCB0aGUgbWVudS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCQlUaGUgbmFtZSBvZiB0aGUgbWVudWJ1dHRvbiB3aWRnZXQuCgpwcm9jIHRrTWJCdXR0b25VcCB3IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KCiAgICBzZXQgbWVudSBbJHcgY2dldCAtbWVudV0KICAgIHNldCB0ZWFyb2ZmIFtleHByIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il0gfHwgXAoJICAgIChbc3RyaW5nIGNvbXBhcmUgJG1lbnUge31dICYmIFwKCSAgICBbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAidGVhcm9mZiJdKX1dCiAgICBpZiB7KCR0ZWFyb2ZmICE9IDApICYmIFtzdHJpbmcgZXF1YWwgJHRrUHJpdihwb3N0ZWRNYikgJHddIFwKCSAgICAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYoaW5NZW51YnV0dG9uKSAkd119IHsKCXRrTWVudUZpcnN0RW50cnkgWyR0a1ByaXYocG9zdGVkTWIpIGNnZXQgLW1lbnVdCiAgICB9IGVsc2UgewoJdGtNZW51VW5wb3N0IHt9CiAgICB9Cn0KCiMgdGtNZW51TW90aW9uIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHRvIGhhbmRsZSBtb3VzZSBtb3Rpb24gZXZlbnRzIGZvciBtZW51cy4KIyBJdCBkb2VzIHR3byB0aGluZ3MuICBGaXJzdCwgaXQgcmVzZXRzIHRoZSBhY3RpdmUgZWxlbWVudCBpbiB0aGUKIyBtZW51LCBpZiB0aGUgbW91c2UgaXMgb3ZlciB0aGUgbWVudS4gIFNlY29uZCwgaWYgYSBtb3VzZSBidXR0b24KIyBpcyBkb3duLCBpdCBwb3N0cyBhbmQgdW5wb3N0cyBjYXNjYWRlIGVudHJpZXMgdG8gbWF0Y2ggdGhlIG1vdXNlCiMgcG9zaXRpb24uCiMKIyBBcmd1bWVudHM6CiMgbWVudSAtCQlUaGUgbWVudSB3aW5kb3cuCiMgeCAtCQkJVGhlIHggcG9zaXRpb24gb2YgdGhlIG1vdXNlLgojIHkgLQkJCVRoZSB5IHBvc2l0aW9uIG9mIHRoZSBtb3VzZS4KIyBzdGF0ZSAtCQlNb2RpZmllciBzdGF0ZSAodGVsbHMgd2hldGhlciBidXR0b25zIGFyZSBkb3duKS4KCnByb2MgdGtNZW51TW90aW9uIHttZW51IHggeSBzdGF0ZX0gewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgZXF1YWwgJG1lbnUgJHRrUHJpdih3aW5kb3cpXX0gewoJaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIHRrUHJpdihmb2N1cyldICYmIFwKCQkgICAgW3N0cmluZyBjb21wYXJlICRtZW51ICR0a1ByaXYoZm9jdXMpXX0gewoJCSRtZW51IGFjdGl2YXRlIEAkeCwkeQoJCXRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51CgkgICAgfQoJfSBlbHNlIHsKCSAgICAkbWVudSBhY3RpdmF0ZSBAJHgsJHkKCSAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQoJfQogICAgfQogICAgaWYgeygkc3RhdGUgJiAweDFmMDApICE9IDB9IHsKCSRtZW51IHBvc3RjYXNjYWRlIGFjdGl2ZQogICAgfQp9CgojIHRrTWVudUJ1dHRvbkRvd24gLS0KIyBIYW5kbGVzIGJ1dHRvbiBwcmVzc2VzIGluIG1lbnVzLiAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHRyaWNreSB0aGluZ3MKIyBoZXJlOgojIDEuIENoYW5nZSB0aGUgcG9zdGVkIGNhc2NhZGUgZW50cnkgKGlmIGFueSkgdG8gbWF0Y2ggdGhlIG1vdXNlIHBvc2l0aW9uLgojIDIuIElmIHRoZXJlIGlzIGEgcG9zdGVkIG1lbnVidXR0b24sIG11c3QgZ3JhYiB0byB0aGUgbWVudWJ1dHRvbjsgIHRoaXMKIyAgICBvdmVycnJpZGVzIHRoZSBpbXBsaWNpdCBncmFiIG9uIGJ1dHRvbiBwcmVzcywgc28gdGhhdCB0aGUgbWVudQojICAgIGJ1dHRvbiBjYW4gdHJhY2sgbW91c2UgbW90aW9ucyBvdmVyIG90aGVyIG1lbnVidXR0b25zIGFuZCBjaGFuZ2UKIyAgICB0aGUgcG9zdGVkIG1lbnUuCiMgMy4gSWYgdGhlcmUncyBubyBwb3N0ZWQgbWVudWJ1dHRvbiAoZS5nLiBiZWNhdXNlIHdlJ3JlIGEgdG9ybi1vZmYgbWVudQojICAgIG9yIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMpIG11c3QgZ3JhYiB0byB0aGUgdG9wLWxldmVsIG1lbnUgc28gdGhhdAojICAgIHdlIGNhbiB0cmFjayBtb3VzZSBtb3Rpb25zIGFjcm9zcyB0aGUgZW50aXJlIG1lbnUgaGllcmFyY2h5LgojCiMgQXJndW1lbnRzOgojIG1lbnUgLQkJVGhlIG1lbnUgd2luZG93LgoKcHJvYyB0a01lbnVCdXR0b25Eb3duIG1lbnUgewogICAgZ2xvYmFsIHRrUHJpdgogICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQoKICAgIGlmIHshW3dpbmZvIHZpZXdhYmxlICRtZW51XX0gewogICAgICAgIHJldHVybgogICAgfQogICAgJG1lbnUgcG9zdGNhc2NhZGUgYWN0aXZlCiAgICBpZiB7W3N0cmluZyBjb21wYXJlICR0a1ByaXYocG9zdGVkTWIpICIiXX0gewoJZ3JhYiAtZ2xvYmFsICR0a1ByaXYocG9zdGVkTWIpCiAgICB9IGVsc2UgewoJd2hpbGUge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJub3JtYWwiXSBcCgkJJiYgW3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgW3dpbmZvIHBhcmVudCAkbWVudV1dICJNZW51Il0gXAoJCSYmIFt3aW5mbyBpc21hcHBlZCBbd2luZm8gcGFyZW50ICRtZW51XV19IHsKCSAgICBzZXQgbWVudSBbd2luZm8gcGFyZW50ICRtZW51XQoJfQoKCWlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYobWVudUJhcikge31dfSB7CgkgICAgc2V0IHRrUHJpdihtZW51QmFyKSAkbWVudQoJICAgIHNldCB0a1ByaXYoY3Vyc29yKSBbJG1lbnUgY2dldCAtY3Vyc29yXQoJICAgICRtZW51IGNvbmZpZ3VyZSAtY3Vyc29yIGFycm93CiAgICAgICAgfQoKCSMgRG9uJ3QgdXBkYXRlIGdyYWIgaW5mb3JtYXRpb24gaWYgdGhlIGdyYWIgd2luZG93IGlzbid0IGNoYW5naW5nLgoJIyBPdGhlcndpc2UsIHdlJ2xsIGdldCBhbiBlcnJvciB3aGVuIHdlIHVucG9zdCB0aGUgbWVudXMgYW5kCgkjIHJlc3RvcmUgdGhlIGdyYWIsIHNpbmNlIHRoZSBvbGQgZ3JhYiB3aW5kb3cgd2lsbCBub3QgYmUgdmlld2FibGUKCSMgYW55bW9yZS4KCglpZiB7W3N0cmluZyBjb21wYXJlICRtZW51IFtncmFiIGN1cnJlbnQgJG1lbnVdXX0gewoJICAgIHRrU2F2ZUdyYWJJbmZvICRtZW51Cgl9CgoJIyBNdXN0IHJlLWdyYWIgZXZlbiBpZiB0aGUgZ3JhYiB3aW5kb3cgaGFzbid0IGNoYW5nZWQsIGluIG9yZGVyCgkjIHRvIHJlbGVhc2UgdGhlIGltcGxpY2l0IGdyYWIgZnJvbSB0aGUgYnV0dG9uIHByZXNzLgoKCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il19IHsKCSAgICBncmFiIC1nbG9iYWwgJG1lbnUKCX0KICAgIH0KfQoKIyB0a01lbnVMZWF2ZSAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gaGFuZGxlIExlYXZlIGV2ZW50cyBmb3IgYSBtZW51LiAgSXQKIyBkZWFjdGl2YXRlcyBldmVyeXRoaW5nIHVubGVzcyB0aGUgYWN0aXZlIGVsZW1lbnQgaXMgYSBjYXNjYWRlIGVsZW1lbnQKIyBhbmQgdGhlIG1vdXNlIGlzIG5vdyBvdmVyIHRoZSBzdWJtZW51LgojCiMgQXJndW1lbnRzOgojIG1lbnUgLQkJVGhlIG1lbnUgd2luZG93LgojIHJvb3R4LCByb290eSAtCVJvb3QgY29vcmRpbmF0ZXMgb2YgbW91c2UuCiMgc3RhdGUgLQkJTW9kaWZpZXIgc3RhdGUuCgpwcm9jIHRrTWVudUxlYXZlIHttZW51IHJvb3R4IHJvb3R5IHN0YXRlfSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBzZXQgdGtQcml2KHdpbmRvdykge30KICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskbWVudSBpbmRleCBhY3RpdmVdICJub25lIl19IHsKCXJldHVybgogICAgfQogICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdCiAgICAgICAgICAmJiBbc3RyaW5nIGVxdWFsIFt3aW5mbyBjb250YWluaW5nICRyb290eCAkcm9vdHldIFwKICAgICAgICAgICAgICAgICAgWyRtZW51IGVudHJ5Y2dldCBhY3RpdmUgLW1lbnVdXX0gewoJcmV0dXJuCiAgICB9CiAgICAkbWVudSBhY3RpdmF0ZSBub25lCiAgICB0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQp9CgojIHRrTWVudUludm9rZSAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBidXR0b24gMSBpcyByZWxlYXNlZCBvdmVyIGEgbWVudS4KIyBJdCBpbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBtZW51IGFjdGlvbiBhbmQgdW5wb3N0cyB0aGUgbWVudSBpZgojIGl0IGNhbWUgZnJvbSBhIG1lbnVidXR0b24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJTmFtZSBvZiB0aGUgbWVudSB3aWRnZXQuCiMgYnV0dG9uUmVsZWFzZSAtCTEgbWVhbnMgdGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIGJlY2F1c2Ugb2YKIwkJCWEgYnV0dG9uIHJlbGVhc2U7ICAwIG1lYW5zIGJlY2F1c2Ugb2Yga2V5c3Ryb2tlLgoKcHJvYyB0a01lbnVJbnZva2Uge3cgYnV0dG9uUmVsZWFzZX0gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHskYnV0dG9uUmVsZWFzZSAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYod2luZG93KSB7fV19IHsKCSMgTW91c2Ugd2FzIHByZXNzZWQgb3ZlciBhIG1lbnUgd2l0aG91dCBhIG1lbnUgYnV0dG9uLCB0aGVuCgkjIGRyYWdnZWQgb2ZmIHRoZSBtZW51IChwb3NzaWJseSB3aXRoIGEgY2FzY2FkZSBwb3N0ZWQpIGFuZAoJIyByZWxlYXNlZC4gIFVucG9zdCBldmVyeXRoaW5nIGFuZCBxdWl0LgoKCSR3IHBvc3RjYXNjYWRlIG5vbmUKCSR3IGFjdGl2YXRlIG5vbmUKCWV2ZW50IGdlbmVyYXRlICR3IDw8TWVudVNlbGVjdD4+Cgl0a01lbnVVbnBvc3QgJHcKCXJldHVybgogICAgfQogICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdfSB7CgkkdyBwb3N0Y2FzY2FkZSBhY3RpdmUKCXNldCBtZW51IFskdyBlbnRyeWNnZXQgYWN0aXZlIC1tZW51XQoJdGtNZW51Rmlyc3RFbnRyeSAkbWVudQogICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgWyR3IHR5cGUgYWN0aXZlXSAidGVhcm9mZiJdfSB7Cgl0a01lbnVVbnBvc3QgJHcKCXRrVGVhck9mZk1lbnUgJHcKICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7CgkkdyBwb3N0Y2FzY2FkZSBub25lCgkkdyBhY3RpdmF0ZSBub25lCglldmVudCBnZW5lcmF0ZSAkdyA8PE1lbnVTZWxlY3Q+PgoJdGtNZW51VW5wb3N0ICR3CiAgICB9IGVsc2UgewoJdGtNZW51VW5wb3N0ICR3Cgl1cGxldmVsICMwIFtsaXN0ICR3IGludm9rZSBhY3RpdmVdCiAgICB9Cn0KCiMgdGtNZW51RXNjYXBlIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCBmb3IgdGhlIENhbmNlbCAob3IgRXNjYXBlKSBrZXkuICBJdCB1bnBvc3RzCiMgdGhlIGdpdmVuIG1lbnUgYW5kLCBpZiBpdCBpcyB0aGUgdG9wLWxldmVsIG1lbnUgZm9yIGEgbWVudSBidXR0b24sCiMgdW5wb3N0cyB0aGUgbWVudSBidXR0b24gYXMgd2VsbC4KIwojIEFyZ3VtZW50czoKIyBtZW51IC0JCU5hbWUgb2YgdGhlIG1lbnUgd2luZG93LgoKcHJvYyB0a01lbnVFc2NhcGUgbWVudSB7CiAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJG1lbnVdCiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyBjbGFzcyAkcGFyZW50XSAiTWVudSJdfSB7Cgl0a01lbnVVbnBvc3QgJG1lbnUKICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsIFskcGFyZW50IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCXRrTWVudVVucG9zdCAkbWVudQoJdGtSZXN0b3JlT2xkR3JhYgogICAgfSBlbHNlIHsKCXRrTWVudU5leHRNZW51ICRtZW51IGxlZnQKICAgIH0KfQoKIyBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGhhbmRsZSBhcnJvdyBrZXlzLiBBcnJvdyBrZXlzIGJlaGF2ZQojIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBtZW51IGlzIGEgbWVudSBiYXIgb3Igbm90LgoKcHJvYyB0a01lbnVVcEFycm93IHttZW51fSB7CiAgICBpZiB7W3N0cmluZyBlcXVhbCBbJG1lbnUgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gewoJdGtNZW51TmV4dE1lbnUgJG1lbnUgbGVmdAogICAgfSBlbHNlIHsKCXRrTWVudU5leHRFbnRyeSAkbWVudSAtMQogICAgfQp9Cgpwcm9jIHRrTWVudURvd25BcnJvdyB7bWVudX0gewogICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCXRrTWVudU5leHRNZW51ICRtZW51IHJpZ2h0CiAgICB9IGVsc2UgewoJdGtNZW51TmV4dEVudHJ5ICRtZW51IDEKICAgIH0KfQoKcHJvYyB0a01lbnVMZWZ0QXJyb3cge21lbnV9IHsKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskbWVudSBjZ2V0IC10eXBlXSAibWVudWJhciJdfSB7Cgl0a01lbnVOZXh0RW50cnkgJG1lbnUgLTEKICAgIH0gZWxzZSB7Cgl0a01lbnVOZXh0TWVudSAkbWVudSBsZWZ0CiAgICB9Cn0KCnByb2MgdGtNZW51UmlnaHRBcnJvdyB7bWVudX0gewogICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCXRrTWVudU5leHRFbnRyeSAkbWVudSAxCiAgICB9IGVsc2UgewoJdGtNZW51TmV4dE1lbnUgJG1lbnUgcmlnaHQKICAgIH0KfQoKIyB0a01lbnVOZXh0TWVudSAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gaGFuZGxlICJsZWZ0IiBhbmQgInJpZ2h0IiB0cmF2ZXJzYWwKIyBtb3Rpb25zIGluIG1lbnVzLiAgSXQgdHJhdmVyc2VzIHRvIHRoZSBuZXh0IG1lbnUgaW4gYSBtZW51IGJhciwKIyBvciBpbnRvIG9yIG91dCBvZiBhIGNhc2NhZGVkIG1lbnUuCiMKIyBBcmd1bWVudHM6CiMgbWVudSAtCQlUaGUgbWVudSB0aGF0IHJlY2VpdmVkIHRoZSBrZXlib2FyZAojCQkJZXZlbnQuCiMgZGlyZWN0aW9uIC0JCURpcmVjdGlvbiBpbiB3aGljaCB0byBtb3ZlOiAibGVmdCIgb3IgInJpZ2h0IgoKcHJvYyB0a01lbnVOZXh0TWVudSB7bWVudSBkaXJlY3Rpb259IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICAjIEZpcnN0IGhhbmRsZSB0cmF2ZXJzYWxzIGludG8gYW5kIG91dCBvZiBjYXNjYWRlZCBtZW51cy4KCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkZGlyZWN0aW9uICJyaWdodCJdfSB7CglzZXQgY291bnQgMQoJc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRtZW51XQoJc2V0IGNsYXNzIFt3aW5mbyBjbGFzcyAkcGFyZW50XQoJaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IHR5cGUgYWN0aXZlXSAiY2FzY2FkZSJdfSB7CgkgICAgJG1lbnUgcG9zdGNhc2NhZGUgYWN0aXZlCgkgICAgc2V0IG0yIFskbWVudSBlbnRyeWNnZXQgYWN0aXZlIC1tZW51XQoJICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJG0yICIiXX0gewoJCXRrTWVudUZpcnN0RW50cnkgJG0yCgkgICAgfQoJICAgIHJldHVybgoJfSBlbHNlIHsKCSAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJG1lbnVdCgkgICAgd2hpbGUge1tzdHJpbmcgY29tcGFyZSAkcGFyZW50ICIuIl19IHsKCQlpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJHBhcmVudF0gIk1lbnUiXSBcCgkJCSYmIFtzdHJpbmcgZXF1YWwgWyRwYXJlbnQgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gewoJCSAgICB0a19tZW51U2V0Rm9jdXMgJHBhcmVudAoJCSAgICB0a01lbnVOZXh0RW50cnkgJHBhcmVudCAxCgkJICAgIHJldHVybgoJCX0KCQlzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJHBhcmVudF0KCSAgICB9Cgl9CiAgICB9IGVsc2UgewoJc2V0IGNvdW50IC0xCglzZXQgbTIgW3dpbmZvIHBhcmVudCAkbWVudV0KCWlmIHtbc3RyaW5nIGVxdWFsIFt3aW5mbyBjbGFzcyAkbTJdICJNZW51Il19IHsKCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskbTIgY2dldCAtdHlwZV0gIm1lbnViYXIiXX0gewoJCSRtZW51IGFjdGl2YXRlIG5vbmUKCQl0a0dlbmVyYXRlTWVudVNlbGVjdCAkbWVudQoJCXRrX21lbnVTZXRGb2N1cyAkbTIKCQkKCQkjIFRoaXMgY29kZSB1bnBvc3RzIGFueSBwb3N0ZWQgc3VibWVudSBpbiB0aGUgcGFyZW50LgoJCQoJCXNldCB0bXAgWyRtMiBpbmRleCBhY3RpdmVdCgkJJG0yIGFjdGl2YXRlIG5vbmUKCQkkbTIgYWN0aXZhdGUgJHRtcAoJCXJldHVybgoJICAgIH0KCX0KICAgIH0KCiAgICAjIENhbid0IHRyYXZlcnNlIGludG8gb3Igb3V0IG9mIGEgY2FzY2FkZWQgbWVudS4gIEdvIHRvIHRoZSBuZXh0CiAgICAjIG9yIHByZXZpb3VzIG1lbnVidXR0b24sIGlmIHRoYXQgbWFrZXMgc2Vuc2UuCgogICAgc2V0IG0yIFt3aW5mbyBwYXJlbnQgJG1lbnVdCiAgICBpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJG0yXSAiTWVudSJdfSB7CglpZiB7W3N0cmluZyBlcXVhbCBbJG0yIGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCSAgICB0a19tZW51U2V0Rm9jdXMgJG0yCgkgICAgdGtNZW51TmV4dEVudHJ5ICRtMiAtMQoJICAgIHJldHVybgoJfQogICAgfQoKICAgIHNldCB3ICR0a1ByaXYocG9zdGVkTWIpCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdyAiIl19IHsKCXJldHVybgogICAgfQogICAgc2V0IGJ1dHRvbnMgW3dpbmZvIGNoaWxkcmVuIFt3aW5mbyBwYXJlbnQgJHddXQogICAgc2V0IGxlbmd0aCBbbGxlbmd0aCAkYnV0dG9uc10KICAgIHNldCBpIFtleHByIHtbbHNlYXJjaCAtZXhhY3QgJGJ1dHRvbnMgJHddICsgJGNvdW50fV0KICAgIHdoaWxlIDEgewoJd2hpbGUgeyRpIDwgMH0gewoJICAgIGluY3IgaSAkbGVuZ3RoCgl9Cgl3aGlsZSB7JGkgPj0gJGxlbmd0aH0gewoJICAgIGluY3IgaSAtJGxlbmd0aAoJfQoJc2V0IG1iIFtsaW5kZXggJGJ1dHRvbnMgJGldCglpZiB7W3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJG1iXSAiTWVudWJ1dHRvbiJdIFwKCQkmJiBbc3RyaW5nIGNvbXBhcmUgWyRtYiBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl0gXAoJCSYmIFtzdHJpbmcgY29tcGFyZSBbJG1iIGNnZXQgLW1lbnVdICIiXSBcCgkJJiYgW3N0cmluZyBjb21wYXJlIFtbJG1iIGNnZXQgLW1lbnVdIGluZGV4IGxhc3RdICJub25lIl19IHsKCSAgICBicmVhawoJfQoJaWYge1tzdHJpbmcgZXF1YWwgJG1iICR3XX0gewoJICAgIHJldHVybgoJfQoJaW5jciBpICRjb3VudAogICAgfQogICAgdGtNYlBvc3QgJG1iCiAgICB0a01lbnVGaXJzdEVudHJ5IFskbWIgY2dldCAtbWVudV0KfQoKIyB0a01lbnVOZXh0RW50cnkgLS0KIyBBY3RpdmF0ZSB0aGUgbmV4dCBoaWdoZXIgb3IgbG93ZXIgZW50cnkgaW4gdGhlIHBvc3RlZCBtZW51LAojIHdyYXBwaW5nIGFyb3VuZCBhdCB0aGUgZW5kcy4gIERpc2FibGVkIGVudHJpZXMgYXJlIHNraXBwZWQuCiMKIyBBcmd1bWVudHM6CiMgbWVudSAtCQkJTWVudSB3aW5kb3cgdGhhdCByZWNlaXZlZCB0aGUga2V5c3Ryb2tlLgojIGNvdW50IC0JCQkxIG1lYW5zIGdvIHRvIHRoZSBuZXh0IGxvd2VyIGVudHJ5LAojCQkJCS0xIG1lYW5zIGdvIHRvIHRoZSBuZXh0IGhpZ2hlciBlbnRyeS4KCnByb2MgdGtNZW51TmV4dEVudHJ5IHttZW51IGNvdW50fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IGluZGV4IGxhc3RdICJub25lIl19IHsKCXJldHVybgogICAgfQogICAgc2V0IGxlbmd0aCBbZXhwciB7WyRtZW51IGluZGV4IGxhc3RdKzF9XQogICAgc2V0IHF1aXRBZnRlciAkbGVuZ3RoCiAgICBzZXQgYWN0aXZlIFskbWVudSBpbmRleCBhY3RpdmVdCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkYWN0aXZlICJub25lIl19IHsKCXNldCBpIDAKICAgIH0gZWxzZSB7CglzZXQgaSBbZXhwciB7JGFjdGl2ZSArICRjb3VudH1dCiAgICB9CiAgICB3aGlsZSAxIHsKCWlmIHskcXVpdEFmdGVyIDw9IDB9IHsKCSAgICAjIFdlJ3ZlIHRyaWVkIGV2ZXJ5IGVudHJ5IGluIHRoZSBtZW51LiAgRWl0aGVyIHRoZXJlIGFyZQoJICAgICMgbm9uZSwgb3IgdGhleSdyZSBhbGwgZGlzYWJsZWQuICBKdXN0IGdpdmUgdXAuCgoJICAgIHJldHVybgoJfQoJd2hpbGUgeyRpIDwgMH0gewoJICAgIGluY3IgaSAkbGVuZ3RoCgl9Cgl3aGlsZSB7JGkgPj0gJGxlbmd0aH0gewoJICAgIGluY3IgaSAtJGxlbmd0aAoJfQoJaWYge1tjYXRjaCB7JG1lbnUgZW50cnljZ2V0ICRpIC1zdGF0ZX0gc3RhdGVdID09IDB9IHsKCSAgICBpZiB7W3N0cmluZyBjb21wYXJlICRzdGF0ZSAiZGlzYWJsZWQiXX0gewoJCWJyZWFrCgkgICAgfQoJfQoJaWYgeyRpID09ICRhY3RpdmV9IHsKCSAgICByZXR1cm4KCX0KCWluY3IgaSAkY291bnQKCWluY3IgcXVpdEFmdGVyIC0xCiAgICB9CiAgICAkbWVudSBhY3RpdmF0ZSAkaQogICAgdGtHZW5lcmF0ZU1lbnVTZWxlY3QgJG1lbnUKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskbWVudSB0eXBlICRpXSAiY2FzY2FkZSJdfSB7CglzZXQgY2FzY2FkZSBbJG1lbnUgZW50cnljZ2V0ICRpIC1tZW51XQoJaWYge1tzdHJpbmcgY29tcGFyZSAkY2FzY2FkZSAiIl19IHsKCSAgICAjIEhlcmUgd2UgYXV0by1wb3N0IGEgY2FzY2FkZS4gIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4KCSAgICAjIHdlIHRyYXZlcnNlIGxlZnQvcmlnaHQgaW4gdGhlIG1lbnViYXIsIGJ1dCB1bmRlc2lyYWJsZSB3aGVuCgkgICAgIyB3ZSB0cmF2ZXJzZSB1cC9kb3duIGluIGEgbWVudS4KCSAgICAkbWVudSBwb3N0Y2FzY2FkZSAkaQoJICAgIHRrTWVudUZpcnN0RW50cnkgJGNhc2NhZGUKCX0KICAgIH0KfQoKIyB0a01lbnVGaW5kIC0tCiMgVGhpcyBwcm9jZWR1cmUgc2VhcmNoZXMgdGhlIGVudGlyZSB3aW5kb3cgaGllcmFyY2h5IHVuZGVyIHcgZm9yCiMgYSBtZW51YnV0dG9uIHRoYXQgaXNuJ3QgZGlzYWJsZWQgYW5kIHdob3NlIHVuZGVybGluZWQgY2hhcmFjdGVyCiMgaXMgImNoYXIiIG9yIGFuIGVudHJ5IGluIGEgbWVudWJhciB0aGF0IGlzbid0IGRpc2FibGVkIGFuZCB3aG9zZQojIHVuZGVybGluZWQgY2hhcmFjdGVyIGlzICJjaGFyIi4KIyBJdCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoYXQgd2luZG93LCBpZiBmb3VuZCwgb3IgYW4KIyBlbXB0eSBzdHJpbmcgaWYgbm8gbWF0Y2hpbmcgd2luZG93IHdhcyBmb3VuZC4gIElmICJjaGFyIiBpcyBhbgojIGVtcHR5IHN0cmluZyB0aGVuIHRoZSBwcm9jZWR1cmUgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QKIyBtZW51YnV0dG9uIGZvdW5kIHRoYXQgaXNuJ3QgZGlzYWJsZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJCU5hbWUgb2Ygd2luZG93IHdoZXJlIGtleSB3YXMgdHlwZWQuCiMgY2hhciAtCQkJVW5kZXJsaW5lZCBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcjsKIwkJCQltYXkgYmUgZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGFuZAojCQkJCXdpbGwgbWF0Y2ggZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCgpwcm9jIHRrTWVudUZpbmQge3cgY2hhcn0gewogICAgZ2xvYmFsIHRrUHJpdgogICAgc2V0IGNoYXIgW3N0cmluZyB0b2xvd2VyICRjaGFyXQogICAgc2V0IHdpbmRvd2xpc3QgW3dpbmZvIGNoaWxkICR3XQoKICAgIGZvcmVhY2ggY2hpbGQgJHdpbmRvd2xpc3QgewoJIyBEb24ndCBkZXNjZW5kIGludG8gb3RoZXIgdG9wbGV2ZWxzLgogICAgICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgW3dpbmZvIHRvcGxldmVsIFtmb2N1c11dIFwKCQlbd2luZm8gdG9wbGV2ZWwgJGNoaWxkXV19IHsKCSAgICBjb250aW51ZQoJfQoJaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICRjaGlsZF0gIk1lbnUiXSAmJiBcCgkJW3N0cmluZyBlcXVhbCBbJGNoaWxkIGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkY2hhciAiIl19IHsKCQlyZXR1cm4gJGNoaWxkCgkgICAgfQoJICAgIHNldCBsYXN0IFskY2hpbGQgaW5kZXggbGFzdF0KCSAgICBmb3Ige3NldCBpIFskY2hpbGQgY2dldCAtdGVhcm9mZl19IHskaSA8PSAkbGFzdH0ge2luY3IgaX0gewoJCWlmIHtbc3RyaW5nIGVxdWFsIFskY2hpbGQgdHlwZSAkaV0gInNlcGFyYXRvciJdfSB7CgkJICAgIGNvbnRpbnVlCgkJfQoJCXNldCBjaGFyMiBbc3RyaW5nIGluZGV4IFskY2hpbGQgZW50cnljZ2V0ICRpIC1sYWJlbF0gXAoJCQlbJGNoaWxkIGVudHJ5Y2dldCAkaSAtdW5kZXJsaW5lXV0KCQlpZiB7W3N0cmluZyBlcXVhbCAkY2hhciBbc3RyaW5nIHRvbG93ZXIgJGNoYXIyXV0gXAoJCQl8fCBbc3RyaW5nIGVxdWFsICRjaGFyICIiXX0gewoJCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskY2hpbGQgZW50cnljZ2V0ICRpIC1zdGF0ZV0gImRpc2FibGVkIl19IHsKCQkJcmV0dXJuICRjaGlsZAoJCSAgICB9CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICBmb3JlYWNoIGNoaWxkICR3aW5kb3dsaXN0IHsKCSMgRG9uJ3QgZGVzY2VuZCBpbnRvIG90aGVyIHRvcGxldmVscy4KICAgICAgICBpZiB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyB0b3BsZXZlbCBbZm9jdXNdXSBcCgkJW3dpbmZvIHRvcGxldmVsICRjaGlsZF1dfSB7CgkgICAgY29udGludWUKCX0KCXN3aXRjaCBbd2luZm8gY2xhc3MgJGNoaWxkXSB7CgkgICAgTWVudWJ1dHRvbiB7CgkJc2V0IGNoYXIyIFtzdHJpbmcgaW5kZXggWyRjaGlsZCBjZ2V0IC10ZXh0XSBcCgkJCVskY2hpbGQgY2dldCAtdW5kZXJsaW5lXV0KCQlpZiB7W3N0cmluZyBlcXVhbCAkY2hhciBbc3RyaW5nIHRvbG93ZXIgJGNoYXIyXV0gXAoJCQl8fCBbc3RyaW5nIGVxdWFsICRjaGFyICIiXX0gewoJCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskY2hpbGQgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkJCXJldHVybiAkY2hpbGQKCQkgICAgfQoJCX0KCSAgICB9CgoJICAgIGRlZmF1bHQgewoJCXNldCBtYXRjaCBbdGtNZW51RmluZCAkY2hpbGQgJGNoYXJdCgkJaWYge1tzdHJpbmcgY29tcGFyZSAkbWF0Y2ggIiJdfSB7CgkJICAgIHJldHVybiAkbWF0Y2gKCQl9CgkgICAgfQoJfQogICAgfQogICAgcmV0dXJuIHt9Cn0KCiMgdGtUcmF2ZXJzZVRvTWVudSAtLQojIFRoaXMgcHJvY2VkdXJlIGltcGxlbWVudHMga2V5Ym9hcmQgdHJhdmVyc2FsIG9mIG1lbnVzLiAgR2l2ZW4gYW4KIyBBU0NJSSBjaGFyYWN0ZXIgImNoYXIiLCBpdCBsb29rcyBmb3IgYSBtZW51YnV0dG9uIHdpdGggdGhhdCBjaGFyYWN0ZXIKIyB1bmRlcmxpbmVkLiAgSWYgb25lIGlzIGZvdW5kLCBpdCBwb3N0cyB0aGUgbWVudWJ1dHRvbidzIG1lbnUKIwojIEFyZ3VtZW50czoKIyB3IC0JCQkJV2luZG93IGluIHdoaWNoIHRoZSBrZXkgd2FzIHR5cGVkIChzZWxlY3RzCiMJCQkJYSB0b3BsZXZlbCB3aW5kb3cpLgojIGNoYXIgLQkJCUNoYXJhY3RlciB0aGF0IHNlbGVjdHMgYSBtZW51LiAgVGhlIGNhc2UKIwkJCQlpcyBpZ25vcmVkLiAgSWYgYW4gZW1wdHkgc3RyaW5nLCBub3RoaW5nCiMJCQkJaGFwcGVucy4KCnByb2MgdGtUcmF2ZXJzZVRvTWVudSB7dyBjaGFyfSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkY2hhciAiIl19IHsKCXJldHVybgogICAgfQogICAgd2hpbGUge1tzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICR3XSAiTWVudSJdfSB7CglpZiB7W3N0cmluZyBjb21wYXJlIFskdyBjZ2V0IC10eXBlXSAibWVudWJhciJdIFwKCQkmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYocG9zdGVkTWIpICIiXX0gewoJICAgIHJldHVybgoJfQoJaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXR5cGVdICJtZW51YmFyIl19IHsKCSAgICBicmVhawoJfQoJc2V0IHcgW3dpbmZvIHBhcmVudCAkd10KICAgIH0KICAgIHNldCB3IFt0a01lbnVGaW5kIFt3aW5mbyB0b3BsZXZlbCAkd10gJGNoYXJdCiAgICBpZiB7W3N0cmluZyBjb21wYXJlICR3ICIiXX0gewoJaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICR3XSAiTWVudSJdfSB7CgkgICAgdGtfbWVudVNldEZvY3VzICR3CgkgICAgc2V0IHRrUHJpdih3aW5kb3cpICR3CgkgICAgdGtTYXZlR3JhYkluZm8gJHcKCSAgICBncmFiIC1nbG9iYWwgJHcKCSAgICB0a1RyYXZlcnNlV2l0aGluTWVudSAkdyAkY2hhcgoJfSBlbHNlIHsKCSAgICB0a01iUG9zdCAkdwoJICAgIHRrTWVudUZpcnN0RW50cnkgWyR3IGNnZXQgLW1lbnVdCgl9CiAgICB9Cn0KCiMgdGtGaXJzdE1lbnUgLS0KIyBUaGlzIHByb2NlZHVyZSB0cmF2ZXJzZXMgdG8gdGhlIGZpcnN0IG1lbnVidXR0b24gaW4gdGhlIHRvcGxldmVsCiMgZm9yIGEgZ2l2ZW4gd2luZG93LCBhbmQgcG9zdHMgdGhhdCBtZW51YnV0dG9uJ3MgbWVudS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCQkJTmFtZSBvZiBhIHdpbmRvdy4gIFNlbGVjdHMgd2hpY2ggdG9wbGV2ZWwKIwkJCQl0byBzZWFyY2ggZm9yIG1lbnVidXR0b25zLgoKcHJvYyB0a0ZpcnN0TWVudSB3IHsKICAgIHNldCB3IFt0a01lbnVGaW5kIFt3aW5mbyB0b3BsZXZlbCAkd10gIiJdCiAgICBpZiB7W3N0cmluZyBjb21wYXJlICR3ICIiXX0gewoJaWYge1tzdHJpbmcgZXF1YWwgW3dpbmZvIGNsYXNzICR3XSAiTWVudSJdfSB7CgkgICAgdGtfbWVudVNldEZvY3VzICR3CgkgICAgc2V0IHRrUHJpdih3aW5kb3cpICR3CgkgICAgdGtTYXZlR3JhYkluZm8gJHcKCSAgICBncmFiIC1nbG9iYWwgJHcKCSAgICB0a01lbnVGaXJzdEVudHJ5ICR3Cgl9IGVsc2UgewoJICAgIHRrTWJQb3N0ICR3CgkgICAgdGtNZW51Rmlyc3RFbnRyeSBbJHcgY2dldCAtbWVudV0KCX0KICAgIH0KfQoKIyB0a1RyYXZlcnNlV2l0aGluTWVudQojIFRoaXMgcHJvY2VkdXJlIGltcGxlbWVudHMga2V5Ym9hcmQgdHJhdmVyc2FsIHdpdGhpbiBhIG1lbnUuICBJdAojIHNlYXJjaGVzIGZvciBhbiBlbnRyeSBpbiB0aGUgbWVudSB0aGF0IGhhcyAiY2hhciIgdW5kZXJsaW5lZC4gIElmCiMgc3VjaCBhbiBlbnRyeSBpcyBmb3VuZCwgaXQgaXMgaW52b2tlZCBhbmQgdGhlIG1lbnUgaXMgdW5wb3N0ZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJCVRoZSBuYW1lIG9mIHRoZSBtZW51IHdpZGdldC4KIyBjaGFyIC0JCQlUaGUgY2hhcmFjdGVyIHRvIGxvb2sgZm9yOyAgY2FzZSBpcwojCQkJCWlnbm9yZWQuICBJZiB0aGUgc3RyaW5nIGlzIGVtcHR5IHRoZW4KIwkJCQlub3RoaW5nIGhhcHBlbnMuCgpwcm9jIHRrVHJhdmVyc2VXaXRoaW5NZW51IHt3IGNoYXJ9IHsKICAgIGlmIHtbc3RyaW5nIGVxdWFsICRjaGFyICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgY2hhciBbc3RyaW5nIHRvbG93ZXIgJGNoYXJdCiAgICBzZXQgbGFzdCBbJHcgaW5kZXggbGFzdF0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRsYXN0ICJub25lIl19IHsKCXJldHVybgogICAgfQogICAgZm9yIHtzZXQgaSAwfSB7JGkgPD0gJGxhc3R9IHtpbmNyIGl9IHsKCWlmIHtbY2F0Y2gge3NldCBjaGFyMiBbc3RyaW5nIGluZGV4IFwKCQlbJHcgZW50cnljZ2V0ICRpIC1sYWJlbF0gWyR3IGVudHJ5Y2dldCAkaSAtdW5kZXJsaW5lXV19XX0gewoJICAgIGNvbnRpbnVlCgl9CglpZiB7W3N0cmluZyBlcXVhbCAkY2hhciBbc3RyaW5nIHRvbG93ZXIgJGNoYXIyXV19IHsKCSAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgdHlwZSAkaV0gImNhc2NhZGUiXX0gewoJCSR3IGFjdGl2YXRlICRpCgkJJHcgcG9zdGNhc2NhZGUgYWN0aXZlCgkJZXZlbnQgZ2VuZXJhdGUgJHcgPDxNZW51U2VsZWN0Pj4KCQlzZXQgbTIgWyR3IGVudHJ5Y2dldCAkaSAtbWVudV0KCQlpZiB7W3N0cmluZyBjb21wYXJlICRtMiAiIl19IHsKCQkgICAgdGtNZW51Rmlyc3RFbnRyeSAkbTIKCQl9CgkgICAgfSBlbHNlIHsKCQl0a01lbnVVbnBvc3QgJHcKCQl1cGxldmVsICMwIFtsaXN0ICR3IGludm9rZSAkaV0KCSAgICB9CgkgICAgcmV0dXJuCgl9CiAgICB9Cn0KCiMgdGtNZW51Rmlyc3RFbnRyeSAtLQojIEdpdmVuIGEgbWVudSwgdGhpcyBwcm9jZWR1cmUgZmluZHMgdGhlIGZpcnN0IGVudHJ5IHRoYXQgaXNuJ3QKIyBkaXNhYmxlZCBvciBhIHRlYXItb2ZmIG9yIHNlcGFyYXRvciwgYW5kIGFjdGl2YXRlcyB0aGF0IGVudHJ5LgojIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIGVudHJ5IGluIHRoZSBtZW51IChlLmcuLAojIGJlY2F1c2Ugb2YgYSBwcmV2aW91cyBjYWxsIHRvIHRrUG9zdE92ZXJQb2ludCkgdGhlbiB0aGUgYWN0aXZlCiMgZW50cnkgaXNuJ3QgY2hhbmdlZC4gIFRoaXMgcHJvY2VkdXJlIGFsc28gc2V0cyB0aGUgaW5wdXQgZm9jdXMKIyB0byB0aGUgbWVudS4KIwojIEFyZ3VtZW50czoKIyBtZW51IC0JCU5hbWUgb2YgdGhlIG1lbnUgd2luZG93IChwb3NzaWJseSBlbXB0eSkuCgpwcm9jIHRrTWVudUZpcnN0RW50cnkgbWVudSB7CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkbWVudSAiIl19IHsKCXJldHVybgogICAgfQogICAgdGtfbWVudVNldEZvY3VzICRtZW51CiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskbWVudSBpbmRleCBhY3RpdmVdICJub25lIl19IHsKCXJldHVybgogICAgfQogICAgc2V0IGxhc3QgWyRtZW51IGluZGV4IGxhc3RdCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkbGFzdCAibm9uZSJdfSB7CglyZXR1cm4KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRsYXN0fSB7aW5jciBpfSB7CglpZiB7KFtjYXRjaCB7c2V0IHN0YXRlIFskbWVudSBlbnRyeWNnZXQgJGkgLXN0YXRlXX1dID09IDApIFwKCQkmJiBbc3RyaW5nIGNvbXBhcmUgJHN0YXRlICJkaXNhYmxlZCJdIFwKCQkmJiBbc3RyaW5nIGNvbXBhcmUgWyRtZW51IHR5cGUgJGldICJ0ZWFyb2ZmIl19IHsKCSAgICAkbWVudSBhY3RpdmF0ZSAkaQoJICAgIHRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51CgkgICAgaWYge1tzdHJpbmcgZXF1YWwgWyRtZW51IHR5cGUgJGldICJjYXNjYWRlIl19IHsKCQlzZXQgY2FzY2FkZSBbJG1lbnUgZW50cnljZ2V0ICRpIC1tZW51XQoJCWlmIHtbc3RyaW5nIGNvbXBhcmUgJGNhc2NhZGUgIiJdfSB7CgkJICAgICRtZW51IHBvc3RjYXNjYWRlICRpCgkJICAgIHRrTWVudUZpcnN0RW50cnkgJGNhc2NhZGUKCQl9CgkgICAgfQoJICAgIHJldHVybgoJfQogICAgfQp9CgojIHRrTWVudUZpbmROYW1lIC0tCiMgR2l2ZW4gYSBtZW51IGFuZCBhIHRleHQgc3RyaW5nLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBtZW51IGVudHJ5CiMgdGhhdCBkaXNwbGF5cyB0aGUgc3RyaW5nIGFzIGl0cyBsYWJlbC4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggZW50cnksCiMgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4gIFRoaXMgcHJvY2VkdXJlIGlzIHRyaWNreSBiZWNhdXNlIHNvbWUgbmFtZXMKIyBsaWtlICJhY3RpdmUiIGhhdmUgYSBzcGVjaWFsIG1lYW5pbmcgaW4gbWVudSBjb21tYW5kcywgc28gd2UgY2FuJ3QKIyBhbHdheXMgdXNlIHRoZSAiaW5kZXgiIHdpZGdldCBjb21tYW5kLgojCiMgQXJndW1lbnRzOgojIG1lbnUgLQkJTmFtZSBvZiB0aGUgbWVudSB3aWRnZXQuCiMgcyAtCQkJU3RyaW5nIHRvIGxvb2sgZm9yLgoKcHJvYyB0a01lbnVGaW5kTmFtZSB7bWVudSBzfSB7CiAgICBzZXQgaSAiIgogICAgaWYgeyFbcmVnZXhwIHteYWN0aXZlJHxebGFzdCR8Xm5vbmUkfF5bMC05XXxeQH0gJHNdfSB7CgljYXRjaCB7c2V0IGkgWyRtZW51IGluZGV4ICRzXX0KCXJldHVybiAkaQogICAgfQogICAgc2V0IGxhc3QgWyRtZW51IGluZGV4IGxhc3RdCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkbGFzdCAibm9uZSJdfSB7CglyZXR1cm4KICAgIH0KICAgIGZvciB7c2V0IGkgMH0geyRpIDw9ICRsYXN0fSB7aW5jciBpfSB7CglpZiB7IVtjYXRjaCB7JG1lbnUgZW50cnljZ2V0ICRpIC1sYWJlbH0gbGFiZWxdfSB7CgkgICAgaWYge1tzdHJpbmcgZXF1YWwgJGxhYmVsICRzXX0gewoJCXJldHVybiAkaQoJICAgIH0KCX0KICAgIH0KICAgIHJldHVybiAiIgp9CgojIHRrUG9zdE92ZXJQb2ludCAtLQojIFRoaXMgcHJvY2VkdXJlIHBvc3RzIGEgZ2l2ZW4gbWVudSBzdWNoIHRoYXQgYSBnaXZlbiBlbnRyeSBpbiB0aGUKIyBtZW51IGlzIGNlbnRlcmVkIG92ZXIgYSBnaXZlbiBwb2ludCBpbiB0aGUgcm9vdCB3aW5kb3cuICBJdCBhbHNvCiMgYWN0aXZhdGVzIHRoZSBnaXZlbiBlbnRyeS4KIwojIEFyZ3VtZW50czoKIyBtZW51IC0JCU1lbnUgdG8gcG9zdC4KIyB4LCB5IC0JCVJvb3QgY29vcmRpbmF0ZXMgb2YgcG9pbnQuCiMgZW50cnkgLQkJSW5kZXggb2YgZW50cnkgd2l0aGluIG1lbnUgdG8gY2VudGVyIG92ZXIgKHgseSkuCiMJCQlJZiBvbWl0dGVkIG9yIHNwZWNpZmllZCBhcyB7fSwgdGhlbiB0aGUgbWVudSdzCiMJCQl1cHBlci1sZWZ0IGNvcm5lciBnb2VzIGF0ICh4LHkpLgoKcHJvYyB0a1Bvc3RPdmVyUG9pbnQge21lbnUgeCB5IHtlbnRyeSB7fX19ICB7CiAgICBnbG9iYWwgdGNsX3BsYXRmb3JtCiAgICAKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGVudHJ5IHt9XX0gewoJaWYgeyRlbnRyeSA9PSBbJG1lbnUgaW5kZXggbGFzdF19IHsKCSAgICBpbmNyIHkgW2V4cHIgey0oWyRtZW51IHlwb3NpdGlvbiAkZW50cnldIFwKCQkgICAgKyBbd2luZm8gcmVxaGVpZ2h0ICRtZW51XSkvMn1dCgl9IGVsc2UgewoJICAgIGluY3IgeSBbZXhwciB7LShbJG1lbnUgeXBvc2l0aW9uICRlbnRyeV0gXAoJCSAgICArIFskbWVudSB5cG9zaXRpb24gW2V4cHIgeyRlbnRyeSsxfV1dKS8yfV0KCX0KCWluY3IgeCBbZXhwciB7LVt3aW5mbyByZXF3aWR0aCAkbWVudV0vMn1dCiAgICB9CiAgICAkbWVudSBwb3N0ICR4ICR5CiAgICBpZiB7W3N0cmluZyBjb21wYXJlICRlbnRyeSB7fV0gXAoJICAgICYmIFtzdHJpbmcgY29tcGFyZSBbJG1lbnUgZW50cnljZ2V0ICRlbnRyeSAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CgkkbWVudSBhY3RpdmF0ZSAkZW50cnkKCXRrR2VuZXJhdGVNZW51U2VsZWN0ICRtZW51CiAgICB9Cn0KCiMgdGtTYXZlR3JhYkluZm8gLS0KIyBTZXRzIHRoZSB2YXJpYWJsZXMgdGtQcml2KG9sZEdyYWIpIGFuZCB0a1ByaXYoZ3JhYlN0YXR1cykgdG8gcmVjb3JkCiMgdGhlIHN0YXRlIG9mIGFueSBleGlzdGluZyBncmFiIG9uIHRoZSB3J3MgZGlzcGxheS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCQlOYW1lIG9mIGEgd2luZG93OyAgdXNlZCB0byBzZWxlY3QgdGhlIGRpc3BsYXkKIwkJCXdob3NlIGdyYWIgaW5mb3JtYXRpb24gaXMgdG8gYmUgcmVjb3JkZWQuCgpwcm9jIHRrU2F2ZUdyYWJJbmZvIHcgewogICAgZ2xvYmFsIHRrUHJpdgogICAgc2V0IHRrUHJpdihvbGRHcmFiKSBbZ3JhYiBjdXJyZW50ICR3XQogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KG9sZEdyYWIpICIiXX0gewoJc2V0IHRrUHJpdihncmFiU3RhdHVzKSBbZ3JhYiBzdGF0dXMgJHRrUHJpdihvbGRHcmFiKV0KICAgIH0KfQoKIyB0a1Jlc3RvcmVPbGRHcmFiIC0tCiMgUmVzdG9yZXMgdGhlIGdyYWIgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIFRrU2F2ZUdyYWJJbmZvIHdhcyBjYWxsZWQuCiMKCnByb2MgdGtSZXN0b3JlT2xkR3JhYiB7fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KG9sZEdyYWIpICIiXX0gewoKICAgIAkjIEJlIGNhcmVmdWwgcmVzdG9yaW5nIHRoZSBvbGQgZ3JhYiwgc2luY2UgaXQncyB3aW5kb3cgbWF5IG5vdAoJIyBiZSB2aXNpYmxlIGFueW1vcmUuCgoJY2F0Y2ggewogICAgICAgICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihncmFiU3RhdHVzKSAiZ2xvYmFsIl19IHsKCQlncmFiIHNldCAtZ2xvYmFsICR0a1ByaXYob2xkR3JhYikKCSAgICB9IGVsc2UgewoJCWdyYWIgc2V0ICR0a1ByaXYob2xkR3JhYikKCSAgICB9Cgl9CglzZXQgdGtQcml2KG9sZEdyYWIpICIiCiAgICB9Cn0KCnByb2MgdGtfbWVudVNldEZvY3VzIHttZW51fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7IVtpbmZvIGV4aXN0cyB0a1ByaXYoZm9jdXMpXSB8fCBbc3RyaW5nIGVxdWFsICR0a1ByaXYoZm9jdXMpIHt9XX0gewoJc2V0IHRrUHJpdihmb2N1cykgW2ZvY3VzXQogICAgfQogICAgZm9jdXMgJG1lbnUKfQogICAgCnByb2MgdGtHZW5lcmF0ZU1lbnVTZWxlY3Qge21lbnV9IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGFjdGl2ZU1lbnUpICRtZW51XSBcCiAgICAgICAgICAmJiBbc3RyaW5nIGVxdWFsICR0a1ByaXYoYWN0aXZlSXRlbSkgWyRtZW51IGluZGV4IGFjdGl2ZV1dfSB7CglyZXR1cm4KICAgIH0KCiAgICBzZXQgdGtQcml2KGFjdGl2ZU1lbnUpICRtZW51CiAgICBzZXQgdGtQcml2KGFjdGl2ZUl0ZW0pIFskbWVudSBpbmRleCBhY3RpdmVdCiAgICBldmVudCBnZW5lcmF0ZSAkbWVudSA8PE1lbnVTZWxlY3Q+Pgp9CgojIHRrX3BvcHVwIC0tCiMgVGhpcyBwcm9jZWR1cmUgcG9wcyB1cCBhIG1lbnUgYW5kIHNldHMgdGhpbmdzIHVwIGZvciB0cmF2ZXJzaW5nCiMgdGhlIG1lbnUgYW5kIGl0cyBzdWJtZW51cy4KIwojIEFyZ3VtZW50czoKIyBtZW51IC0JCU5hbWUgb2YgdGhlIG1lbnUgdG8gYmUgcG9wcGVkIHVwLgojIHgsIHkgLQkJUm9vdCBjb29yZGluYXRlcyBhdCB3aGljaCB0byBwb3AgdXAgdGhlCiMJCQltZW51LgojIGVudHJ5IC0JCUluZGV4IG9mIGEgbWVudSBlbnRyeSB0byBjZW50ZXIgb3ZlciAoeCx5KS4KIwkJCUlmIG9taXR0ZWQgb3Igc3BlY2lmaWVkIGFzIHt9LCB0aGVuIG1lbnUncwojCQkJdXBwZXItbGVmdCBjb3JuZXIgZ29lcyBhdCAoeCx5KS4KCnByb2MgdGtfcG9wdXAge21lbnUgeCB5IHtlbnRyeSB7fX19IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihwb3B1cCkgIiJdIFwKCSAgICB8fCBbc3RyaW5nIGNvbXBhcmUgJHRrUHJpdihwb3N0ZWRNYikgIiJdfSB7Cgl0a01lbnVVbnBvc3Qge30KICAgIH0KICAgIHRrUG9zdE92ZXJQb2ludCAkbWVudSAkeCAkeSAkZW50cnkKICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ1bml4Il0gXAoJICAgICYmIFt3aW5mbyB2aWV3YWJsZSAkbWVudV19IHsKICAgICAgICB0a1NhdmVHcmFiSW5mbyAkbWVudQoJZ3JhYiAtZ2xvYmFsICRtZW51CglzZXQgdGtQcml2KHBvcHVwKSAkbWVudQoJdGtfbWVudVNldEZvY3VzICRtZW51CiAgICB9Cn0KAAAGeyMgb3B0TWVudS50Y2wgLS0KIwojIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwcm9jZWR1cmUgdGtfb3B0aW9uTWVudSwgd2hpY2ggY3JlYXRlcwojIGFuIG9wdGlvbiBidXR0b24gYW5kIGl0cyBhc3NvY2lhdGVkIG1lbnUuCiMKIyBSQ1M6IEAoIykgJElkOiBvcHRNZW51LnRjbCx2IDEuMyAxOTk4LzA5LzE0IDE4OjIzOjI0IHN0YW50b24gRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgojIENvcHlyaWdodCAoYykgMTk5NCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIHRrX29wdGlvbk1lbnUgLS0KIyBUaGlzIHByb2NlZHVyZSBjcmVhdGVzIGFuIG9wdGlvbiBidXR0b24gbmFtZWQgJHcgYW5kIGFuIGFzc29jaWF0ZWQKIyBtZW51LiAgVG9nZXRoZXIgdGhleSBwcm92aWRlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIE1vdGlmIG9wdGlvbiBtZW51czoKIyB0aGV5IGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBvbmUgb2YgbWFueSB2YWx1ZXMsIGFuZCB0aGUgY3VycmVudCB2YWx1ZQojIGFwcGVhcnMgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSB2YXJOYW1lLCBhcyB3ZWxsIGFzIGluIHRoZSB0ZXh0IG9mCiMgdGhlIG9wdGlvbiBtZW51YnV0dG9uLiAgVGhlIG5hbWUgb2YgdGhlIG1lbnUgaXMgcmV0dXJuZWQgYXMgdGhlCiMgcHJvY2VkdXJlJ3MgcmVzdWx0LCBzbyB0aGF0IHRoZSBjYWxsZXIgY2FuIHVzZSBpdCB0byBjaGFuZ2UgY29uZmlndXJhdGlvbgojIG9wdGlvbnMgb24gdGhlIG1lbnUgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGUgaXQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQkJVGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgbWVudWJ1dHRvbi4KIyB2YXJOYW1lIC0JCUdsb2JhbCB2YXJpYWJsZSB0byBob2xkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdmFsdWUuCiMgZmlyc3RWYWx1ZSAtCQlGaXJzdCBvZiBsZWdhbCB2YWx1ZXMgZm9yIG9wdGlvbiAobXVzdCBiZSA+PSAxKS4KIyBhcmdzIC0JCUFueSBudW1iZXIgb2YgYWRkaXRpb25hbCB2YWx1ZXMuCgpwcm9jIHRrX29wdGlvbk1lbnUge3cgdmFyTmFtZSBmaXJzdFZhbHVlIGFyZ3N9IHsKICAgIHVwdmFyICMwICR2YXJOYW1lIHZhcgoKICAgIGlmIHshW2luZm8gZXhpc3RzIHZhcl19IHsKCXNldCB2YXIgJGZpcnN0VmFsdWUKICAgIH0KICAgIG1lbnVidXR0b24gJHcgLXRleHR2YXJpYWJsZSAkdmFyTmFtZSAtaW5kaWNhdG9yb24gMSAtbWVudSAkdy5tZW51IFwKCSAgICAtcmVsaWVmIHJhaXNlZCAtYmQgMiAtaGlnaGxpZ2h0dGhpY2tuZXNzIDIgLWFuY2hvciBjIFwKCSAgICAtZGlyZWN0aW9uIGZsdXNoCiAgICBtZW51ICR3Lm1lbnUgLXRlYXJvZmYgMAogICAgJHcubWVudSBhZGQgcmFkaW9idXR0b24gLWxhYmVsICRmaXJzdFZhbHVlIC12YXJpYWJsZSAkdmFyTmFtZQogICAgZm9yZWFjaCBpICRhcmdzIHsKICAgIAkkdy5tZW51IGFkZCByYWRpb2J1dHRvbiAtbGFiZWwgJGkgLXZhcmlhYmxlICR2YXJOYW1lCiAgICB9CiAgICByZXR1cm4gJHcubWVudQp9CgAAHOQjIHBhbGV0dGUudGNsIC0tCiMKIyBUaGlzIGZpbGUgY29udGFpbnMgcHJvY2VkdXJlcyB0aGF0IGNoYW5nZSB0aGUgY29sb3IgcGFsZXR0ZSB1c2VkCiMgYnkgVGsuCiMKIyBSQ1M6IEAoIykgJElkOiBwYWxldHRlLnRjbCx2IDEuNSAxOTk5LzA5LzAyIDE3OjAyOjUzIGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIHRrX3NldFBhbGV0dGUgLS0KIyBDaGFuZ2VzIHRoZSBkZWZhdWx0IGNvbG9yIHNjaGVtZSBmb3IgYSBUayBhcHBsaWNhdGlvbiBieSBzZXR0aW5nCiMgZGVmYXVsdCBjb2xvcnMgaW4gdGhlIG9wdGlvbiBkYXRhYmFzZSBhbmQgYnkgbW9kaWZ5aW5nIGFsbCBvZiB0aGUKIyBjb2xvciBvcHRpb25zIGZvciBleGlzdGluZyB3aWRnZXRzIHRoYXQgaGF2ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KIwojIEFyZ3VtZW50czoKIyBUaGUgYXJndW1lbnRzIGNvbnNpc3Qgb2YgZWl0aGVyIGEgc2luZ2xlIGNvbG9yIG5hbWUsIHdoaWNoCiMgd2lsbCBiZSB1c2VkIGFzIHRoZSBuZXcgYmFja2dyb3VuZCBjb2xvciAoYWxsIG90aGVyIGNvbG9ycyB3aWxsCiMgYmUgY29tcHV0ZWQgZnJvbSB0aGlzKSBvciBhbiBldmVuIG51bWJlciBvZiB2YWx1ZXMgY29uc2lzdGluZyBvZgojIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzLiAgVGhlIG5hbWUgZm9yIGFuIG9wdGlvbiBpcyB0aGUgb25lIHVzZWQKIyBmb3IgdGhlIG9wdGlvbiBkYXRhYmFzZSwgc3VjaCBhcyBhY3RpdmVGb3JlZ3JvdW5kLCBub3QgLWFjdGl2ZWZvcmVncm91bmQuCgpwcm9jIHRrX3NldFBhbGV0dGUge2FyZ3N9IHsKICAgIGlmIHtbd2luZm8gZGVwdGggLl0gPT0gMX0gewoJIyBKdXN0IHJldHVybiBvbiBtb25vY2hyb21lIGRpc3BsYXlzLCBvdGhlcndpc2UgZXJyb3JzIHdpbGwgb2NjdXIKCXJldHVybgogICAgfQoKICAgIGdsb2JhbCB0a1BhbGV0dGUKCiAgICAjIENyZWF0ZSBhbiBhcnJheSB0aGF0IGhhcyB0aGUgY29tcGxldGUgbmV3IHBhbGV0dGUuICBJZiBzb21lIGNvbG9ycwogICAgIyBhcmVuJ3Qgc3BlY2lmaWVkLCBjb21wdXRlIHRoZW0gZnJvbSBvdGhlciBjb2xvcnMgdGhhdCBhcmUgc3BlY2lmaWVkLgoKICAgIGlmIHtbbGxlbmd0aCAkYXJnc10gPT0gMX0gewoJc2V0IG5ldyhiYWNrZ3JvdW5kKSBbbGluZGV4ICRhcmdzIDBdCiAgICB9IGVsc2UgewoJYXJyYXkgc2V0IG5ldyAkYXJncwogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KGJhY2tncm91bmQpXX0gewoJZXJyb3IgIm11c3Qgc3BlY2lmeSBhIGJhY2tncm91bmQgY29sb3IiCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcoZm9yZWdyb3VuZCldfSB7CglzZXQgbmV3KGZvcmVncm91bmQpIGJsYWNrCiAgICB9CiAgICBzZXQgYmcgW3dpbmZvIHJnYiAuICRuZXcoYmFja2dyb3VuZCldCiAgICBzZXQgZmcgW3dpbmZvIHJnYiAuICRuZXcoZm9yZWdyb3VuZCldCiAgICBzZXQgZGFya2VyQmcgW2Zvcm1hdCAjJTAyeCUwMnglMDJ4IFtleHByIHsoOSpbbGluZGV4ICRiZyAwXSkvMjU2MH1dIFwKCSAgICBbZXhwciB7KDkqW2xpbmRleCAkYmcgMV0pLzI1NjB9XSBbZXhwciB7KDkqW2xpbmRleCAkYmcgMl0pLzI1NjB9XV0KICAgIGZvcmVhY2ggaSB7YWN0aXZlRm9yZWdyb3VuZCBpbnNlcnRCYWNrZ3JvdW5kIHNlbGVjdEZvcmVncm91bmQgXAoJICAgIGhpZ2hsaWdodENvbG9yfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBuZXcoJGkpXX0gewoJICAgIHNldCBuZXcoJGkpICRuZXcoZm9yZWdyb3VuZCkKCX0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIG5ldyhkaXNhYmxlZEZvcmVncm91bmQpXX0gewoJc2V0IG5ldyhkaXNhYmxlZEZvcmVncm91bmQpIFtmb3JtYXQgIyUwMnglMDJ4JTAyeCBcCgkJW2V4cHIgeygzKltsaW5kZXggJGJnIDBdICsgW2xpbmRleCAkZmcgMF0pLzEwMjR9XSBcCgkJW2V4cHIgeygzKltsaW5kZXggJGJnIDFdICsgW2xpbmRleCAkZmcgMV0pLzEwMjR9XSBcCgkJW2V4cHIgeygzKltsaW5kZXggJGJnIDJdICsgW2xpbmRleCAkZmcgMl0pLzEwMjR9XV0KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIG5ldyhoaWdobGlnaHRCYWNrZ3JvdW5kKV19IHsKCXNldCBuZXcoaGlnaGxpZ2h0QmFja2dyb3VuZCkgJG5ldyhiYWNrZ3JvdW5kKQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KGFjdGl2ZUJhY2tncm91bmQpXX0gewoJIyBQaWNrIGEgZGVmYXVsdCBhY3RpdmUgYmFja2dyb3VuZCB0aGF0IGlzbGlnaHRlciB0aGFuIHRoZQoJIyBub3JtYWwgYmFja2dyb3VuZC4gIFRvIGRvIHRoaXMsIHJvdW5kIGVhY2ggY29sb3IgY29tcG9uZW50CgkjIHVwIGJ5IDE1JSBvciAxLzMgb2YgdGhlIHdheSB0byBmdWxsIHdoaXRlLCB3aGljaGV2ZXIgaXMKCSMgZ3JlYXRlci4KCglmb3JlYWNoIGkgezAgMSAyfSB7CgkgICAgc2V0IGxpZ2h0KCRpKSBbZXhwciB7W2xpbmRleCAkYmcgJGldLzI1Nn1dCgkgICAgc2V0IGluYzEgW2V4cHIgeygkbGlnaHQoJGkpKjE1KS8xMDB9XQoJICAgIHNldCBpbmMyIFtleHByIHsoMjU1LSRsaWdodCgkaSkpLzN9XQoJICAgIGlmIHskaW5jMSA+ICRpbmMyfSB7CgkJaW5jciBsaWdodCgkaSkgJGluYzEKCSAgICB9IGVsc2UgewoJCWluY3IgbGlnaHQoJGkpICRpbmMyCgkgICAgfQoJICAgIGlmIHskbGlnaHQoJGkpID4gMjU1fSB7CgkJc2V0IGxpZ2h0KCRpKSAyNTUKCSAgICB9Cgl9CglzZXQgbmV3KGFjdGl2ZUJhY2tncm91bmQpIFtmb3JtYXQgIyUwMnglMDJ4JTAyeCAkbGlnaHQoMCkgXAoJCSRsaWdodCgxKSAkbGlnaHQoMildCiAgICB9CiAgICBpZiB7IVtpbmZvIGV4aXN0cyBuZXcoc2VsZWN0QmFja2dyb3VuZCldfSB7CglzZXQgbmV3KHNlbGVjdEJhY2tncm91bmQpICRkYXJrZXJCZwogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KHRyb3VnaENvbG9yKV19IHsKCXNldCBuZXcodHJvdWdoQ29sb3IpICRkYXJrZXJCZwogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgbmV3KHNlbGVjdENvbG9yKV19IHsKCXNldCBuZXcoc2VsZWN0Q29sb3IpICNiMDMwNjAKICAgIH0KCiAgICAjIGxldCdzIG1ha2Ugb25lIG9mIGVhY2ggb2YgdGhlIHdpZGdldHMgc28gd2Uga25vdyB3aGF0IHRoZSAKICAgICMgZGVmYXVsdHMgYXJlIGN1cnJlbnRseSBmb3IgdGhpcyBwbGF0Zm9ybS4KICAgIHRvcGxldmVsIC5fX190a19zZXRfcGFsZXR0ZQogICAgd20gd2l0aGRyYXcgLl9fX3RrX3NldF9wYWxldHRlCiAgICBmb3JlYWNoIHEge2J1dHRvbiBjYW52YXMgY2hlY2tidXR0b24gZW50cnkgZnJhbWUgbGFiZWwgbGlzdGJveCBcCgkgICAgbWVudWJ1dHRvbiBtZW51IG1lc3NhZ2UgcmFkaW9idXR0b24gc2NhbGUgc2Nyb2xsYmFyIHRleHR9IHsKCSRxIC5fX190a19zZXRfcGFsZXR0ZS4kcQogICAgfQoKICAgICMgV2FsayB0aGUgd2lkZ2V0IGhpZXJhcmNoeSwgcmVjb2xvcmluZyBhbGwgZXhpc3Rpbmcgd2luZG93cy4KICAgICMgVGhlIG9wdGlvbiBkYXRhYmFzZSBtdXN0IGJlIHNldCBhY2NvcmRpbmcgdG8gd2hhdCB3ZSBkbyBoZXJlLCAKICAgICMgYnV0IGl0IGJyZWFrcyB0aGluZ3MgaWYgd2Ugc2V0IHRoaW5ncyBpbiB0aGUgZGF0YWJhc2Ugd2hpbGUgCiAgICAjIHdlIGFyZSBjaGFuZ2luZyBjb2xvcnMuLi5zbywgdGtSZWNvbG9yVHJlZSBub3cgcmV0dXJucyB0aGUKICAgICMgb3B0aW9uIGRhdGFiYXNlIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIG1hZGUsIGFuZCB0aGV5CiAgICAjIG5lZWQgdG8gYmUgZXZhbGxlZCBoZXJlIHRvIHRha2UgZWZmZWN0LgogICAgIyBXZSBoYXZlIHRvIHdhbGsgdGhlIHdob2xlIHdpZGdldCB0cmVlIGluc3RlYWQgb2YganVzdCAKICAgICMgcmVseWluZyBvbiB0aGUgd2lkZ2V0cyB3ZSd2ZSBjcmVhdGVkIGFib3ZlIHRvIGRvIHRoZSB3b3JrCiAgICAjIGJlY2F1c2UgZGlmZmVyZW50IGV4dGVuc2lvbnMgbWF5IHByb3ZpZGUgb3RoZXIga2luZHMKICAgICMgb2Ygd2lkZ2V0cyB0aGF0IHdlIGRvbid0IGN1cnJlbnRseSBrbm93IGFib3V0LCBzbyB3ZSdsbAogICAgIyB3YWxrIHRoZSB3aG9sZSBoaWVyYXJjaHkganVzdCBpbiBjYXNlLgoKICAgIGV2YWwgW3RrUmVjb2xvclRyZWUgLiBuZXddCgogICAgY2F0Y2gge2Rlc3Ryb3kgLl9fX3RrX3NldF9wYWxldHRlfQoKICAgICMgQ2hhbmdlIHRoZSBvcHRpb24gZGF0YWJhc2Ugc28gdGhhdCBmdXR1cmUgd2luZG93cyB3aWxsIGdldCB0aGUKICAgICMgc2FtZSBjb2xvcnMuCgogICAgZm9yZWFjaCBvcHRpb24gW2FycmF5IG5hbWVzIG5ld10gewoJb3B0aW9uIGFkZCAqJG9wdGlvbiAkbmV3KCRvcHRpb24pIHdpZGdldERlZmF1bHQKICAgIH0KCiAgICAjIFNhdmUgdGhlIG9wdGlvbnMgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSB0a1BhbGV0dGUsIGZvciB1c2UgdGhlCiAgICAjIG5leHQgdGltZSB3ZSBjaGFuZ2UgdGhlIG9wdGlvbnMuCgogICAgYXJyYXkgc2V0IHRrUGFsZXR0ZSBbYXJyYXkgZ2V0IG5ld10KfQoKIyB0a1JlY29sb3JUcmVlIC0tCiMgVGhpcyBwcm9jZWR1cmUgY2hhbmdlcyB0aGUgY29sb3JzIGluIGEgd2luZG93IGFuZCBhbGwgb2YgaXRzCiMgZGVzY2VuZGFudHMsIGFjY29yZGluZyB0byBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgY29sb3JzCiMgYXJndW1lbnQuIFRoaXMgbG9va3MgYXQgdGhlIGRlZmF1bHRzIHByb3ZpZGVkIGJ5IHRoZSBvcHRpb24gCiMgZGF0YWJhc2UsIGlmIGl0IGV4aXN0cywgYW5kIGlmIG5vdCwgdGhlbiBpdCBsb29rcyBhdCB0aGUgZGVmYXVsdAojIHZhbHVlIG9mIHRoZSB3aWRnZXQgaXRzZWxmLgojCiMgQXJndW1lbnRzOgojIHcgLQkJCVRoZSBuYW1lIG9mIGEgd2luZG93LiAgVGhpcyB3aW5kb3cgYW5kIGFsbCBpdHMKIwkJCWRlc2NlbmRhbnRzIGFyZSByZWNvbG9yZWQuCiMgY29sb3JzIC0JCVRoZSBuYW1lIG9mIGFuIGFycmF5IHZhcmlhYmxlIGluIHRoZSBjYWxsZXIsCiMJCQl3aGljaCBjb250YWlucyBjb2xvciBpbmZvcm1hdGlvbi4gIEVhY2ggZWxlbWVudAojCQkJaXMgbmFtZWQgYWZ0ZXIgYSB3aWRnZXQgY29uZmlndXJhdGlvbiBvcHRpb24sIGFuZAojCQkJZWFjaCB2YWx1ZSBpcyB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uLgoKcHJvYyB0a1JlY29sb3JUcmVlIHt3IGNvbG9yc30gewogICAgZ2xvYmFsIHRrUGFsZXR0ZQogICAgdXB2YXIgJGNvbG9ycyBjCiAgICBzZXQgcmVzdWx0IHt9CiAgICBmb3JlYWNoIGRiT3B0aW9uIFthcnJheSBuYW1lcyBjXSB7CglzZXQgb3B0aW9uIC1bc3RyaW5nIHRvbG93ZXIgJGRiT3B0aW9uXQoJaWYgeyFbY2F0Y2ggeyR3IGNvbmZpZyAkb3B0aW9ufSB2YWx1ZV19IHsKCSAgICAjIGlmIHRoZSBvcHRpb24gZGF0YWJhc2UgaGFzIGEgcHJlZmVyZW5jZSBmb3IgdGhpcwoJICAgICMgZGJPcHRpb24sIHRoZW4gdXNlIGl0LCBvdGhlcndpc2UgdXNlIHRoZSBkZWZhdWx0cwoJICAgICMgZm9yIHRoZSB3aWRnZXQuCgkgICAgc2V0IGRlZmF1bHRjb2xvciBbb3B0aW9uIGdldCAkdyAkZGJPcHRpb24gd2lkZ2V0RGVmYXVsdF0KCSAgICBpZiB7W3N0cmluZyBtYXRjaCB7fSAkZGVmYXVsdGNvbG9yXX0gewoJCXNldCBkZWZhdWx0Y29sb3IgW3dpbmZvIHJnYiAuIFtsaW5kZXggJHZhbHVlIDNdXQoJICAgIH0gZWxzZSB7CgkJc2V0IGRlZmF1bHRjb2xvciBbd2luZm8gcmdiIC4gJGRlZmF1bHRjb2xvcl0KCSAgICB9CgkgICAgc2V0IGNob3NlbmNvbG9yIFt3aW5mbyByZ2IgLiBbbGluZGV4ICR2YWx1ZSA0XV0KCSAgICBpZiB7W3N0cmluZyBtYXRjaCAkZGVmYXVsdGNvbG9yICRjaG9zZW5jb2xvcl19IHsKCQkjIENoYW5nZSB0aGUgb3B0aW9uIGRhdGFiYXNlIHNvIHRoYXQgZnV0dXJlIHdpbmRvd3Mgd2lsbCBnZXQKCQkjIHRoZSBzYW1lIGNvbG9ycy4KCQlhcHBlbmQgcmVzdWx0ICI7XG5vcHRpb24gYWRkIFtsaXN0IFwKCQkgICAgKlt3aW5mbyBjbGFzcyAkd10uJGRiT3B0aW9uICRjKCRkYk9wdGlvbikgNjBdIgoJCSR3IGNvbmZpZ3VyZSAkb3B0aW9uICRjKCRkYk9wdGlvbikKCSAgICB9Cgl9CiAgICB9CiAgICBmb3JlYWNoIGNoaWxkIFt3aW5mbyBjaGlsZHJlbiAkd10gewoJYXBwZW5kIHJlc3VsdCAiO1xuW3RrUmVjb2xvclRyZWUgJGNoaWxkIGNdIgogICAgfQogICAgcmV0dXJuICRyZXN1bHQKfQoKIyB0a0RhcmtlbiAtLQojIEdpdmVuIGEgY29sb3IgbmFtZSwgY29tcHV0ZXMgYSBuZXcgY29sb3IgdmFsdWUgdGhhdCBkYXJrZW5zIChvcgojIGJyaWdodGVucykgdGhlIGdpdmVuIGNvbG9yIGJ5IGEgZ2l2ZW4gcGVyY2VudC4KIwojIEFyZ3VtZW50czoKIyBjb2xvciAtCU5hbWUgb2Ygc3RhcnRpbmcgY29sb3IuCiMgcGVyZWNlbnQgLQlJbnRlZ2VyIHRlbGxpbmcgaG93IG11Y2ggdG8gYnJpZ2h0ZW4gb3IgZGFya2VuIGFzIGEKIwkJcGVyY2VudDogNTAgbWVhbnMgZGFya2VuIGJ5IDUwJSwgMTEwIG1lYW5zIGJyaWdodGVuCiMJCWJ5IDEwJS4KCnByb2MgdGtEYXJrZW4ge2NvbG9yIHBlcmNlbnR9IHsKICAgIGZvcmVhY2gge3JlZCBncmVlbiBibHVlfSBbd2luZm8gcmdiIC4gJGNvbG9yXSB7CglzZXQgcmVkIFtleHByIHsoJHJlZC8yNTYpKiRwZXJjZW50LzEwMH1dCglzZXQgZ3JlZW4gW2V4cHIgeygkZ3JlZW4vMjU2KSokcGVyY2VudC8xMDB9XQoJc2V0IGJsdWUgW2V4cHIgeygkYmx1ZS8yNTYpKiRwZXJjZW50LzEwMH1dCglicmVhawogICAgfQogICAgaWYgeyRyZWQgPiAyNTV9IHsKCXNldCByZWQgMjU1CiAgICB9CiAgICBpZiB7JGdyZWVuID4gMjU1fSB7CglzZXQgZ3JlZW4gMjU1CiAgICB9CiAgICBpZiB7JGJsdWUgPiAyNTV9IHsKCXNldCBibHVlIDI1NQogICAgfQogICAgcmV0dXJuIFtmb3JtYXQgIiMlMDJ4JTAyeCUwMngiICRyZWQgJGdyZWVuICRibHVlXQp9CgojIHRrX2Jpc3F1ZSAtLQojIFJlc2V0IHRoZSBUayBjb2xvciBwYWxldHRlIHRvIHRoZSBvbGQgImJpc3F1ZSIgY29sb3JzLgojCiMgQXJndW1lbnRzOgojIE5vbmUuCgpwcm9jIHRrX2Jpc3F1ZSB7fSB7CiAgICB0a19zZXRQYWxldHRlIGFjdGl2ZUJhY2tncm91bmQgI2U2Y2ViMSBhY3RpdmVGb3JlZ3JvdW5kIGJsYWNrIFwKCSAgICBiYWNrZ3JvdW5kICNmZmU0YzQgZGlzYWJsZWRGb3JlZ3JvdW5kICNiMGIwYjAgZm9yZWdyb3VuZCBibGFjayBcCgkgICAgaGlnaGxpZ2h0QmFja2dyb3VuZCAjZmZlNGM0IGhpZ2hsaWdodENvbG9yIGJsYWNrIFwKCSAgICBpbnNlcnRCYWNrZ3JvdW5kIGJsYWNrIHNlbGVjdENvbG9yICNiMDMwNjAgXAoJICAgIHNlbGVjdEJhY2tncm91bmQgI2U2Y2ViMSBzZWxlY3RGb3JlZ3JvdW5kIGJsYWNrIFwKCSAgICB0cm91Z2hDb2xvciAjY2RiNzllCn0KAAAbOyMgc2NhbGUudGNsIC0tCiMKIyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGVmYXVsdCBiaW5kaW5ncyBmb3IgVGsgc2NhbGUgd2lkZ2V0cyBhbmQgcHJvdmlkZXMKIyBwcm9jZWR1cmVzIHRoYXQgaGVscCBpbiBpbXBsZW1lbnRpbmcgdGhlIGJpbmRpbmdzLgojCiMgUkNTOiBAKCMpICRJZDogc2NhbGUudGNsLHYgMS42IDIwMDAvMDEvMDYgMDI6MjI6MjQgaG9iYnMgRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5NCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgojIENvcHlyaWdodCAoYykgMTk5NC0xOTk1IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgVGhlIGNvZGUgYmVsb3cgY3JlYXRlcyB0aGUgZGVmYXVsdCBjbGFzcyBiaW5kaW5ncyBmb3IgZW50cmllcy4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgU3RhbmRhcmQgTW90aWYgYmluZGluZ3M6CgpiaW5kIFNjYWxlIDxFbnRlcj4gewogICAgaWYgeyR0a19zdHJpY3RNb3RpZn0gewoJc2V0IHRrUHJpdihhY3RpdmVCZykgWyVXIGNnZXQgLWFjdGl2ZWJhY2tncm91bmRdCgklVyBjb25maWcgLWFjdGl2ZWJhY2tncm91bmQgWyVXIGNnZXQgLWJhY2tncm91bmRdCiAgICB9CiAgICB0a1NjYWxlQWN0aXZhdGUgJVcgJXggJXkKfQpiaW5kIFNjYWxlIDxNb3Rpb24+IHsKICAgIHRrU2NhbGVBY3RpdmF0ZSAlVyAleCAleQp9CmJpbmQgU2NhbGUgPExlYXZlPiB7CiAgICBpZiB7JHRrX3N0cmljdE1vdGlmfSB7CgklVyBjb25maWcgLWFjdGl2ZWJhY2tncm91bmQgJHRrUHJpdihhY3RpdmVCZykKICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsIFslVyBjZ2V0IC1zdGF0ZV0gImFjdGl2ZSJdfSB7CgklVyBjb25maWd1cmUgLXN0YXRlIG5vcm1hbAogICAgfQp9CmJpbmQgU2NhbGUgPDE+IHsKICAgIHRrU2NhbGVCdXR0b25Eb3duICVXICV4ICV5Cn0KYmluZCBTY2FsZSA8QjEtTW90aW9uPiB7CiAgICB0a1NjYWxlRHJhZyAlVyAleCAleQp9CmJpbmQgU2NhbGUgPEIxLUxlYXZlPiB7IH0KYmluZCBTY2FsZSA8QjEtRW50ZXI+IHsgfQpiaW5kIFNjYWxlIDxCdXR0b25SZWxlYXNlLTE+IHsKICAgIHRrQ2FuY2VsUmVwZWF0CiAgICB0a1NjYWxlRW5kRHJhZyAlVwogICAgdGtTY2FsZUFjdGl2YXRlICVXICV4ICV5Cn0KYmluZCBTY2FsZSA8Mj4gewogICAgdGtTY2FsZUJ1dHRvbjJEb3duICVXICV4ICV5Cn0KYmluZCBTY2FsZSA8QjItTW90aW9uPiB7CiAgICB0a1NjYWxlRHJhZyAlVyAleCAleQp9CmJpbmQgU2NhbGUgPEIyLUxlYXZlPiB7IH0KYmluZCBTY2FsZSA8QjItRW50ZXI+IHsgfQpiaW5kIFNjYWxlIDxCdXR0b25SZWxlYXNlLTI+IHsKICAgIHRrQ2FuY2VsUmVwZWF0CiAgICB0a1NjYWxlRW5kRHJhZyAlVwogICAgdGtTY2FsZUFjdGl2YXRlICVXICV4ICV5Cn0KYmluZCBTY2FsZSA8Q29udHJvbC0xPiB7CiAgICB0a1NjYWxlQ29udHJvbFByZXNzICVXICV4ICV5Cn0KYmluZCBTY2FsZSA8VXA+IHsKICAgIHRrU2NhbGVJbmNyZW1lbnQgJVcgdXAgbGl0dGxlIG5vUmVwZWF0Cn0KYmluZCBTY2FsZSA8RG93bj4gewogICAgdGtTY2FsZUluY3JlbWVudCAlVyBkb3duIGxpdHRsZSBub1JlcGVhdAp9CmJpbmQgU2NhbGUgPExlZnQ+IHsKICAgIHRrU2NhbGVJbmNyZW1lbnQgJVcgdXAgbGl0dGxlIG5vUmVwZWF0Cn0KYmluZCBTY2FsZSA8UmlnaHQ+IHsKICAgIHRrU2NhbGVJbmNyZW1lbnQgJVcgZG93biBsaXR0bGUgbm9SZXBlYXQKfQpiaW5kIFNjYWxlIDxDb250cm9sLVVwPiB7CiAgICB0a1NjYWxlSW5jcmVtZW50ICVXIHVwIGJpZyBub1JlcGVhdAp9CmJpbmQgU2NhbGUgPENvbnRyb2wtRG93bj4gewogICAgdGtTY2FsZUluY3JlbWVudCAlVyBkb3duIGJpZyBub1JlcGVhdAp9CmJpbmQgU2NhbGUgPENvbnRyb2wtTGVmdD4gewogICAgdGtTY2FsZUluY3JlbWVudCAlVyB1cCBiaWcgbm9SZXBlYXQKfQpiaW5kIFNjYWxlIDxDb250cm9sLVJpZ2h0PiB7CiAgICB0a1NjYWxlSW5jcmVtZW50ICVXIGRvd24gYmlnIG5vUmVwZWF0Cn0KYmluZCBTY2FsZSA8SG9tZT4gewogICAgJVcgc2V0IFslVyBjZ2V0IC1mcm9tXQp9CmJpbmQgU2NhbGUgPEVuZD4gewogICAgJVcgc2V0IFslVyBjZ2V0IC10b10KfQoKIyB0a1NjYWxlQWN0aXZhdGUgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGNoZWNrIGEgZ2l2ZW4geC15IHBvc2l0aW9uIGluIHRoZQojIHNjYWxlIGFuZCBhY3RpdmF0ZSB0aGUgc2xpZGVyIGlmIHRoZSB4LXkgcG9zaXRpb24gZmFsbHMgd2l0aGluCiMgdGhlIHNsaWRlci4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY2FsZSB3aWRnZXQuCiMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzLgoKcHJvYyB0a1NjYWxlQWN0aXZhdGUge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7W3N0cmluZyBlcXVhbCBbJHcgY2dldCAtc3RhdGVdICJkaXNhYmxlZCJdfSB7CglyZXR1cm4KICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBpZGVudGlmeSAkeCAkeV0gInNsaWRlciJdfSB7CgkkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZQogICAgfSBlbHNlIHsKCSR3IGNvbmZpZ3VyZSAtc3RhdGUgbm9ybWFsCiAgICB9Cn0KCiMgdGtTY2FsZUJ1dHRvbkRvd24gLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gYSBidXR0b24gaXMgcHJlc3NlZCBpbiBhIHNjYWxlLiAgSXQKIyB0YWtlcyBkaWZmZXJlbnQgYWN0aW9ucyBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY2FsZSB3aWRnZXQuCiMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzIG9mIGJ1dHRvbiBwcmVzcy4KCnByb2MgdGtTY2FsZUJ1dHRvbkRvd24ge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBzZXQgdGtQcml2KGRyYWdnaW5nKSAwCiAgICBzZXQgZWwgWyR3IGlkZW50aWZ5ICR4ICR5XQogICAgaWYge1tzdHJpbmcgZXF1YWwgJGVsICJ0cm91Z2gxIl19IHsKCXRrU2NhbGVJbmNyZW1lbnQgJHcgdXAgbGl0dGxlIGluaXRpYWwKICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsICRlbCAidHJvdWdoMiJdfSB7Cgl0a1NjYWxlSW5jcmVtZW50ICR3IGRvd24gbGl0dGxlIGluaXRpYWwKICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsICRlbCAic2xpZGVyIl19IHsKCXNldCB0a1ByaXYoZHJhZ2dpbmcpIDEKCXNldCB0a1ByaXYoaW5pdFZhbHVlKSBbJHcgZ2V0XQoJc2V0IGNvb3JkcyBbJHcgY29vcmRzXQoJc2V0IHRrUHJpdihkZWx0YVgpIFtleHByIHskeCAtIFtsaW5kZXggJGNvb3JkcyAwXX1dCglzZXQgdGtQcml2KGRlbHRhWSkgW2V4cHIgeyR5IC0gW2xpbmRleCAkY29vcmRzIDFdfV0KCSR3IGNvbmZpZ3VyZSAtc2xpZGVycmVsaWVmIHN1bmtlbgogICAgfQp9CgojIHRrU2NhbGVEcmFnIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIGlzIGRyYWdnZWQgd2l0aAojIG1vdXNlIGJ1dHRvbiAxIGRvd24uICBJZiB0aGUgZHJhZyBzdGFydGVkIGluc2lkZSB0aGUgc2xpZGVyCiMgKGkuZS4gdGhlIHNjYWxlIGlzIGFjdGl2ZSkgdGhlbiB0aGUgc2NhbGUncyB2YWx1ZSBpcyBhZGp1c3RlZAojIHRvIHJlZmxlY3QgdGhlIG1vdXNlJ3MgcG9zaXRpb24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgc2NhbGUgd2lkZ2V0LgojIHgsIHkgLQlNb3VzZSBjb29yZGluYXRlcy4KCnByb2MgdGtTY2FsZURyYWcge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7ISR0a1ByaXYoZHJhZ2dpbmcpfSB7CglyZXR1cm4KICAgIH0KICAgICR3IHNldCBbJHcgZ2V0IFtleHByIHskeC0kdGtQcml2KGRlbHRhWCl9XSBbZXhwciB7JHktJHRrUHJpdihkZWx0YVkpfV1dCn0KCiMgdGtTY2FsZUVuZERyYWcgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgdG8gZW5kIGFuIGludGVyYWN0aXZlIGRyYWcgb2YgdGhlCiMgc2xpZGVyLiAgSXQganVzdCBtYXJrcyB0aGUgZHJhZyBhcyBvdmVyLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHNjYWxlIHdpZGdldC4KCnByb2MgdGtTY2FsZUVuZERyYWcge3d9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCB0a1ByaXYoZHJhZ2dpbmcpIDAKICAgICR3IGNvbmZpZ3VyZSAtc2xpZGVycmVsaWVmIHJhaXNlZAp9CgojIHRrU2NhbGVJbmNyZW1lbnQgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHRvIGluY3JlbWVudCB0aGUgdmFsdWUgb2YgYSBzY2FsZSBhbmQKIyB0byBzZXQgdXAgYXV0by1yZXBlYXRpbmcgb2YgdGhlIGFjdGlvbiBpZiB0aGF0IGlzIGRlc2lyZWQuICBUaGUKIyB3YXkgdGhlIHZhbHVlIGlzIGluY3JlbWVudGVkIGRlcGVuZHMgb24gdGhlICJkaXIiIGFuZCAiYmlnIgojIGFyZ3VtZW50cy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY2FsZSB3aWRnZXQuCiMgZGlyIC0JCSJ1cCIgbWVhbnMgbW92ZSB2YWx1ZSB0b3dhcmRzIC1mcm9tLCAiZG93biIgbWVhbnMKIwkJbW92ZSB0b3dhcmRzIC10by4KIyBiaWcgLQkJU2l6ZSBvZiBpbmNyZW1lbnRzOiAiYmlnIiBvciAibGl0dGxlIi4KIyByZXBlYXQgLQlXaGV0aGVyIGFuZCBob3cgdG8gYXV0by1yZXBlYXQgdGhlIGFjdGlvbjogICJub1JlcGVhdCIKIwkJbWVhbnMgZG9uJ3QgYXV0by1yZXBlYXQsICJpbml0aWFsIiBtZWFucyB0aGlzIGlzIHRoZQojCQlmaXJzdCBhY3Rpb24gaW4gYW4gYXV0by1yZXBlYXQgc2VxdWVuY2UsIGFuZCAiYWdhaW4iCiMJCW1lYW5zIHRoaXMgaXMgdGhlIHNlY29uZCByZXBldGl0aW9uIG9yIGxhdGVyLgoKcHJvYyB0a1NjYWxlSW5jcmVtZW50IHt3IGRpciBiaWcgcmVwZWF0fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7IVt3aW5mbyBleGlzdHMgJHddfSByZXR1cm4KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRiaWcgImJpZyJdfSB7CglzZXQgaW5jIFskdyBjZ2V0IC1iaWdpbmNyZW1lbnRdCglpZiB7JGluYyA9PSAwfSB7CgkgICAgc2V0IGluYyBbZXhwciB7YWJzKFskdyBjZ2V0IC10b10gLSBbJHcgY2dldCAtZnJvbV0pLzEwLjB9XQoJfQoJaWYgeyRpbmMgPCBbJHcgY2dldCAtcmVzb2x1dGlvbl19IHsKCSAgICBzZXQgaW5jIFskdyBjZ2V0IC1yZXNvbHV0aW9uXQoJfQogICAgfSBlbHNlIHsKCXNldCBpbmMgWyR3IGNnZXQgLXJlc29sdXRpb25dCiAgICB9CiAgICBpZiB7KFskdyBjZ2V0IC1mcm9tXSA+IFskdyBjZ2V0IC10b10pIF4gW3N0cmluZyBlcXVhbCAkZGlyICJ1cCJdfSB7CglzZXQgaW5jIFtleHByIHstJGluY31dCiAgICB9CiAgICAkdyBzZXQgW2V4cHIge1skdyBnZXRdICsgJGluY31dCgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHJlcGVhdCAiYWdhaW4iXX0gewoJc2V0IHRrUHJpdihhZnRlcklkKSBbYWZ0ZXIgWyR3IGNnZXQgLXJlcGVhdGludGVydmFsXSBcCgkJW2xpc3QgdGtTY2FsZUluY3JlbWVudCAkdyAkZGlyICRiaWcgYWdhaW5dXQogICAgfSBlbHNlaWYge1tzdHJpbmcgZXF1YWwgJHJlcGVhdCAiaW5pdGlhbCJdfSB7CglzZXQgZGVsYXkgWyR3IGNnZXQgLXJlcGVhdGRlbGF5XQoJaWYgeyRkZWxheSA+IDB9IHsKCSAgICBzZXQgdGtQcml2KGFmdGVySWQpIFthZnRlciAkZGVsYXkgXAoJCSAgICBbbGlzdCB0a1NjYWxlSW5jcmVtZW50ICR3ICRkaXIgJGJpZyBhZ2Fpbl1dCgl9CiAgICB9Cn0KCiMgdGtTY2FsZUNvbnRyb2xQcmVzcyAtLQojIFRoaXMgcHJvY2VkdXJlIGhhbmRsZXMgYnV0dG9uIHByZXNzZXMgdGhhdCBhcmUgbWFkZSB3aXRoIHRoZSBDb250cm9sCiMga2V5IGRvd24uICBEZXBlbmRpbmcgb24gdGhlIG1vdXNlIHBvc2l0aW9uLCBpdCBhZGp1c3RzIHRoZSBzY2FsZQojIHZhbHVlIHRvIG9uZSBlbmQgb2YgdGhlIHJhbmdlIG9yIHRoZSBvdGhlci4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY2FsZSB3aWRnZXQuCiMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzIHdoZXJlIHRoZSBidXR0b24gd2FzIHByZXNzZWQuCgpwcm9jIHRrU2NhbGVDb250cm9sUHJlc3Mge3cgeCB5fSB7CiAgICBzZXQgZWwgWyR3IGlkZW50aWZ5ICR4ICR5XQogICAgaWYge1tzdHJpbmcgZXF1YWwgJGVsICJ0cm91Z2gxIl19IHsKCSR3IHNldCBbJHcgY2dldCAtZnJvbV0KICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsICRlbCAidHJvdWdoMiJdfSB7CgkkdyBzZXQgWyR3IGNnZXQgLXRvXQogICAgfQp9CgojIHRrU2NhbGVCdXR0b24yRG93bgojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBidXR0b24gMiBpcyBwcmVzc2VkIG92ZXIgYSBzY2FsZS4KIyBJdCBzZXRzIHRoZSB2YWx1ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBtb3VzZSBwb3NpdGlvbiBhbmQgc3RhcnRzCiMgYSBzbGlkZXIgZHJhZy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0LgojIHgsIHkgLQlNb3VzZSBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHdpZGdldC4KCnByb2MgdGtTY2FsZUJ1dHRvbjJEb3duIHt3IHggeX0gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1zdGF0ZV0gImRpc2FibGVkIl19IHsKICAgICAgcmV0dXJuCiAgICB9CiAgICAkdyBjb25maWd1cmUgLXN0YXRlIGFjdGl2ZQogICAgJHcgc2V0IFskdyBnZXQgJHggJHldCiAgICBzZXQgdGtQcml2KGRyYWdnaW5nKSAxCiAgICBzZXQgdGtQcml2KGluaXRWYWx1ZSkgWyR3IGdldF0KICAgIHNldCBjb29yZHMgIiR4ICR5IgogICAgc2V0IHRrUHJpdihkZWx0YVgpIDAKICAgIHNldCB0a1ByaXYoZGVsdGFZKSAwCn0KAAAt3yMgc2NybGJhci50Y2wgLS0KIwojIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGJpbmRpbmdzIGZvciBUayBzY3JvbGxiYXIgd2lkZ2V0cy4KIyBJdCBhbHNvIHByb3ZpZGVzIHByb2NlZHVyZXMgdGhhdCBoZWxwIGluIGltcGxlbWVudGluZyB0aGUgYmluZGluZ3MuCiMKIyBSQ1M6IEAoIykgJElkOiBzY3JsYmFyLnRjbCx2IDEuOCAyMDAwLzAxLzA2IDAyOjIyOjI0IGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFRoZSBjb2RlIGJlbG93IGNyZWF0ZXMgdGhlIGRlZmF1bHQgY2xhc3MgYmluZGluZ3MgZm9yIHNjcm9sbGJhcnMuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFN0YW5kYXJkIE1vdGlmIGJpbmRpbmdzOgppZiB7W3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl0gJiYgXAoJW3N0cmluZyBjb21wYXJlICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXX0gewoKYmluZCBTY3JvbGxiYXIgPEVudGVyPiB7CiAgICBpZiB7JHRrX3N0cmljdE1vdGlmfSB7CglzZXQgdGtQcml2KGFjdGl2ZUJnKSBbJVcgY2dldCAtYWN0aXZlYmFja2dyb3VuZF0KCSVXIGNvbmZpZyAtYWN0aXZlYmFja2dyb3VuZCBbJVcgY2dldCAtYmFja2dyb3VuZF0KICAgIH0KICAgICVXIGFjdGl2YXRlIFslVyBpZGVudGlmeSAleCAleV0KfQpiaW5kIFNjcm9sbGJhciA8TW90aW9uPiB7CiAgICAlVyBhY3RpdmF0ZSBbJVcgaWRlbnRpZnkgJXggJXldCn0KCiMgVGhlICJpbmZvIGV4aXN0cyIgY29tbWFuZCBpbiB0aGUgZm9sbG93aW5nIGJpbmRpbmcgaGFuZGxlcyB0aGUKIyBzaXR1YXRpb24gd2hlcmUgYSBMZWF2ZSBldmVudCBvY2N1cnMgZm9yIGEgc2Nyb2xsYmFyIHdpdGhvdXQgdGhlIEVudGVyCiMgZXZlbnQuICBUaGlzIHNlZW1zIHRvIGhhcHBlbiBvbiBzb21lIHN5c3RlbXMgKHN1Y2ggYXMgU29sYXJpcyAyLjQpIGZvcgojIHVua25vd24gcmVhc29ucy4KCmJpbmQgU2Nyb2xsYmFyIDxMZWF2ZT4gewogICAgaWYgeyR0a19zdHJpY3RNb3RpZiAmJiBbaW5mbyBleGlzdHMgdGtQcml2KGFjdGl2ZUJnKV19IHsKCSVXIGNvbmZpZyAtYWN0aXZlYmFja2dyb3VuZCAkdGtQcml2KGFjdGl2ZUJnKQogICAgfQogICAgJVcgYWN0aXZhdGUge30KfQpiaW5kIFNjcm9sbGJhciA8MT4gewogICAgdGtTY3JvbGxCdXR0b25Eb3duICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPEIxLU1vdGlvbj4gewogICAgdGtTY3JvbGxEcmFnICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPEIxLUIyLU1vdGlvbj4gewogICAgdGtTY3JvbGxEcmFnICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPEJ1dHRvblJlbGVhc2UtMT4gewogICAgdGtTY3JvbGxCdXR0b25VcCAlVyAleCAleQp9CmJpbmQgU2Nyb2xsYmFyIDxCMS1MZWF2ZT4gewogICAgIyBQcmV2ZW50cyA8TGVhdmU+IGJpbmRpbmcgZnJvbSBiZWluZyBpbnZva2VkLgp9CmJpbmQgU2Nyb2xsYmFyIDxCMS1FbnRlcj4gewogICAgIyBQcmV2ZW50cyA8RW50ZXI+IGJpbmRpbmcgZnJvbSBiZWluZyBpbnZva2VkLgp9CmJpbmQgU2Nyb2xsYmFyIDwyPiB7CiAgICB0a1Njcm9sbEJ1dHRvbjJEb3duICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPEIxLTI+IHsKICAgICMgRG8gbm90aGluZywgc2luY2UgYnV0dG9uIDEgaXMgYWxyZWFkeSBkb3duLgp9CmJpbmQgU2Nyb2xsYmFyIDxCMi0xPiB7CiAgICAjIERvIG5vdGhpbmcsIHNpbmNlIGJ1dHRvbiAyIGlzIGFscmVhZHkgZG93bi4KfQpiaW5kIFNjcm9sbGJhciA8QjItTW90aW9uPiB7CiAgICB0a1Njcm9sbERyYWcgJVcgJXggJXkKfQpiaW5kIFNjcm9sbGJhciA8QnV0dG9uUmVsZWFzZS0yPiB7CiAgICB0a1Njcm9sbEJ1dHRvblVwICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPEIxLUJ1dHRvblJlbGVhc2UtMj4gewogICAgIyBEbyBub3RoaW5nOiAgQjEgcmVsZWFzZSB3aWxsIGhhbmRsZSBpdC4KfQpiaW5kIFNjcm9sbGJhciA8QjItQnV0dG9uUmVsZWFzZS0xPiB7CiAgICAjIERvIG5vdGhpbmc6ICBCMiByZWxlYXNlIHdpbGwgaGFuZGxlIGl0Lgp9CmJpbmQgU2Nyb2xsYmFyIDxCMi1MZWF2ZT4gewogICAgIyBQcmV2ZW50cyA8TGVhdmU+IGJpbmRpbmcgZnJvbSBiZWluZyBpbnZva2VkLgp9CmJpbmQgU2Nyb2xsYmFyIDxCMi1FbnRlcj4gewogICAgIyBQcmV2ZW50cyA8RW50ZXI+IGJpbmRpbmcgZnJvbSBiZWluZyBpbnZva2VkLgp9CmJpbmQgU2Nyb2xsYmFyIDxDb250cm9sLTE+IHsKICAgIHRrU2Nyb2xsVG9wQm90dG9tICVXICV4ICV5Cn0KYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtMj4gewogICAgdGtTY3JvbGxUb3BCb3R0b20gJVcgJXggJXkKfQoKYmluZCBTY3JvbGxiYXIgPFVwPiB7CiAgICB0a1Njcm9sbEJ5VW5pdHMgJVcgdiAtMQp9CmJpbmQgU2Nyb2xsYmFyIDxEb3duPiB7CiAgICB0a1Njcm9sbEJ5VW5pdHMgJVcgdiAxCn0KYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtVXA+IHsKICAgIHRrU2Nyb2xsQnlQYWdlcyAlVyB2IC0xCn0KYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtRG93bj4gewogICAgdGtTY3JvbGxCeVBhZ2VzICVXIHYgMQp9CmJpbmQgU2Nyb2xsYmFyIDxMZWZ0PiB7CiAgICB0a1Njcm9sbEJ5VW5pdHMgJVcgaCAtMQp9CmJpbmQgU2Nyb2xsYmFyIDxSaWdodD4gewogICAgdGtTY3JvbGxCeVVuaXRzICVXIGggMQp9CmJpbmQgU2Nyb2xsYmFyIDxDb250cm9sLUxlZnQ+IHsKICAgIHRrU2Nyb2xsQnlQYWdlcyAlVyBoIC0xCn0KYmluZCBTY3JvbGxiYXIgPENvbnRyb2wtUmlnaHQ+IHsKICAgIHRrU2Nyb2xsQnlQYWdlcyAlVyBoIDEKfQpiaW5kIFNjcm9sbGJhciA8UHJpb3I+IHsKICAgIHRrU2Nyb2xsQnlQYWdlcyAlVyBodiAtMQp9CmJpbmQgU2Nyb2xsYmFyIDxOZXh0PiB7CiAgICB0a1Njcm9sbEJ5UGFnZXMgJVcgaHYgMQp9CmJpbmQgU2Nyb2xsYmFyIDxIb21lPiB7CiAgICB0a1Njcm9sbFRvUG9zICVXIDAKfQpiaW5kIFNjcm9sbGJhciA8RW5kPiB7CiAgICB0a1Njcm9sbFRvUG9zICVXIDEKfQp9CiMgdGtTY3JvbGxCdXR0b25Eb3duIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQgaW4gYSBzY3JvbGxiYXIuCiMgSXQgY2hhbmdlcyB0aGUgd2F5IHRoZSBzY3JvbGxiYXIgaXMgZGlzcGxheWVkIGFuZCB0YWtlcyBhY3Rpb25zCiMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBtb3VzZSBpcy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0LgojIHgsIHkgLQlNb3VzZSBjb29yZGluYXRlcy4KCnByb2MgdGtTY3JvbGxCdXR0b25Eb3duIHt3IHggeX0gewogICAgZ2xvYmFsIHRrUHJpdgogICAgc2V0IHRrUHJpdihyZWxpZWYpIFskdyBjZ2V0IC1hY3RpdmVyZWxpZWZdCiAgICAkdyBjb25maWd1cmUgLWFjdGl2ZXJlbGllZiBzdW5rZW4KICAgIHNldCBlbGVtZW50IFskdyBpZGVudGlmeSAkeCAkeV0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRlbGVtZW50ICJzbGlkZXIiXX0gewoJdGtTY3JvbGxTdGFydERyYWcgJHcgJHggJHkKICAgIH0gZWxzZSB7Cgl0a1Njcm9sbFNlbGVjdCAkdyAkZWxlbWVudCBpbml0aWFsCiAgICB9Cn0KCiMgdGtTY3JvbGxCdXR0b25VcCAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBhIGJ1dHRvbiBpcyByZWxlYXNlZCBpbiBhIHNjcm9sbGJhci4KIyBJdCBjYW5jZWxzIHNjYW5zIGFuZCBhdXRvLXJlcGVhdHMgdGhhdCB3ZXJlIGluIHByb2dyZXNzLCBhbmQgcmVzdG9yZXMKIyB0aGUgd2F5IHRoZSBhY3RpdmUgZWxlbWVudCBpcyBkaXNwbGF5ZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4KIyB4LCB5IC0JTW91c2UgY29vcmRpbmF0ZXMuCgpwcm9jIHRrU2Nyb2xsQnV0dG9uVXAge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICB0a0NhbmNlbFJlcGVhdAogICAgaWYge1tpbmZvIGV4aXN0cyB0a1ByaXYocmVsaWVmKV19IHsKCSMgQXZvaWQgZXJyb3IgZHVlIHRvIHNwdXJpb3VzIHJlbGVhc2UgZXZlbnRzCgkkdyBjb25maWd1cmUgLWFjdGl2ZXJlbGllZiAkdGtQcml2KHJlbGllZikKCXRrU2Nyb2xsRW5kRHJhZyAkdyAkeCAkeQoJJHcgYWN0aXZhdGUgWyR3IGlkZW50aWZ5ICR4ICR5XQogICAgfQp9CgojIHRrU2Nyb2xsU2VsZWN0IC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB3aGVuIGEgYnV0dG9uIGlzIHByZXNzZWQgb3ZlciB0aGUgc2Nyb2xsYmFyLgojIEl0IGludm9rZXMgb25lIG9mIHNldmVyYWwgc2Nyb2xsaW5nIGFjdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXJlIGluCiMgdGhlIHNjcm9sbGJhciB0aGUgYnV0dG9uIHdhcyBwcmVzc2VkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuCiMgZWxlbWVudCAtCVRoZSBlbGVtZW50IG9mIHRoZSBzY3JvbGxiYXIgdGhhdCB3YXMgc2VsZWN0ZWQsIHN1Y2gKIwkJYXMgImFycm93MSIgb3IgInRyb3VnaDIiLiAgU2hvdWxkbid0IGJlICJzbGlkZXIiLgojIHJlcGVhdCAtCVdoZXRoZXIgYW5kIGhvdyB0byBhdXRvLXJlcGVhdCB0aGUgYWN0aW9uOiAgIm5vUmVwZWF0IgojCQltZWFucyBkb24ndCBhdXRvLXJlcGVhdCwgImluaXRpYWwiIG1lYW5zIHRoaXMgaXMgdGhlCiMJCWZpcnN0IGFjdGlvbiBpbiBhbiBhdXRvLXJlcGVhdCBzZXF1ZW5jZSwgYW5kICJhZ2FpbiIKIwkJbWVhbnMgdGhpcyBpcyB0aGUgc2Vjb25kIHJlcGV0aXRpb24gb3IgbGF0ZXIuCgpwcm9jIHRrU2Nyb2xsU2VsZWN0IHt3IGVsZW1lbnQgcmVwZWF0fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7IVt3aW5mbyBleGlzdHMgJHddfSByZXR1cm4KICAgIHN3aXRjaCAtLSAkZWxlbWVudCB7CgkiYXJyb3cxIgl7dGtTY3JvbGxCeVVuaXRzICR3IGh2IC0xfQoJInRyb3VnaDEiCXt0a1Njcm9sbEJ5UGFnZXMgJHcgaHYgLTF9CgkidHJvdWdoMiIJe3RrU2Nyb2xsQnlQYWdlcyAkdyBodiAxfQoJImFycm93MiIJe3RrU2Nyb2xsQnlVbml0cyAkdyBodiAxfQoJZGVmYXVsdAkJe3JldHVybn0KICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRyZXBlYXQgImFnYWluIl19IHsKCXNldCB0a1ByaXYoYWZ0ZXJJZCkgW2FmdGVyIFskdyBjZ2V0IC1yZXBlYXRpbnRlcnZhbF0gXAoJCVtsaXN0IHRrU2Nyb2xsU2VsZWN0ICR3ICRlbGVtZW50IGFnYWluXV0KICAgIH0gZWxzZWlmIHtbc3RyaW5nIGVxdWFsICRyZXBlYXQgImluaXRpYWwiXX0gewoJc2V0IGRlbGF5IFskdyBjZ2V0IC1yZXBlYXRkZWxheV0KCWlmIHskZGVsYXkgPiAwfSB7CgkgICAgc2V0IHRrUHJpdihhZnRlcklkKSBbYWZ0ZXIgJGRlbGF5IFwKCQkgICAgW2xpc3QgdGtTY3JvbGxTZWxlY3QgJHcgJGVsZW1lbnQgYWdhaW5dXQoJfQogICAgfQp9CgojIHRrU2Nyb2xsU3RhcnREcmFnIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHRvIGluaXRpYXRlIGEgZHJhZyBvZiB0aGUgc2xpZGVyLiAgSXQganVzdAojIHJlbWVtYmVycyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG1vdXNlIGFuZCBzbGlkZXIuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4KIyB4LCB5IC0JVGhlIG1vdXNlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgZHJhZyBvcGVyYXRpb24uCgpwcm9jIHRrU2Nyb2xsU3RhcnREcmFnIHt3IHggeX0gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyBjZ2V0IC1jb21tYW5kXSAiIl19IHsKCXJldHVybgogICAgfQogICAgc2V0IHRrUHJpdihwcmVzc1gpICR4CiAgICBzZXQgdGtQcml2KHByZXNzWSkgJHkKICAgIHNldCB0a1ByaXYoaW5pdFZhbHVlcykgWyR3IGdldF0KICAgIHNldCBpdjAgW2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDBdCiAgICBpZiB7W2xsZW5ndGggJHRrUHJpdihpbml0VmFsdWVzKV0gPT0gMn0gewoJc2V0IHRrUHJpdihpbml0UG9zKSAkaXYwCiAgICB9IGVsc2VpZiB7JGl2MCA9PSAwfSB7CglzZXQgdGtQcml2KGluaXRQb3MpIDAuMAogICAgfSBlbHNlIHsKCXNldCB0a1ByaXYoaW5pdFBvcykgW2V4cHIgeyhkb3VibGUoW2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDJdKSkgXAoJCS8gW2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDBdfV0KICAgIH0KfQoKIyB0a1Njcm9sbERyYWcgLS0KIyBUaGlzIHByb2NlZHVyZSBpcyBjYWxsZWQgZm9yIGVhY2ggbW91c2UgbW90aW9uIGV2ZW4gd2hlbiB0aGUgc2xpZGVyCiMgaXMgYmVpbmcgZHJhZ2dlZC4gIEl0IG5vdGlmaWVzIHRoZSBhc3NvY2lhdGVkIHdpZGdldCBpZiB3ZSdyZSBub3QKIyBqdW1wIHNjcm9sbGluZywgYW5kIGl0IGp1c3QgdXBkYXRlcyB0aGUgc2Nyb2xsYmFyIGlmIHdlIGFyZSBqdW1wCiMgc2Nyb2xsaW5nLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuCiMgeCwgeSAtCVRoZSBjdXJyZW50IG1vdXNlIHBvc2l0aW9uLgoKcHJvYyB0a1Njcm9sbERyYWcge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRrUHJpdihpbml0UG9zKSAiIl19IHsKCXJldHVybgogICAgfQogICAgc2V0IGRlbHRhIFskdyBkZWx0YSBbZXhwciB7JHggLSAkdGtQcml2KHByZXNzWCl9XSBbZXhwciB7JHkgLSAkdGtQcml2KHByZXNzWSl9XV0KICAgIGlmIHtbJHcgY2dldCAtanVtcF19IHsKCWlmIHtbbGxlbmd0aCAkdGtQcml2KGluaXRWYWx1ZXMpXSA9PSAyfSB7CgkgICAgJHcgc2V0IFtleHByIHtbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMF0gKyAkZGVsdGF9XSBcCgkJICAgIFtleHByIHtbbGluZGV4ICR0a1ByaXYoaW5pdFZhbHVlcykgMV0gKyAkZGVsdGF9XQoJfSBlbHNlIHsKCSAgICBzZXQgZGVsdGEgW2V4cHIge3JvdW5kKCRkZWx0YSAqIFtsaW5kZXggJHRrUHJpdihpbml0VmFsdWVzKSAwXSl9XQoJICAgIGV2YWwgW2xpc3QgJHddIHNldCBbbHJlcGxhY2UgJHRrUHJpdihpbml0VmFsdWVzKSAyIDMgXAoJCSAgICBbZXhwciB7W2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDJdICsgJGRlbHRhfV0gXAoJCSAgICBbZXhwciB7W2xpbmRleCAkdGtQcml2KGluaXRWYWx1ZXMpIDNdICsgJGRlbHRhfV1dCgl9CiAgICB9IGVsc2UgewoJdGtTY3JvbGxUb1BvcyAkdyBbZXhwciB7JHRrUHJpdihpbml0UG9zKSArICRkZWx0YX1dCiAgICB9Cn0KCiMgdGtTY3JvbGxFbmREcmFnIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHRvIGVuZCBhbiBpbnRlcmFjdGl2ZSBkcmFnIG9mIHRoZSBzbGlkZXIuCiMgSXQgc2Nyb2xscyB0aGUgd2luZG93IGlmIHdlJ3JlIGluIGp1bXAgbW9kZSwgb3RoZXJ3aXNlIGl0IGRvZXMgbm90aGluZy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0LgojIHgsIHkgLQlUaGUgbW91c2UgcG9zaXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZHJhZyBvcGVyYXRpb24uCgpwcm9jIHRrU2Nyb2xsRW5kRHJhZyB7dyB4IHl9IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGtQcml2KGluaXRQb3MpICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBpZiB7WyR3IGNnZXQgLWp1bXBdfSB7CglzZXQgZGVsdGEgWyR3IGRlbHRhIFtleHByIHskeCAtICR0a1ByaXYocHJlc3NYKX1dIFwKCQlbZXhwciB7JHkgLSAkdGtQcml2KHByZXNzWSl9XV0KCXRrU2Nyb2xsVG9Qb3MgJHcgW2V4cHIgeyR0a1ByaXYoaW5pdFBvcykgKyAkZGVsdGF9XQogICAgfQogICAgc2V0IHRrUHJpdihpbml0UG9zKSAiIgp9CgojIHRrU2Nyb2xsQnlVbml0cyAtLQojIFRoaXMgcHJvY2VkdXJlIHRlbGxzIHRoZSBzY3JvbGxiYXIncyBhc3NvY2lhdGVkIHdpZGdldCB0byBzY3JvbGwgdXAKIyBvciBkb3duIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIHVuaXRzLiAgSXQgbm90aWZpZXMgdGhlIGFzc29jaWF0ZWQgd2lkZ2V0CiMgaW4gZGlmZmVyZW50IHdheXMgZm9yIG9sZCBhbmQgbmV3IGNvbW1hbmQgc3ludGF4ZXMuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgc2Nyb2xsYmFyIHdpZGdldC4KIyBvcmllbnQgLQlXaGljaCBraW5kcyBvZiBzY3JvbGxiYXJzIHRoaXMgYXBwbGllcyB0bzogICJoIiBmb3IKIwkJaG9yaXpvbnRhbCwgInYiIGZvciB2ZXJ0aWNhbCwgImh2IiBmb3IgYm90aC4KIyBhbW91bnQgLQlIb3cgbWFueSB1bml0cyB0byBzY3JvbGw6ICB0eXBpY2FsbHkgMSBvciAtMS4KCnByb2MgdGtTY3JvbGxCeVVuaXRzIHt3IG9yaWVudCBhbW91bnR9IHsKICAgIHNldCBjbWQgWyR3IGNnZXQgLWNvbW1hbmRdCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkY21kICIiXSB8fCAoW3N0cmluZyBmaXJzdCBcCgkgICAgW3N0cmluZyBpbmRleCBbJHcgY2dldCAtb3JpZW50XSAwXSAkb3JpZW50XSA8IDApfSB7CglyZXR1cm4KICAgIH0KICAgIHNldCBpbmZvIFskdyBnZXRdCiAgICBpZiB7W2xsZW5ndGggJGluZm9dID09IDJ9IHsKCXVwbGV2ZWwgIzAgJGNtZCBzY3JvbGwgJGFtb3VudCB1bml0cwogICAgfSBlbHNlIHsKCXVwbGV2ZWwgIzAgJGNtZCBbZXhwciB7W2xpbmRleCAkaW5mbyAyXSArICRhbW91bnR9XQogICAgfQp9CgojIHRrU2Nyb2xsQnlQYWdlcyAtLQojIFRoaXMgcHJvY2VkdXJlIHRlbGxzIHRoZSBzY3JvbGxiYXIncyBhc3NvY2lhdGVkIHdpZGdldCB0byBzY3JvbGwgdXAKIyBvciBkb3duIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIHNjcmVlbmZ1bHMuICBJdCBub3RpZmllcyB0aGUgYXNzb2NpYXRlZAojIHdpZGdldCBpbiBkaWZmZXJlbnQgd2F5cyBmb3Igb2xkIGFuZCBuZXcgY29tbWFuZCBzeW50YXhlcy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0LgojIG9yaWVudCAtCVdoaWNoIGtpbmRzIG9mIHNjcm9sbGJhcnMgdGhpcyBhcHBsaWVzIHRvOiAgImgiIGZvcgojCQlob3Jpem9udGFsLCAidiIgZm9yIHZlcnRpY2FsLCAiaHYiIGZvciBib3RoLgojIGFtb3VudCAtCUhvdyBtYW55IHNjcmVlbnMgdG8gc2Nyb2xsOiAgdHlwaWNhbGx5IDEgb3IgLTEuCgpwcm9jIHRrU2Nyb2xsQnlQYWdlcyB7dyBvcmllbnQgYW1vdW50fSB7CiAgICBzZXQgY21kIFskdyBjZ2V0IC1jb21tYW5kXQogICAgaWYge1tzdHJpbmcgZXF1YWwgJGNtZCAiIl0gfHwgKFtzdHJpbmcgZmlyc3QgXAoJICAgIFtzdHJpbmcgaW5kZXggWyR3IGNnZXQgLW9yaWVudF0gMF0gJG9yaWVudF0gPCAwKX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgaW5mbyBbJHcgZ2V0XQogICAgaWYge1tsbGVuZ3RoICRpbmZvXSA9PSAyfSB7Cgl1cGxldmVsICMwICRjbWQgc2Nyb2xsICRhbW91bnQgcGFnZXMKICAgIH0gZWxzZSB7Cgl1cGxldmVsICMwICRjbWQgW2V4cHIge1tsaW5kZXggJGluZm8gMl0gKyAkYW1vdW50KihbbGluZGV4ICRpbmZvIDFdIC0gMSl9XQogICAgfQp9CgojIHRrU2Nyb2xsVG9Qb3MgLS0KIyBUaGlzIHByb2NlZHVyZSB0ZWxscyB0aGUgc2Nyb2xsYmFyJ3MgYXNzb2NpYXRlZCB3aWRnZXQgdG8gc2Nyb2xsIHRvCiMgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLCBnaXZlbiBieSBhIGZyYWN0aW9uIGJldHdlZW4gMCBhbmQgMS4gIEl0IG5vdGlmaWVzCiMgdGhlIGFzc29jaWF0ZWQgd2lkZ2V0IGluIGRpZmZlcmVudCB3YXlzIGZvciBvbGQgYW5kIG5ldyBjb21tYW5kIHN5bnRheGVzLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuCiMgcG9zIC0JCUEgZnJhY3Rpb24gYmV0d2VlbiAwIGFuZCAxIGluZGljYXRpbmcgYSBkZXNpcmVkIHBvc2l0aW9uCiMJCWluIHRoZSBkb2N1bWVudC4KCnByb2MgdGtTY3JvbGxUb1BvcyB7dyBwb3N9IHsKICAgIHNldCBjbWQgWyR3IGNnZXQgLWNvbW1hbmRdCiAgICBpZiB7W3N0cmluZyBlcXVhbCAkY21kICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBzZXQgaW5mbyBbJHcgZ2V0XQogICAgaWYge1tsbGVuZ3RoICRpbmZvXSA9PSAyfSB7Cgl1cGxldmVsICMwICRjbWQgbW92ZXRvICRwb3MKICAgIH0gZWxzZSB7Cgl1cGxldmVsICMwICRjbWQgW2V4cHIge3JvdW5kKFtsaW5kZXggJGluZm8gMF0qJHBvcyl9XQogICAgfQp9CgojIHRrU2Nyb2xsVG9wQm90dG9tCiMgU2Nyb2xsIHRvIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSBkb2N1bWVudCwgZGVwZW5kaW5nIG9uIHRoZSBtb3VzZQojIHBvc2l0aW9uLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHNjcm9sbGJhciB3aWRnZXQuCiMgeCwgeSAtCU1vdXNlIGNvb3JkaW5hdGVzIHdpdGhpbiB0aGUgd2lkZ2V0LgoKcHJvYyB0a1Njcm9sbFRvcEJvdHRvbSB7dyB4IHl9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCBlbGVtZW50IFskdyBpZGVudGlmeSAkeCAkeV0KICAgIGlmIHtbc3RyaW5nIG1hdGNoICoxICRlbGVtZW50XX0gewoJdGtTY3JvbGxUb1BvcyAkdyAwCiAgICB9IGVsc2VpZiB7W3N0cmluZyBtYXRjaCAqMiAkZWxlbWVudF19IHsKCXRrU2Nyb2xsVG9Qb3MgJHcgMQogICAgfQoKICAgICMgU2V0IHRrUHJpdihyZWxpZWYpLCBzaW5jZSBpdCdzIG5lZWRlZCBieSB0a1Njcm9sbEJ1dHRvblVwLgoKICAgIHNldCB0a1ByaXYocmVsaWVmKSBbJHcgY2dldCAtYWN0aXZlcmVsaWVmXQp9CgojIHRrU2Nyb2xsQnV0dG9uMkRvd24KIyBUaGlzIHByb2NlZHVyZSBpcyBpbnZva2VkIHdoZW4gYnV0dG9uIDIgaXMgcHJlc3NlZCBvdmVyIGEgc2Nyb2xsYmFyLgojIElmIHRoZSBidXR0b24gaXMgb3ZlciB0aGUgdHJvdWdoIG9yIHNsaWRlciwgaXQgc2V0cyB0aGUgc2Nyb2xsYmFyIHRvCiMgdGhlIG1vdXNlIHBvc2l0aW9uIGFuZCBzdGFydHMgYSBzbGlkZXIgZHJhZy4gIE90aGVyd2lzZSBpdCBqdXN0CiMgYmVoYXZlcyB0aGUgc2FtZSBhcyBidXR0b24gMS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSBzY3JvbGxiYXIgd2lkZ2V0LgojIHgsIHkgLQlNb3VzZSBjb29yZGluYXRlcyB3aXRoaW4gdGhlIHdpZGdldC4KCnByb2MgdGtTY3JvbGxCdXR0b24yRG93biB7dyB4IHl9IHsKICAgIGdsb2JhbCB0a1ByaXYKICAgIHNldCBlbGVtZW50IFskdyBpZGVudGlmeSAkeCAkeV0KICAgIGlmIHtbc3RyaW5nIG1hdGNoIHthcnJvd1sxMl19ICRlbGVtZW50XX0gewoJdGtTY3JvbGxCdXR0b25Eb3duICR3ICR4ICR5CglyZXR1cm4KICAgIH0KICAgIHRrU2Nyb2xsVG9Qb3MgJHcgWyR3IGZyYWN0aW9uICR4ICR5XQogICAgc2V0IHRrUHJpdihyZWxpZWYpIFskdyBjZ2V0IC1hY3RpdmVyZWxpZWZdCgogICAgIyBOZWVkIHRoZSAidXBkYXRlIGlkbGV0YXNrcyIgYmVsb3cgc28gdGhhdCB0aGUgd2lkZ2V0IGNhbGxzIHVzCiAgICAjIGJhY2sgdG8gcmVzZXQgdGhlIGFjdHVhbCBzY3JvbGxiYXIgcG9zaXRpb24gYmVmb3JlIHdlIHN0YXJ0IHRoZQogICAgIyBzbGlkZXIgZHJhZy4KCiAgICB1cGRhdGUgaWRsZXRhc2tzCiAgICAkdyBjb25maWd1cmUgLWFjdGl2ZXJlbGllZiBzdW5rZW4KICAgICR3IGFjdGl2YXRlIHNsaWRlcgogICAgdGtTY3JvbGxTdGFydERyYWcgJHcgJHggJHkKfQoAABIxIyB0ZWFyb2ZmLnRjbCAtLQojCiMgVGhpcyBmaWxlIGNvbnRhaW5zIHByb2NlZHVyZXMgdGhhdCBpbXBsZW1lbnQgdGVhci1vZmYgbWVudXMuCiMKIyBSQ1M6IEAoIykgJElkOiB0ZWFyb2ZmLnRjbCx2IDEuNiAyMDAwLzAxLzA2IDAyOjIyOjI0IGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIHRrVGVhcm9mZk1lbnUgLS0KIyBHaXZlbiB0aGUgbmFtZSBvZiBhIG1lbnUsIHRoaXMgcHJvY2VkdXJlIGNyZWF0ZXMgYSB0b3JuLW9mZiBtZW51CiMgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIGdpdmVuIG1lbnUgKGluY2x1ZGluZyBuZXN0ZWQgc3VibWVudXMpLgojIFRoZSBuZXcgdG9ybi1vZmYgbWVudSBleGlzdHMgYXMgYSB0b3BsZXZlbCB3aW5kb3cgbWFuYWdlZCBieSB0aGUKIyB3aW5kb3cgbWFuYWdlci4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG5hbWUgb2YgdGhlIG5ldyBtZW51LgojIFRoZSB3aW5kb3cgaXMgY3JlYXRlZCBhdCB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5IHggYW5kIHkKIwojIEFyZ3VtZW50czoKIyB3IC0JCQlUaGUgbWVudSB0byBiZSB0b3JuLW9mZiAoZHVwbGljYXRlZCkuCiMgeCAtCQkJeCBjb29yZGluYXRlIHdoZXJlIHdpbmRvdyBpcyBjcmVhdGVkCiMgeSAtCQkJeSBjb29yZGluYXRlIHdoZXJlIHdpbmRvdyBpcyBjcmVhdGVkCgpwcm9jIHRrVGVhck9mZk1lbnUge3cge3ggMH0ge3kgMH19IHsKICAgICMgRmluZCBhIHVuaXF1ZSBuYW1lIHRvIHVzZSBmb3IgdGhlIHRvcm4tb2ZmIG1lbnUuICBGaW5kIHRoZSBmaXJzdAogICAgIyBhbmNlc3RvciBvZiB3IHRoYXQgaXMgYSB0b3BsZXZlbCBidXQgbm90IGEgbWVudSwgYW5kIHVzZSB0aGlzIGFzCiAgICAjIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBtZW51LiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIHRvcm4gb2ZmCiAgICAjIG1lbnUgd2lsbCBiZSBvbiB0aGUgc2FtZSBzY3JlZW4gYXMgdGhlIG9yaWdpbmFsIG1lbnUuICBCeSBtYWtpbmcKICAgICMgaXQgYSBjaGlsZCBvZiB0aGUgYW5jZXN0b3IsIHJhdGhlciB0aGFuIGEgY2hpbGQgb2YgdGhlIG1lbnUsIGl0CiAgICAjIGNhbiBjb250aW51ZSB0byBsaXZlIGV2ZW4gaWYgdGhlIG1lbnUgaXMgZGVsZXRlZDsgIGl0IHdpbGwgZ28KICAgICMgYXdheSB3aGVuIHRoZSB0b3BsZXZlbCBnb2VzIGF3YXkuCgogICAgaWYgeyR4ID09IDB9IHsKICAgIAlzZXQgeCBbd2luZm8gcm9vdHggJHddCiAgICB9CiAgICBpZiB7JHkgPT0gMH0gewogICAgCXNldCB5IFt3aW5mbyByb290eSAkd10KICAgIH0KCiAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJHddCiAgICB3aGlsZSB7W3N0cmluZyBjb21wYXJlIFt3aW5mbyB0b3BsZXZlbCAkcGFyZW50XSAkcGFyZW50XSBcCgkgICAgfHwgW3N0cmluZyBlcXVhbCBbd2luZm8gY2xhc3MgJHBhcmVudF0gIk1lbnUiXX0gewoJc2V0IHBhcmVudCBbd2luZm8gcGFyZW50ICRwYXJlbnRdCiAgICB9CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkcGFyZW50ICIuIl19IHsKCXNldCBwYXJlbnQgIiIKICAgIH0KICAgIGZvciB7c2V0IGkgMX0gMSB7aW5jciBpfSB7CglzZXQgbWVudSAkcGFyZW50LnRlYXJvZmYkaQoJaWYgeyFbd2luZm8gZXhpc3RzICRtZW51XX0gewoJICAgIGJyZWFrCgl9CiAgICB9CgogICAgJHcgY2xvbmUgJG1lbnUgdGVhcm9mZgoKICAgICMgUGljayBhIHRpdGxlIGZvciB0aGUgbmV3IG1lbnUgYnkgbG9va2luZyBhdCB0aGUgcGFyZW50IG9mIHRoZQogICAgIyBvcmlnaW5hbDogaWYgdGhlIHBhcmVudCBpcyBhIG1lbnUsIHRoZW4gdXNlIHRoZSB0ZXh0IG9mIHRoZSBhY3RpdmUKICAgICMgZW50cnkuICBJZiBpdCdzIGEgbWVudWJ1dHRvbiB0aGVuIHVzZSBpdHMgdGV4dC4KCiAgICBzZXQgcGFyZW50IFt3aW5mbyBwYXJlbnQgJHddCiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFskbWVudSBjZ2V0IC10aXRsZV0gIiJdfSB7CiAgICAJd20gdGl0bGUgJG1lbnUgWyRtZW51IGNnZXQgLXRpdGxlXQogICAgfSBlbHNlIHsKICAgIAlzd2l0Y2ggW3dpbmZvIGNsYXNzICRwYXJlbnRdIHsKCSAgICBNZW51YnV0dG9uIHsKCSAgICAJd20gdGl0bGUgJG1lbnUgWyRwYXJlbnQgY2dldCAtdGV4dF0KCSAgICB9CgkgICAgTWVudSB7CgkgICAgCXdtIHRpdGxlICRtZW51IFskcGFyZW50IGVudHJ5Y2dldCBhY3RpdmUgLWxhYmVsXQoJICAgIH0KCX0KICAgIH0KCiAgICAkbWVudSBwb3N0ICR4ICR5CgogICAgaWYge1t3aW5mbyBleGlzdHMgJG1lbnVdID09IDB9IHsKCXJldHVybiAiIgogICAgfQoKICAgICMgU2V0IHRrUHJpdihmb2N1cykgb24gZW50cnk6ICBvdGhlcndpc2UgdGhlIGZvY3VzIHdpbGwgZ2V0IGxvc3QKICAgICMgYWZ0ZXIga2V5Ym9hcmQgaW52b2NhdGlvbiBvZiBhIHN1Yi1tZW51IChpdCB3aWxsIHN0YXkgb24gdGhlCiAgICAjIHN1Ym1lbnUpLgoKICAgIGJpbmQgJG1lbnUgPEVudGVyPiB7CglzZXQgdGtQcml2KGZvY3VzKSAlVwogICAgfQoKICAgICMgSWYgdGhlcmUgaXMgYSAtdGVhcm9mZmNvbW1hbmQgb3B0aW9uIGZvciB0aGUgbWVudSwgaW52b2tlIGl0CiAgICAjIG5vdy4KCiAgICBzZXQgY21kIFskdyBjZ2V0IC10ZWFyb2ZmY29tbWFuZF0KICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGNtZCAiIl19IHsKCXVwbGV2ZWwgIzAgJGNtZCBbbGlzdCAkdyAkbWVudV0KICAgIH0KICAgIHJldHVybiAkbWVudQp9CgojIHRrTWVudUR1cCAtLQojIEdpdmVuIGEgbWVudSAoaGllcmFyY2h5KSwgY3JlYXRlIGEgZHVwbGljYXRlIG1lbnUgKGhpZXJhcmNoeSkKIyBpbiBhIGdpdmVuIHdpbmRvdy4KIwojIEFyZ3VtZW50czoKIyBzcmMgLQkJCVNvdXJjZSB3aW5kb3cuICBNdXN0IGJlIGEgbWVudS4gIEl0IGFuZCBpdHMKIwkJCW1lbnUgZGVzY2VuZGFudHMgd2lsbCBiZSBkdXBsaWNhdGVkIGF0IGRzdC4KIyBkc3QgLQkJCU5hbWUgdG8gdXNlIGZvciB0b3Btb3N0IG1lbnUgaW4gZHVwbGljYXRlCiMJCQloaWVyYXJjaHkuCgpwcm9jIHRrTWVudUR1cCB7c3JjIGRzdCB0eXBlfSB7CiAgICBzZXQgY21kIFtsaXN0IG1lbnUgJGRzdCAtdHlwZSAkdHlwZV0KICAgIGZvcmVhY2ggb3B0aW9uIFskc3JjIGNvbmZpZ3VyZV0gewoJaWYge1tsbGVuZ3RoICRvcHRpb25dID09IDJ9IHsKCSAgICBjb250aW51ZQoJfQoJaWYge1tzdHJpbmcgZXF1YWwgW2xpbmRleCAkb3B0aW9uIDBdICItdHlwZSJdfSB7CgkgICAgY29udGludWUKCX0KCWxhcHBlbmQgY21kIFtsaW5kZXggJG9wdGlvbiAwXSBbbGluZGV4ICRvcHRpb24gNF0KICAgIH0KICAgIGV2YWwgJGNtZAogICAgc2V0IGxhc3QgWyRzcmMgaW5kZXggbGFzdF0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRsYXN0ICJub25lIl19IHsKCXJldHVybgogICAgfQogICAgZm9yIHtzZXQgaSBbJHNyYyBjZ2V0IC10ZWFyb2ZmXX0geyRpIDw9ICRsYXN0fSB7aW5jciBpfSB7CglzZXQgY21kIFtsaXN0ICRkc3QgYWRkIFskc3JjIHR5cGUgJGldXQoJZm9yZWFjaCBvcHRpb24gWyRzcmMgZW50cnljb25maWd1cmUgJGldICB7CgkgICAgbGFwcGVuZCBjbWQgW2xpbmRleCAkb3B0aW9uIDBdIFtsaW5kZXggJG9wdGlvbiA0XQoJfQoJZXZhbCAkY21kCiAgICB9CgogICAgIyBEdXBsaWNhdGUgdGhlIGJpbmRpbmcgdGFncyBhbmQgYmluZGluZ3MgZnJvbSB0aGUgc291cmNlIG1lbnUuCgogICAgc2V0IHRhZ3MgW2JpbmR0YWdzICRzcmNdCiAgICBzZXQgc3JjTGVuIFtzdHJpbmcgbGVuZ3RoICRzcmNdCiAKICAgICMgQ29weSB0YWdzIHRvIHgsIHJlcGxhY2luZyBlYWNoIHN1YnN0cmluZyBvZiBzcmMgd2l0aCBkc3QuCgogICAgd2hpbGUge1tzZXQgaW5kZXggW3N0cmluZyBmaXJzdCAkc3JjICR0YWdzXV0gIT0gLTF9IHsKCWFwcGVuZCB4IFtzdHJpbmcgcmFuZ2UgJHRhZ3MgMCBbZXhwciB7JGluZGV4IC0gMX1dXSRkc3QKCXNldCB0YWdzIFtzdHJpbmcgcmFuZ2UgJHRhZ3MgW2V4cHIgeyRpbmRleCArICRzcmNMZW59XSBlbmRdCiAgICB9CiAgICBhcHBlbmQgeCAkdGFncwoKICAgIGJpbmR0YWdzICRkc3QgJHgKCiAgICBmb3JlYWNoIGV2ZW50IFtiaW5kICRzcmNdIHsKCXVuc2V0IHgKCXNldCBzY3JpcHQgW2JpbmQgJHNyYyAkZXZlbnRdCglzZXQgZXZlbnRMZW4gW3N0cmluZyBsZW5ndGggJGV2ZW50XQoKCSMgQ29weSBzY3JpcHQgdG8geCwgcmVwbGFjaW5nIGVhY2ggc3Vic3RyaW5nIG9mIGV2ZW50IHdpdGggZHN0LgoKCXdoaWxlIHtbc2V0IGluZGV4IFtzdHJpbmcgZmlyc3QgJGV2ZW50ICRzY3JpcHRdXSAhPSAtMX0gewoJICAgIGFwcGVuZCB4IFtzdHJpbmcgcmFuZ2UgJHNjcmlwdCAwIFtleHByIHskaW5kZXggLSAxfV1dCgkgICAgYXBwZW5kIHggJGRzdAoJICAgIHNldCBzY3JpcHQgW3N0cmluZyByYW5nZSAkc2NyaXB0IFtleHByIHskaW5kZXggKyAkZXZlbnRMZW59XSBlbmRdCgl9CglhcHBlbmQgeCAkc2NyaXB0CgoJYmluZCAkZHN0ICRldmVudCAkeAogICAgfQp9CgAAbaIjIHRleHQudGNsIC0tCiMKIyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGVmYXVsdCBiaW5kaW5ncyBmb3IgVGsgdGV4dCB3aWRnZXRzIGFuZCBwcm92aWRlcwojIHByb2NlZHVyZXMgdGhhdCBoZWxwIGluIGltcGxlbWVudGluZyB0aGUgYmluZGluZ3MuCiMKIyBSQ1M6IEAoIykgJElkOiB0ZXh0LnRjbCx2IDEuMTAgMjAwMC8wMi8xMCAwODo1Mjo1MCBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTkyLTE5OTQgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMgQ29weXJpZ2h0IChjKSAxOTk4IGJ5IFNjcmlwdGljcyBDb3Jwb3JhdGlvbi4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRWxlbWVudHMgb2YgdGtQcml2IHRoYXQgYXJlIHVzZWQgaW4gdGhpcyBmaWxlOgojCiMgYWZ0ZXJJZCAtCQlJZiBub24tbnVsbCwgaXQgbWVhbnMgdGhhdCBhdXRvLXNjYW5uaW5nIGlzIHVuZGVyd2F5CiMJCQlhbmQgaXQgZ2l2ZXMgdGhlICJhZnRlciIgaWQgZm9yIHRoZSBuZXh0IGF1dG8tc2NhbgojCQkJY29tbWFuZCB0byBiZSBleGVjdXRlZC4KIyBjaGFyIC0JCUNoYXJhY3RlciBwb3NpdGlvbiBvbiB0aGUgbGluZTsgIGtlcHQgaW4gb3JkZXIKIwkJCXRvIGFsbG93IG1vdmluZyB1cCBvciBkb3duIHBhc3Qgc2hvcnQgbGluZXMgd2hpbGUKIwkJCXN0aWxsIHJlbWVtYmVyaW5nIHRoZSBkZXNpcmVkIHBvc2l0aW9uLgojIG1vdXNlTW92ZWQgLQkJTm9uLXplcm8gbWVhbnMgdGhlIG1vdXNlIGhhcyBtb3ZlZCBhIHNpZ25pZmljYW50CiMJCQlhbW91bnQgc2luY2UgdGhlIGJ1dHRvbiB3ZW50IGRvd24gKHNvLCBmb3IgZXhhbXBsZSwKIwkJCXN0YXJ0IGRyYWdnaW5nIG91dCBhIHNlbGVjdGlvbikuCiMgcHJldlBvcyAtCQlVc2VkIHdoZW4gbW92aW5nIHVwIG9yIGRvd24gbGluZXMgdmlhIHRoZSBrZXlib2FyZC4KIwkJCUtlZXBzIHRyYWNrIG9mIHRoZSBwcmV2aW91cyBpbnNlcnQgcG9zaXRpb24sIHNvCiMJCQl3ZSBjYW4gZGlzdGluZ3Vpc2ggYSBzZXJpZXMgb2YgdXBzIGFuZCBkb3ducywgYWxsCiMJCQlpbiBhIHJvdywgZnJvbSBhIG5ldyB1cCBvciBkb3duLgojIHNlbGVjdE1vZGUgLQkJVGhlIHN0eWxlIG9mIHNlbGVjdGlvbiBjdXJyZW50bHkgdW5kZXJ3YXk6CiMJCQljaGFyLCB3b3JkLCBvciBsaW5lLgojIHgsIHkgLQkJTGFzdCBrbm93biBtb3VzZSBjb29yZGluYXRlcyBmb3Igc2Nhbm5pbmcKIwkJCWFuZCBhdXRvLXNjYW5uaW5nLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGUgY29kZSBiZWxvdyBjcmVhdGVzIHRoZSBkZWZhdWx0IGNsYXNzIGJpbmRpbmdzIGZvciBlbnRyaWVzLgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBTdGFuZGFyZCBNb3RpZiBiaW5kaW5nczoKCmJpbmQgVGV4dCA8MT4gewogICAgdGtUZXh0QnV0dG9uMSAlVyAleCAleQogICAgJVcgdGFnIHJlbW92ZSBzZWwgMC4wIGVuZAp9CmJpbmQgVGV4dCA8QjEtTW90aW9uPiB7CiAgICBzZXQgdGtQcml2KHgpICV4CiAgICBzZXQgdGtQcml2KHkpICV5CiAgICB0a1RleHRTZWxlY3RUbyAlVyAleCAleQp9CmJpbmQgVGV4dCA8RG91YmxlLTE+IHsKICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgd29yZAogICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkKICAgIGNhdGNoIHslVyBtYXJrIHNldCBpbnNlcnQgc2VsLmZpcnN0fQp9CmJpbmQgVGV4dCA8VHJpcGxlLTE+IHsKICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQogICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkKICAgIGNhdGNoIHslVyBtYXJrIHNldCBpbnNlcnQgc2VsLmZpcnN0fQp9CmJpbmQgVGV4dCA8U2hpZnQtMT4gewogICAgdGtUZXh0UmVzZXRBbmNob3IgJVcgQCV4LCV5CiAgICBzZXQgdGtQcml2KHNlbGVjdE1vZGUpIGNoYXIKICAgIHRrVGV4dFNlbGVjdFRvICVXICV4ICV5Cn0KYmluZCBUZXh0IDxEb3VibGUtU2hpZnQtMT4JewogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSB3b3JkCiAgICB0a1RleHRTZWxlY3RUbyAlVyAleCAleQp9CmJpbmQgVGV4dCA8VHJpcGxlLVNoaWZ0LTE+CXsKICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgbGluZQogICAgdGtUZXh0U2VsZWN0VG8gJVcgJXggJXkKfQpiaW5kIFRleHQgPEIxLUxlYXZlPiB7CiAgICBzZXQgdGtQcml2KHgpICV4CiAgICBzZXQgdGtQcml2KHkpICV5CiAgICB0a1RleHRBdXRvU2NhbiAlVwp9CmJpbmQgVGV4dCA8QjEtRW50ZXI+IHsKICAgIHRrQ2FuY2VsUmVwZWF0Cn0KYmluZCBUZXh0IDxCdXR0b25SZWxlYXNlLTE+IHsKICAgIHRrQ2FuY2VsUmVwZWF0Cn0KYmluZCBUZXh0IDxDb250cm9sLTE+IHsKICAgICVXIG1hcmsgc2V0IGluc2VydCBAJXgsJXkKfQpiaW5kIFRleHQgPExlZnQ+IHsKICAgIHRrVGV4dFNldEN1cnNvciAlVyBpbnNlcnQtMWMKfQpiaW5kIFRleHQgPFJpZ2h0PiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0KzFjCn0KYmluZCBUZXh0IDxVcD4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIC0xXQp9CmJpbmQgVGV4dCA8RG93bj4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIDFdCn0KYmluZCBUZXh0IDxTaGlmdC1MZWZ0PiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcgWyVXIGluZGV4IHtpbnNlcnQgLSAxY31dCn0KYmluZCBUZXh0IDxTaGlmdC1SaWdodD4gewogICAgdGtUZXh0S2V5U2VsZWN0ICVXIFslVyBpbmRleCB7aW5zZXJ0ICsgMWN9XQp9CmJpbmQgVGV4dCA8U2hpZnQtVXA+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAtMV0KfQpiaW5kIFRleHQgPFNoaWZ0LURvd24+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAxXQp9CmJpbmQgVGV4dCA8Q29udHJvbC1MZWZ0PiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQb3MgJVcgaW5zZXJ0IHRjbF9zdGFydE9mUHJldmlvdXNXb3JkXQp9CmJpbmQgVGV4dCA8Q29udHJvbC1SaWdodD4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdCn0KYmluZCBUZXh0IDxDb250cm9sLVVwPiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQYXJhICVXIGluc2VydF0KfQpiaW5kIFRleHQgPENvbnRyb2wtRG93bj4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0UGFyYSAlVyBpbnNlcnRdCn0KYmluZCBUZXh0IDxTaGlmdC1Db250cm9sLUxlZnQ+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdCn0KYmluZCBUZXh0IDxTaGlmdC1Db250cm9sLVJpZ2h0PiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0KfQpiaW5kIFRleHQgPFNoaWZ0LUNvbnRyb2wtVXA+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBhcmEgJVcgaW5zZXJ0XQp9CmJpbmQgVGV4dCA8U2hpZnQtQ29udHJvbC1Eb3duPiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dE5leHRQYXJhICVXIGluc2VydF0KfQpiaW5kIFRleHQgPFByaW9yPiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIC0xXQp9CmJpbmQgVGV4dCA8U2hpZnQtUHJpb3I+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0U2Nyb2xsUGFnZXMgJVcgLTFdCn0KYmluZCBUZXh0IDxOZXh0PiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIDFdCn0KYmluZCBUZXh0IDxTaGlmdC1OZXh0PiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcgW3RrVGV4dFNjcm9sbFBhZ2VzICVXIDFdCn0KYmluZCBUZXh0IDxDb250cm9sLVByaW9yPiB7CiAgICAlVyB4dmlldyBzY3JvbGwgLTEgcGFnZQp9CmJpbmQgVGV4dCA8Q29udHJvbC1OZXh0PiB7CiAgICAlVyB4dmlldyBzY3JvbGwgMSBwYWdlCn0KCmJpbmQgVGV4dCA8SG9tZT4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIHtpbnNlcnQgbGluZXN0YXJ0fQp9CmJpbmQgVGV4dCA8U2hpZnQtSG9tZT4gewogICAgdGtUZXh0S2V5U2VsZWN0ICVXIHtpbnNlcnQgbGluZXN0YXJ0fQp9CmJpbmQgVGV4dCA8RW5kPiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lZW5kfQp9CmJpbmQgVGV4dCA8U2hpZnQtRW5kPiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcge2luc2VydCBsaW5lZW5kfQp9CmJpbmQgVGV4dCA8Q29udHJvbC1Ib21lPiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgMS4wCn0KYmluZCBUZXh0IDxDb250cm9sLVNoaWZ0LUhvbWU+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyAxLjAKfQpiaW5kIFRleHQgPENvbnRyb2wtRW5kPiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcge2VuZCAtIDEgY2hhcn0KfQpiaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtRW5kPiB7CiAgICB0a1RleHRLZXlTZWxlY3QgJVcge2VuZCAtIDEgY2hhcn0KfQoKYmluZCBUZXh0IDxUYWI+IHsKICAgIHRrVGV4dEluc2VydCAlVyBcdAogICAgZm9jdXMgJVcKICAgIGJyZWFrCn0KYmluZCBUZXh0IDxTaGlmdC1UYWI+IHsKICAgICMgTmVlZGVkIG9ubHkgdG8ga2VlcCA8VGFiPiBiaW5kaW5nIGZyb20gdHJpZ2dlcmluZzsgIGRvZXNuJ3QKICAgICMgaGF2ZSB0byBhY3R1YWxseSBkbyBhbnl0aGluZy4KICAgIGJyZWFrCn0KYmluZCBUZXh0IDxDb250cm9sLVRhYj4gewogICAgZm9jdXMgW3RrX2ZvY3VzTmV4dCAlV10KfQpiaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtVGFiPiB7CiAgICBmb2N1cyBbdGtfZm9jdXNQcmV2ICVXXQp9CmJpbmQgVGV4dCA8Q29udHJvbC1pPiB7CiAgICB0a1RleHRJbnNlcnQgJVcgXHQKfQpiaW5kIFRleHQgPFJldHVybj4gewogICAgdGtUZXh0SW5zZXJ0ICVXIFxuCn0KYmluZCBUZXh0IDxEZWxldGU+IHsKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgWyVXIHRhZyBuZXh0cmFuZ2Ugc2VsIDEuMCBlbmRdICIiXX0gewoJJVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdAogICAgfSBlbHNlIHsKCSVXIGRlbGV0ZSBpbnNlcnQKCSVXIHNlZSBpbnNlcnQKICAgIH0KfQpiaW5kIFRleHQgPEJhY2tTcGFjZT4gewogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbJVcgdGFnIG5leHRyYW5nZSBzZWwgMS4wIGVuZF0gIiJdfSB7CgklVyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0CiAgICB9IGVsc2VpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ICE9IDEuMF19IHsKCSVXIGRlbGV0ZSBpbnNlcnQtMWMKCSVXIHNlZSBpbnNlcnQKICAgIH0KfQoKYmluZCBUZXh0IDxDb250cm9sLXNwYWNlPiB7CiAgICAlVyBtYXJrIHNldCBhbmNob3IgaW5zZXJ0Cn0KYmluZCBUZXh0IDxTZWxlY3Q+IHsKICAgICVXIG1hcmsgc2V0IGFuY2hvciBpbnNlcnQKfQpiaW5kIFRleHQgPENvbnRyb2wtU2hpZnQtc3BhY2U+IHsKICAgIHNldCB0a1ByaXYoc2VsZWN0TW9kZSkgY2hhcgogICAgdGtUZXh0S2V5RXh0ZW5kICVXIGluc2VydAp9CmJpbmQgVGV4dCA8U2hpZnQtU2VsZWN0PiB7CiAgICBzZXQgdGtQcml2KHNlbGVjdE1vZGUpIGNoYXIKICAgIHRrVGV4dEtleUV4dGVuZCAlVyBpbnNlcnQKfQpiaW5kIFRleHQgPENvbnRyb2wtc2xhc2g+IHsKICAgICVXIHRhZyBhZGQgc2VsIDEuMCBlbmQKfQpiaW5kIFRleHQgPENvbnRyb2wtYmFja3NsYXNoPiB7CiAgICAlVyB0YWcgcmVtb3ZlIHNlbCAxLjAgZW5kCn0KYmluZCBUZXh0IDw8Q3V0Pj4gewogICAgdGtfdGV4dEN1dCAlVwp9CmJpbmQgVGV4dCA8PENvcHk+PiB7CiAgICB0a190ZXh0Q29weSAlVwp9CmJpbmQgVGV4dCA8PFBhc3RlPj4gewogICAgdGtfdGV4dFBhc3RlICVXCn0KYmluZCBUZXh0IDw8Q2xlYXI+PiB7CiAgICBjYXRjaCB7JVcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdH0KfQpiaW5kIFRleHQgPDxQYXN0ZVNlbGVjdGlvbj4+IHsKICAgIGlmIHshJHRrUHJpdihtb3VzZU1vdmVkKSB8fCAkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFBhc3RlICVXICV4ICV5CiAgICB9Cn0KYmluZCBUZXh0IDxJbnNlcnQ+IHsKICAgIGNhdGNoIHt0a1RleHRJbnNlcnQgJVcgW3NlbGVjdGlvbiBnZXQgLWRpc3BsYXlvZiAlV119Cn0KYmluZCBUZXh0IDxLZXlQcmVzcz4gewogICAgdGtUZXh0SW5zZXJ0ICVXICVBCn0KCiMgSWdub3JlIGFsbCBBbHQsIE1ldGEsIGFuZCBDb250cm9sIGtleXByZXNzZXMgdW5sZXNzIGV4cGxpY2l0bHkgYm91bmQuCiMgT3RoZXJ3aXNlLCBpZiBhIHdpZGdldCBiaW5kaW5nIGZvciBvbmUgb2YgdGhlc2UgaXMgZGVmaW5lZCwgdGhlCiMgPEtleVByZXNzPiBjbGFzcyBiaW5kaW5nIHdpbGwgYWxzbyBmaXJlIGFuZCBpbnNlcnQgdGhlIGNoYXJhY3RlciwKIyB3aGljaCBpcyB3cm9uZy4gIERpdHRvIGZvciA8RXNjYXBlPi4KCmJpbmQgVGV4dCA8QWx0LUtleVByZXNzPiB7IyBub3RoaW5nIH0KYmluZCBUZXh0IDxNZXRhLUtleVByZXNzPiB7IyBub3RoaW5nfQpiaW5kIFRleHQgPENvbnRyb2wtS2V5UHJlc3M+IHsjIG5vdGhpbmd9CmJpbmQgVGV4dCA8RXNjYXBlPiB7IyBub3RoaW5nfQpiaW5kIFRleHQgPEtQX0VudGVyPiB7IyBub3RoaW5nfQppZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKICAgIGJpbmQgVGV4dCA8Q29tbWFuZC1LZXlQcmVzcz4geyMgbm90aGluZ30KfQoKIyBBZGRpdGlvbmFsIGVtYWNzLWxpa2UgYmluZGluZ3M6CgpiaW5kIFRleHQgPENvbnRyb2wtYT4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyB7aW5zZXJ0IGxpbmVzdGFydH0KICAgIH0KfQpiaW5kIFRleHQgPENvbnRyb2wtYj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyBpbnNlcnQtMWMKICAgIH0KfQpiaW5kIFRleHQgPENvbnRyb2wtZD4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCSVXIGRlbGV0ZSBpbnNlcnQKICAgIH0KfQpiaW5kIFRleHQgPENvbnRyb2wtZT4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyB7aW5zZXJ0IGxpbmVlbmR9CiAgICB9Cn0KYmluZCBUZXh0IDxDb250cm9sLWY+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7Cgl0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0KzFjCiAgICB9Cn0KYmluZCBUZXh0IDxDb250cm9sLWs+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CglpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID09IHtpbnNlcnQgbGluZWVuZH1dfSB7CgkgICAgJVcgZGVsZXRlIGluc2VydAoJfSBlbHNlIHsKCSAgICAlVyBkZWxldGUgaW5zZXJ0IHtpbnNlcnQgbGluZWVuZH0KCX0KICAgIH0KfQpiaW5kIFRleHQgPENvbnRyb2wtbj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyBbdGtUZXh0VXBEb3duTGluZSAlVyAxXQogICAgfQp9CmJpbmQgVGV4dCA8Q29udHJvbC1vPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJJVcgaW5zZXJ0IGluc2VydCBcbgoJJVcgbWFyayBzZXQgaW5zZXJ0IGluc2VydC0xYwogICAgfQp9CmJpbmQgVGV4dCA8Q29udHJvbC1wPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRVcERvd25MaW5lICVXIC0xXQogICAgfQp9CmJpbmQgVGV4dCA8Q29udHJvbC10PiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJdGtUZXh0VHJhbnNwb3NlICVXCiAgICB9Cn0KCmlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIndpbmRvd3MiXX0gewpiaW5kIFRleHQgPENvbnRyb2wtdj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNjcm9sbFBhZ2VzICVXIDEKICAgIH0KfQp9CgpiaW5kIFRleHQgPE1ldGEtYj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdCiAgICB9Cn0KYmluZCBUZXh0IDxNZXRhLWQ+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgklVyBkZWxldGUgaW5zZXJ0IFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdCiAgICB9Cn0KYmluZCBUZXh0IDxNZXRhLWY+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7Cgl0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0KICAgIH0KfQpiaW5kIFRleHQgPE1ldGEtbGVzcz4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyAxLjAKICAgIH0KfQpiaW5kIFRleHQgPE1ldGEtZ3JlYXRlcj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCXRrVGV4dFNldEN1cnNvciAlVyBlbmQtMWMKICAgIH0KfQpiaW5kIFRleHQgPE1ldGEtQmFja1NwYWNlPiB7CiAgICBpZiB7ISR0a19zdHJpY3RNb3RpZn0gewoJJVcgZGVsZXRlIFt0a1RleHRQcmV2UG9zICVXIGluc2VydCB0Y2xfc3RhcnRPZlByZXZpb3VzV29yZF0gaW5zZXJ0CiAgICB9Cn0KYmluZCBUZXh0IDxNZXRhLURlbGV0ZT4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCSVXIGRlbGV0ZSBbdGtUZXh0UHJldlBvcyAlVyBpbnNlcnQgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmRdIGluc2VydAogICAgfQp9CgojIE1hY2ludG9zaCBvbmx5IGJpbmRpbmdzOgoKIyBpZiB0ZXh0IGJsYWNrICYgaGlnaGxpZ2h0IGJsYWNrIC0+IHRleHQgd2hpdGUsIG90aGVyIHRleHQgdGhlIHNhbWUKaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7CmJpbmQgVGV4dCA8Rm9jdXNJbj4gewogICAgJVcgdGFnIGNvbmZpZ3VyZSBzZWwgLWJvcmRlcndpZHRoIDAKICAgICVXIGNvbmZpZ3VyZSAtc2VsZWN0YmFja2dyb3VuZCBzeXN0ZW1IaWdobGlnaHQgLXNlbGVjdGZvcmVncm91bmQgc3lzdGVtSGlnaGxpZ2h0VGV4dAp9CmJpbmQgVGV4dCA8Rm9jdXNPdXQ+IHsKICAgICVXIHRhZyBjb25maWd1cmUgc2VsIC1ib3JkZXJ3aWR0aCAxCiAgICAlVyBjb25maWd1cmUgLXNlbGVjdGJhY2tncm91bmQgd2hpdGUgLXNlbGVjdGZvcmVncm91bmQgYmxhY2sKfQpiaW5kIFRleHQgPE9wdGlvbi1MZWZ0PiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dFByZXZQb3MgJVcgaW5zZXJ0IHRjbF9zdGFydE9mUHJldmlvdXNXb3JkXQp9CmJpbmQgVGV4dCA8T3B0aW9uLVJpZ2h0PiB7CiAgICB0a1RleHRTZXRDdXJzb3IgJVcgW3RrVGV4dE5leHRXb3JkICVXIGluc2VydF0KfQpiaW5kIFRleHQgPE9wdGlvbi1VcD4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHRQcmV2UGFyYSAlVyBpbnNlcnRdCn0KYmluZCBUZXh0IDxPcHRpb24tRG93bj4gewogICAgdGtUZXh0U2V0Q3Vyc29yICVXIFt0a1RleHROZXh0UGFyYSAlVyBpbnNlcnRdCn0KYmluZCBUZXh0IDxTaGlmdC1PcHRpb24tTGVmdD4gewogICAgdGtUZXh0S2V5U2VsZWN0ICVXIFt0a1RleHRQcmV2UG9zICVXIGluc2VydCB0Y2xfc3RhcnRPZlByZXZpb3VzV29yZF0KfQpiaW5kIFRleHQgPFNoaWZ0LU9wdGlvbi1SaWdodD4gewogICAgdGtUZXh0S2V5U2VsZWN0ICVXIFt0a1RleHROZXh0V29yZCAlVyBpbnNlcnRdCn0KYmluZCBUZXh0IDxTaGlmdC1PcHRpb24tVXA+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0UHJldlBhcmEgJVcgaW5zZXJ0XQp9CmJpbmQgVGV4dCA8U2hpZnQtT3B0aW9uLURvd24+IHsKICAgIHRrVGV4dEtleVNlbGVjdCAlVyBbdGtUZXh0TmV4dFBhcmEgJVcgaW5zZXJ0XQp9CgojIEVuZCBvZiBNYWMgb25seSBiaW5kaW5ncwp9CgojIEEgZmV3IGFkZGl0aW9uYWwgYmluZGluZ3Mgb2YgbXkgb3duLgoKYmluZCBUZXh0IDxDb250cm9sLWg+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CglpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ICE9IDEuMF19IHsKCSAgICAlVyBkZWxldGUgaW5zZXJ0LTFjCgkgICAgJVcgc2VlIGluc2VydAoJfQogICAgfQp9CmJpbmQgVGV4dCA8Mj4gewogICAgaWYgeyEkdGtfc3RyaWN0TW90aWZ9IHsKCSVXIHNjYW4gbWFyayAleCAleQoJc2V0IHRrUHJpdih4KSAleAoJc2V0IHRrUHJpdih5KSAleQoJc2V0IHRrUHJpdihtb3VzZU1vdmVkKSAwCiAgICB9Cn0KYmluZCBUZXh0IDxCMi1Nb3Rpb24+IHsKICAgIGlmIHshJHRrX3N0cmljdE1vdGlmfSB7CglpZiB7KCV4ICE9ICR0a1ByaXYoeCkpIHx8ICgleSAhPSAkdGtQcml2KHkpKX0gewoJICAgIHNldCB0a1ByaXYobW91c2VNb3ZlZCkgMQoJfQoJaWYgeyR0a1ByaXYobW91c2VNb3ZlZCl9IHsKCSAgICAlVyBzY2FuIGRyYWd0byAleCAleQoJfQogICAgfQp9CnNldCB0a1ByaXYocHJldlBvcykge30KCiMgVGhlIE1vdXNlV2hlZWwgd2lsbCB0eXBpY2FsbHkgb25seSBmaXJlIG9uIFdpbmRvd3MuICBIb3dldmVyLAojIHNvbWVvbmUgY291bGQgdXNlIHRoZSAiZXZlbnQgZ2VuZXJhdGUiIGNvbW1hbmQgdG8gcHJvZHVjZSBvbmUKIyBvbiBvdGhlciBwbGF0Zm9ybXMuCgpiaW5kIFRleHQgPE1vdXNlV2hlZWw+IHsKICAgICVXIHl2aWV3IHNjcm9sbCBbZXhwciB7LSAoJUQgLyAxMjApICogNH1dIHVuaXRzCn0KCmlmIHtbc3RyaW5nIGVxdWFsICJ1bml4IiAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKV19IHsKICAgICMgU3VwcG9ydCBmb3IgbW91c2V3aGVlbHMgb24gTGludXgvVW5peCBjb21tb25seSBjb21lcyB0aHJvdWdoIG1hcHBpbmcKICAgICMgdGhlIHdoZWVsIHRvIHRoZSBleHRlbmRlZCBidXR0b25zLiAgSWYgeW91IGhhdmUgYSBtb3VzZXdoZWVsLCBmaW5kCiAgICAjIExpbnV4IGNvbmZpZ3VyYXRpb24gaW5mbyBhdDoKICAgICMJaHR0cDovL3d3dy5pbnJpYS5mci9rb2FsYS9jb2xhcy9tb3VzZS13aGVlbC1zY3JvbGwvCiAgICBiaW5kIFRleHQgPDQ+IHsKCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgkgICAgJVcgeXZpZXcgc2Nyb2xsIC01IHVuaXRzCgl9CiAgICB9CiAgICBiaW5kIFRleHQgPDU+IHsKCWlmIHshJHRrX3N0cmljdE1vdGlmfSB7CgkgICAgJVcgeXZpZXcgc2Nyb2xsIDUgdW5pdHMKCX0KICAgIH0KfQoKIyB0a1RleHRDbG9zZXN0R2FwIC0tCiMgR2l2ZW4geCBhbmQgeSBjb29yZGluYXRlcywgdGhpcyBwcm9jZWR1cmUgZmluZHMgdGhlIGNsb3Nlc3QgYm91bmRhcnkKIyBiZXR3ZWVuIGNoYXJhY3RlcnMgdG8gdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCByZXR1cm5zIHRoZSBpbmRleAojIG9mIHRoZSBjaGFyYWN0ZXIganVzdCBhZnRlciB0aGUgYm91bmRhcnkuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cuCiMgeCAtCQlYLWNvb3JkaW5hdGUgd2l0aGluIHRoZSB3aW5kb3cuCiMgeSAtCQlZLWNvb3JkaW5hdGUgd2l0aGluIHRoZSB3aW5kb3cuCgpwcm9jIHRrVGV4dENsb3Nlc3RHYXAge3cgeCB5fSB7CiAgICBzZXQgcG9zIFskdyBpbmRleCBAJHgsJHldCiAgICBzZXQgYmJveCBbJHcgYmJveCAkcG9zXQogICAgaWYge1tzdHJpbmcgZXF1YWwgJGJib3ggIiJdfSB7CglyZXR1cm4gJHBvcwogICAgfQogICAgaWYgeygkeCAtIFtsaW5kZXggJGJib3ggMF0pIDwgKFtsaW5kZXggJGJib3ggMl0vMil9IHsKCXJldHVybiAkcG9zCiAgICB9CiAgICAkdyBpbmRleCAiJHBvcyArIDEgY2hhciIKfQoKIyB0a1RleHRCdXR0b24xIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgaW52b2tlZCB0byBoYW5kbGUgYnV0dG9uLTEgcHJlc3NlcyBpbiB0ZXh0CiMgd2lkZ2V0cy4gIEl0IG1vdmVzIHRoZSBpbnNlcnRpb24gY3Vyc29yLCBzZXRzIHRoZSBzZWxlY3Rpb24gYW5jaG9yLAojIGFuZCBjbGFpbXMgdGhlIGlucHV0IGZvY3VzLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBidXR0b24gd2FzIHByZXNzZWQuCiMgeCAtCQlUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBidXR0b24gcHJlc3MuCiMgeSAtCQlUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBidXR0b24gcHJlc3MuCgpwcm9jIHRrVGV4dEJ1dHRvbjEge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2CgogICAgc2V0IHRrUHJpdihzZWxlY3RNb2RlKSBjaGFyCiAgICBzZXQgdGtQcml2KG1vdXNlTW92ZWQpIDAKICAgIHNldCB0a1ByaXYocHJlc3NYKSAkeAogICAgJHcgbWFyayBzZXQgaW5zZXJ0IFt0a1RleHRDbG9zZXN0R2FwICR3ICR4ICR5XQogICAgJHcgbWFyayBzZXQgYW5jaG9yIGluc2VydAogICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAibm9ybWFsIl19IHtmb2N1cyAkd30KfQoKIyB0a1RleHRTZWxlY3RUbyAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgdG8gZXh0ZW5kIHRoZSBzZWxlY3Rpb24sIHR5cGljYWxseSB3aGVuCiMgZHJhZ2dpbmcgaXQgd2l0aCB0aGUgbW91c2UuICBEZXBlbmRpbmcgb24gdGhlIHNlbGVjdGlvbiBtb2RlIChjaGFyYWN0ZXIsCiMgd29yZCwgbGluZSkgaXQgc2VsZWN0cyBpbiBkaWZmZXJlbnQtc2l6ZWQgdW5pdHMuICBUaGlzIHByb2NlZHVyZQojIGlnbm9yZXMgbW91c2UgbW90aW9ucyBpbml0aWFsbHkgdW50aWwgdGhlIG1vdXNlIGhhcyBtb3ZlZCBmcm9tCiMgb25lIGNoYXJhY3RlciB0byBhbm90aGVyIG9yIHVudGlsIHRoZXJlIGhhdmUgYmVlbiBtdWx0aXBsZSBjbGlja3MuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdGhlIGJ1dHRvbiB3YXMgcHJlc3NlZC4KIyB4IC0JCU1vdXNlIHggcG9zaXRpb24uCiMgeSAtIAkJTW91c2UgeSBwb3NpdGlvbi4KCnByb2MgdGtUZXh0U2VsZWN0VG8ge3cgeCB5fSB7CiAgICBnbG9iYWwgdGtQcml2IHRjbF9wbGF0Zm9ybQoKICAgIHNldCBjdXIgW3RrVGV4dENsb3Nlc3RHYXAgJHcgJHggJHldCiAgICBpZiB7W2NhdGNoIHskdyBpbmRleCBhbmNob3J9XX0gewoJJHcgbWFyayBzZXQgYW5jaG9yICRjdXIKICAgIH0KICAgIHNldCBhbmNob3IgWyR3IGluZGV4IGFuY2hvcl0KICAgIGlmIHtbJHcgY29tcGFyZSAkY3VyICE9ICRhbmNob3JdIHx8IChhYnMoJHRrUHJpdihwcmVzc1gpIC0gJHgpID49IDMpfSB7CglzZXQgdGtQcml2KG1vdXNlTW92ZWQpIDEKICAgIH0KICAgIHN3aXRjaCAkdGtQcml2KHNlbGVjdE1vZGUpIHsKCWNoYXIgewoJICAgIGlmIHtbJHcgY29tcGFyZSAkY3VyIDwgYW5jaG9yXX0gewoJCXNldCBmaXJzdCAkY3VyCgkJc2V0IGxhc3QgYW5jaG9yCgkgICAgfSBlbHNlIHsKCQlzZXQgZmlyc3QgYW5jaG9yCgkJc2V0IGxhc3QgJGN1cgoJICAgIH0KCX0KCXdvcmQgewoJICAgIGlmIHtbJHcgY29tcGFyZSAkY3VyIDwgYW5jaG9yXX0gewoJCXNldCBmaXJzdCBbdGtUZXh0UHJldlBvcyAkdyAiJGN1ciArIDFjIiB0Y2xfd29yZEJyZWFrQmVmb3JlXQoJCXNldCBsYXN0IFt0a1RleHROZXh0UG9zICR3ICJhbmNob3IiIHRjbF93b3JkQnJlYWtBZnRlcl0KCSAgICB9IGVsc2UgewoJCXNldCBmaXJzdCBbdGtUZXh0UHJldlBvcyAkdyBhbmNob3IgdGNsX3dvcmRCcmVha0JlZm9yZV0KCQlzZXQgbGFzdCBbdGtUZXh0TmV4dFBvcyAkdyAiJGN1ciAtIDFjIiB0Y2xfd29yZEJyZWFrQWZ0ZXJdCgkgICAgfQoJfQoJbGluZSB7CgkgICAgaWYge1skdyBjb21wYXJlICRjdXIgPCBhbmNob3JdfSB7CgkJc2V0IGZpcnN0IFskdyBpbmRleCAiJGN1ciBsaW5lc3RhcnQiXQoJCXNldCBsYXN0IFskdyBpbmRleCAiYW5jaG9yIC0gMWMgbGluZWVuZCArIDFjIl0KCSAgICB9IGVsc2UgewoJCXNldCBmaXJzdCBbJHcgaW5kZXggImFuY2hvciBsaW5lc3RhcnQiXQoJCXNldCBsYXN0IFskdyBpbmRleCAiJGN1ciBsaW5lZW5kICsgMWMiXQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHskdGtQcml2KG1vdXNlTW92ZWQpIHx8IFtzdHJpbmcgY29tcGFyZSAkdGtQcml2KHNlbGVjdE1vZGUpICJjaGFyIl19IHsKCWlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgInVuaXgiXSBcCgkJJiYgWyR3IGNvbXBhcmUgJGN1ciA8IGFuY2hvcl19IHsKCSAgICAkdyBtYXJrIHNldCBpbnNlcnQgJGZpcnN0Cgl9IGVsc2UgewoJICAgICR3IG1hcmsgc2V0IGluc2VydCAkbGFzdAoJfQoJJHcgdGFnIHJlbW92ZSBzZWwgMC4wICRmaXJzdAoJJHcgdGFnIGFkZCBzZWwgJGZpcnN0ICRsYXN0CgkkdyB0YWcgcmVtb3ZlIHNlbCAkbGFzdCBlbmQKCXVwZGF0ZSBpZGxldGFza3MKICAgIH0KfQoKIyB0a1RleHRLZXlFeHRlbmQgLS0KIyBUaGlzIHByb2NlZHVyZSBoYW5kbGVzIGV4dGVuZGluZyB0aGUgc2VsZWN0aW9uIGZyb20gdGhlIGtleWJvYXJkLAojIHdoZXJlIHRoZSBwb2ludCB0byBleHRlbmQgdG8gaXMgcmVhbGx5IHRoZSBib3VuZGFyeSBiZXR3ZWVuIHR3bwojIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gYSBwYXJ0aWN1bGFyIGNoYXJhY3Rlci4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdy4KIyBpbmRleCAtCVRoZSBwb2ludCB0byB3aGljaCB0aGUgc2VsZWN0aW9uIGlzIHRvIGJlIGV4dGVuZGVkLgoKcHJvYyB0a1RleHRLZXlFeHRlbmQge3cgaW5kZXh9IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICBzZXQgY3VyIFskdyBpbmRleCAkaW5kZXhdCiAgICBpZiB7W2NhdGNoIHskdyBpbmRleCBhbmNob3J9XX0gewoJJHcgbWFyayBzZXQgYW5jaG9yICRjdXIKICAgIH0KICAgIHNldCBhbmNob3IgWyR3IGluZGV4IGFuY2hvcl0KICAgIGlmIHtbJHcgY29tcGFyZSAkY3VyIDwgYW5jaG9yXX0gewoJc2V0IGZpcnN0ICRjdXIKCXNldCBsYXN0IGFuY2hvcgogICAgfSBlbHNlIHsKCXNldCBmaXJzdCBhbmNob3IKCXNldCBsYXN0ICRjdXIKICAgIH0KICAgICR3IHRhZyByZW1vdmUgc2VsIDAuMCAkZmlyc3QKICAgICR3IHRhZyBhZGQgc2VsICRmaXJzdCAkbGFzdAogICAgJHcgdGFnIHJlbW92ZSBzZWwgJGxhc3QgZW5kCn0KCiMgdGtUZXh0UGFzdGUgLS0KIyBUaGlzIHByb2NlZHVyZSBzZXRzIHRoZSBpbnNlcnRpb24gY3Vyc29yIHRvIHRoZSBtb3VzZSBwb3NpdGlvbiwKIyBpbnNlcnRzIHRoZSBzZWxlY3Rpb24sIGFuZCBzZXRzIHRoZSBmb2N1cyB0byB0aGUgd2luZG93LgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93LgojIHgsIHkgLSAJUG9zaXRpb24gb2YgdGhlIG1vdXNlLgoKcHJvYyB0a1RleHRQYXN0ZSB7dyB4IHl9IHsKICAgICR3IG1hcmsgc2V0IGluc2VydCBbdGtUZXh0Q2xvc2VzdEdhcCAkdyAkeCAkeV0KICAgIGNhdGNoIHskdyBpbnNlcnQgaW5zZXJ0IFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJHddfQogICAgaWYge1tzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAibm9ybWFsIl19IHtmb2N1cyAkd30KfQoKIyB0a1RleHRBdXRvU2NhbiAtLQojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGEgdGV4dCB3aW5kb3cKIyB3aXRoIGJ1dHRvbiAxIGRvd24uICBJdCBzY3JvbGxzIHRoZSB3aW5kb3cgdXAsIGRvd24sIGxlZnQsIG9yIHJpZ2h0LAojIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgbW91c2UgaXMgKHRoaXMgaW5mb3JtYXRpb24gd2FzIHNhdmVkIGluCiMgdGtQcml2KHgpIGFuZCB0a1ByaXYoeSkpLCBhbmQgcmVzY2hlZHVsZXMgaXRzZWxmIGFzIGFuICJhZnRlciIKIyBjb21tYW5kIHNvIHRoYXQgdGhlIHdpbmRvdyBjb250aW51ZXMgdG8gc2Nyb2xsIHVudGlsIHRoZSBtb3VzZQojIG1vdmVzIGJhY2sgaW50byB0aGUgd2luZG93IG9yIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cuCgpwcm9jIHRrVGV4dEF1dG9TY2FuIHt3fSB7CiAgICBnbG9iYWwgdGtQcml2CiAgICBpZiB7IVt3aW5mbyBleGlzdHMgJHddfSByZXR1cm4KICAgIGlmIHskdGtQcml2KHkpID49IFt3aW5mbyBoZWlnaHQgJHddfSB7CgkkdyB5dmlldyBzY3JvbGwgMiB1bml0cwogICAgfSBlbHNlaWYgeyR0a1ByaXYoeSkgPCAwfSB7CgkkdyB5dmlldyBzY3JvbGwgLTIgdW5pdHMKICAgIH0gZWxzZWlmIHskdGtQcml2KHgpID49IFt3aW5mbyB3aWR0aCAkd119IHsKCSR3IHh2aWV3IHNjcm9sbCAyIHVuaXRzCiAgICB9IGVsc2VpZiB7JHRrUHJpdih4KSA8IDB9IHsKCSR3IHh2aWV3IHNjcm9sbCAtMiB1bml0cwogICAgfSBlbHNlIHsKCXJldHVybgogICAgfQogICAgdGtUZXh0U2VsZWN0VG8gJHcgJHRrUHJpdih4KSAkdGtQcml2KHkpCiAgICBzZXQgdGtQcml2KGFmdGVySWQpIFthZnRlciA1MCBbbGlzdCB0a1RleHRBdXRvU2NhbiAkd11dCn0KCiMgdGtUZXh0U2V0Q3Vyc29yCiMgTW92ZSB0aGUgaW5zZXJ0aW9uIGN1cnNvciB0byBhIGdpdmVuIHBvc2l0aW9uIGluIGEgdGV4dC4gIEFsc28KIyBjbGVhcnMgdGhlIHNlbGVjdGlvbiwgaWYgdGhlcmUgaXMgb25lIGluIHRoZSB0ZXh0LCBhbmQgbWFrZXMgc3VyZQojIHRoYXQgdGhlIGluc2VydGlvbiBjdXJzb3IgaXMgdmlzaWJsZS4gIEFsc28sIGRvbid0IGxldCB0aGUgaW5zZXJ0aW9uCiMgY3Vyc29yIGFwcGVhciBvbiB0aGUgZHVtbXkgbGFzdCBsaW5lIG9mIHRoZSB0ZXh0LgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93LgojIHBvcyAtCQlUaGUgZGVzaXJlZCBuZXcgcG9zaXRpb24gZm9yIHRoZSBjdXJzb3IgaW4gdGhlIHdpbmRvdy4KCnByb2MgdGtUZXh0U2V0Q3Vyc29yIHt3IHBvc30gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbJHcgY29tcGFyZSAkcG9zID09IGVuZF19IHsKCXNldCBwb3Mge2VuZCAtIDEgY2hhcnN9CiAgICB9CiAgICAkdyBtYXJrIHNldCBpbnNlcnQgJHBvcwogICAgJHcgdGFnIHJlbW92ZSBzZWwgMS4wIGVuZAogICAgJHcgc2VlIGluc2VydAp9CgojIHRrVGV4dEtleVNlbGVjdAojIFRoaXMgcHJvY2VkdXJlIGlzIGludm9rZWQgd2hlbiBzdHJva2luZyBvdXQgc2VsZWN0aW9ucyB1c2luZyB0aGUKIyBrZXlib2FyZC4gIEl0IG1vdmVzIHRoZSBjdXJzb3IgdG8gYSBuZXcgcG9zaXRpb24sIHRoZW4gZXh0ZW5kcwojIHRoZSBzZWxlY3Rpb24gdG8gdGhhdCBwb3NpdGlvbi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdy4KIyBuZXcgLQkJQSBuZXcgcG9zaXRpb24gZm9yIHRoZSBpbnNlcnRpb24gY3Vyc29yICh0aGUgY3Vyc29yIGhhc24ndAojCQlhY3R1YWxseSBiZWVuIG1vdmVkIHRvIHRoaXMgcG9zaXRpb24geWV0KS4KCnByb2MgdGtUZXh0S2V5U2VsZWN0IHt3IG5ld30gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyB0YWcgbmV4dHJhbmdlIHNlbCAxLjAgZW5kXSAiIl19IHsKCWlmIHtbJHcgY29tcGFyZSAkbmV3IDwgaW5zZXJ0XX0gewoJICAgICR3IHRhZyBhZGQgc2VsICRuZXcgaW5zZXJ0Cgl9IGVsc2UgewoJICAgICR3IHRhZyBhZGQgc2VsIGluc2VydCAkbmV3Cgl9CgkkdyBtYXJrIHNldCBhbmNob3IgaW5zZXJ0CiAgICB9IGVsc2UgewoJaWYge1skdyBjb21wYXJlICRuZXcgPCBhbmNob3JdfSB7CgkgICAgc2V0IGZpcnN0ICRuZXcKCSAgICBzZXQgbGFzdCBhbmNob3IKCX0gZWxzZSB7CgkgICAgc2V0IGZpcnN0IGFuY2hvcgoJICAgIHNldCBsYXN0ICRuZXcKCX0KCSR3IHRhZyByZW1vdmUgc2VsIDEuMCAkZmlyc3QKCSR3IHRhZyBhZGQgc2VsICRmaXJzdCAkbGFzdAoJJHcgdGFnIHJlbW92ZSBzZWwgJGxhc3QgZW5kCiAgICB9CiAgICAkdyBtYXJrIHNldCBpbnNlcnQgJG5ldwogICAgJHcgc2VlIGluc2VydAogICAgdXBkYXRlIGlkbGV0YXNrcwp9CgojIHRrVGV4dFJlc2V0QW5jaG9yIC0tCiMgU2V0IHRoZSBzZWxlY3Rpb24gYW5jaG9yIHRvIHdoaWNoZXZlciBlbmQgaXMgZmFydGhlc3QgZnJvbSB0aGUKIyBpbmRleCBhcmd1bWVudC4gIE9uZSBzcGVjaWFsIHRyaWNrOiBpZiB0aGUgc2VsZWN0aW9uIGhhcyB0d28gb3IKIyBmZXdlciBjaGFyYWN0ZXJzLCBqdXN0IGxlYXZlIHRoZSBhbmNob3Igd2hlcmUgaXQgaXMuICBJbiB0aGlzCiMgY2FzZSBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCBwb2ludCBnZXRzIGNob3NlbiBmb3IgdGhlIGFuY2hvciwKIyBhbmQgZm9yIHRoZSB0aGluZ3MgbGlrZSBTaGlmdC1MZWZ0IGFuZCBTaGlmdC1SaWdodCB0aGlzIHByb2R1Y2VzCiMgYmV0dGVyIGJlaGF2aW9yIHdoZW4gdGhlIGN1cnNvciBtb3ZlcyBiYWNrIGFuZCBmb3J0aCBhY3Jvc3MgdGhlCiMgYW5jaG9yLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2lkZ2V0LgojIGluZGV4IC0JUG9zaXRpb24gYXQgd2hpY2ggbW91c2UgYnV0dG9uIHdhcyBwcmVzc2VkLCB3aGljaCBkZXRlcm1pbmVzCiMJCXdoaWNoIGVuZCBvZiBzZWxlY3Rpb24gc2hvdWxkIGJlIHVzZWQgYXMgYW5jaG9yIHBvaW50LgoKcHJvYyB0a1RleHRSZXNldEFuY2hvciB7dyBpbmRleH0gewogICAgZ2xvYmFsIHRrUHJpdgoKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFskdyB0YWcgcmFuZ2VzIHNlbF0gIiJdfSB7CgkkdyBtYXJrIHNldCBhbmNob3IgJGluZGV4CglyZXR1cm4KICAgIH0KICAgIHNldCBhIFskdyBpbmRleCAkaW5kZXhdCiAgICBzZXQgYiBbJHcgaW5kZXggc2VsLmZpcnN0XQogICAgc2V0IGMgWyR3IGluZGV4IHNlbC5sYXN0XQogICAgaWYge1skdyBjb21wYXJlICRhIDwgJGJdfSB7CgkkdyBtYXJrIHNldCBhbmNob3Igc2VsLmxhc3QKCXJldHVybgogICAgfQogICAgaWYge1skdyBjb21wYXJlICRhID4gJGNdfSB7CgkkdyBtYXJrIHNldCBhbmNob3Igc2VsLmZpcnN0CglyZXR1cm4KICAgIH0KICAgIHNjYW4gJGEgIiVkLiVkIiBsaW5lQSBjaEEKICAgIHNjYW4gJGIgIiVkLiVkIiBsaW5lQiBjaEIKICAgIHNjYW4gJGMgIiVkLiVkIiBsaW5lQyBjaEMKICAgIGlmIHskbGluZUIgPCAkbGluZUMrMn0gewoJc2V0IHRvdGFsIFtzdHJpbmcgbGVuZ3RoIFskdyBnZXQgJGIgJGNdXQoJaWYgeyR0b3RhbCA8PSAyfSB7CgkgICAgcmV0dXJuCgl9CglpZiB7W3N0cmluZyBsZW5ndGggWyR3IGdldCAkYiAkYV1dIDwgKCR0b3RhbC8yKX0gewoJICAgICR3IG1hcmsgc2V0IGFuY2hvciBzZWwubGFzdAoJfSBlbHNlIHsKCSAgICAkdyBtYXJrIHNldCBhbmNob3Igc2VsLmZpcnN0Cgl9CglyZXR1cm4KICAgIH0KICAgIGlmIHsoJGxpbmVBLSRsaW5lQikgPCAoJGxpbmVDLSRsaW5lQSl9IHsKCSR3IG1hcmsgc2V0IGFuY2hvciBzZWwubGFzdAogICAgfSBlbHNlIHsKCSR3IG1hcmsgc2V0IGFuY2hvciBzZWwuZmlyc3QKICAgIH0KfQoKIyB0a1RleHRJbnNlcnQgLS0KIyBJbnNlcnQgYSBzdHJpbmcgaW50byBhIHRleHQgYXQgdGhlIHBvaW50IG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLgojIElmIHRoZXJlIGlzIGEgc2VsZWN0aW9uIGluIHRoZSB0ZXh0LCBhbmQgaXQgY292ZXJzIHRoZSBwb2ludCBvZiB0aGUKIyBpbnNlcnRpb24gY3Vyc29yLCB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uIGJlZm9yZSBpbnNlcnRpbmcuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdG8gaW5zZXJ0IHRoZSBzdHJpbmcKIyBzIC0JCVRoZSBzdHJpbmcgdG8gaW5zZXJ0ICh1c3VhbGx5IGp1c3QgYSBzaW5nbGUgY2hhcmFjdGVyKQoKcHJvYyB0a1RleHRJbnNlcnQge3cgc30gewogICAgaWYge1tzdHJpbmcgZXF1YWwgJHMgIiJdIHx8IFtzdHJpbmcgZXF1YWwgWyR3IGNnZXQgLXN0YXRlXSAiZGlzYWJsZWQiXX0gewoJcmV0dXJuCiAgICB9CiAgICBjYXRjaCB7CglpZiB7WyR3IGNvbXBhcmUgc2VsLmZpcnN0IDw9IGluc2VydF0gXAoJCSYmIFskdyBjb21wYXJlIHNlbC5sYXN0ID49IGluc2VydF19IHsKCSAgICAkdyBkZWxldGUgc2VsLmZpcnN0IHNlbC5sYXN0Cgl9CiAgICB9CiAgICAkdyBpbnNlcnQgaW5zZXJ0ICRzCiAgICAkdyBzZWUgaW5zZXJ0Cn0KCiMgdGtUZXh0VXBEb3duTGluZSAtLQojIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgb25lIGxpbmUgYWJvdmUgb3IgYmVsb3cgdGhlCiMgaW5zZXJ0aW9uIGN1cnNvci4gIFRoZXJlIGFyZSB0d28gdHJpY2t5IHRoaW5ncyBoZXJlLiAgRmlyc3QsCiMgd2Ugd2FudCB0byBtYWludGFpbiB0aGUgb3JpZ2luYWwgY29sdW1uIGFjcm9zcyByZXBlYXRlZCBvcGVyYXRpb25zLAojIGV2ZW4gdGhvdWdoIHNvbWUgbGluZXMgdGhhdCB3aWxsIGdldCBwYXNzZWQgdGhyb3VnaCBkb24ndCBoYXZlCiMgZW5vdWdoIGNoYXJhY3RlcnMgdG8gY292ZXIgdGhlIG9yaWdpbmFsIGNvbHVtbi4gIFNlY29uZCwgZG9uJ3QKIyB0cnkgdG8gc2Nyb2xsIHBhc3QgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgdGhlIHRleHQuCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdGhlIGN1cnNvciBpcyB0byBtb3ZlLgojIG4gLQkJVGhlIG51bWJlciBvZiBsaW5lcyB0byBtb3ZlOiAtMSBmb3IgdXAgb25lIGxpbmUsCiMJCSsxIGZvciBkb3duIG9uZSBsaW5lLgoKcHJvYyB0a1RleHRVcERvd25MaW5lIHt3IG59IHsKICAgIGdsb2JhbCB0a1ByaXYKCiAgICBzZXQgaSBbJHcgaW5kZXggaW5zZXJ0XQogICAgc2NhbiAkaSAiJWQuJWQiIGxpbmUgY2hhcgogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGtQcml2KHByZXZQb3MpICRpXX0gewoJc2V0IHRrUHJpdihjaGFyKSAkY2hhcgogICAgfQogICAgc2V0IG5ldyBbJHcgaW5kZXggW2V4cHIgeyRsaW5lICsgJG59XS4kdGtQcml2KGNoYXIpXQogICAgaWYge1skdyBjb21wYXJlICRuZXcgPT0gZW5kXSB8fCBbJHcgY29tcGFyZSAkbmV3ID09ICJpbnNlcnQgbGluZXN0YXJ0Il19IHsKCXNldCBuZXcgJGkKICAgIH0KICAgIHNldCB0a1ByaXYocHJldlBvcykgJG5ldwogICAgcmV0dXJuICRuZXcKfQoKIyB0a1RleHRQcmV2UGFyYSAtLQojIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFncmFwaCBqdXN0IGJlZm9yZSBhIGdpdmVuCiMgcG9zaXRpb24gaW4gdGhlIHRleHQgKHRoZSBiZWdpbm5pbmcgb2YgYSBwYXJhZ3JhcGggaXMgdGhlIGZpcnN0IG5vbi1ibGFuawojIGNoYXJhY3RlciBhZnRlciBhIGJsYW5rIGxpbmUpLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBjdXJzb3IgaXMgdG8gbW92ZS4KIyBwb3MgLQkJUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc2VhcmNoLgoKcHJvYyB0a1RleHRQcmV2UGFyYSB7dyBwb3N9IHsKICAgIHNldCBwb3MgWyR3IGluZGV4ICIkcG9zIGxpbmVzdGFydCJdCiAgICB3aGlsZSAxIHsKCWlmIHsoW3N0cmluZyBlcXVhbCBbJHcgZ2V0ICIkcG9zIC0gMSBsaW5lIl0gIlxuIl0gXAoJCSYmIFtzdHJpbmcgY29tcGFyZSBbJHcgZ2V0ICRwb3NdICJcbiJdKSBcCgkJfHwgW3N0cmluZyBlcXVhbCAkcG9zICIxLjAiXX0gewoJICAgIGlmIHtbcmVnZXhwIC1pbmRpY2VzIHteWyAJXSsoLil9IFskdyBnZXQgJHBvcyAiJHBvcyBsaW5lZW5kIl0gXAoJCSAgICBkdW1teSBpbmRleF19IHsKCQlzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIFtsaW5kZXggJGluZGV4IDBdIGNoYXJzIl0KCSAgICB9CgkgICAgaWYge1skdyBjb21wYXJlICRwb3MgIT0gaW5zZXJ0XSB8fCBbc3RyaW5nIGVxdWFsICRwb3MgMS4wXX0gewoJCXJldHVybiAkcG9zCgkgICAgfQoJfQoJc2V0IHBvcyBbJHcgaW5kZXggIiRwb3MgLSAxIGxpbmUiXQogICAgfQp9CgojIHRrVGV4dE5leHRQYXJhIC0tCiMgUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFyYWdyYXBoIGp1c3QgYWZ0ZXIgYSBnaXZlbgojIHBvc2l0aW9uIGluIHRoZSB0ZXh0ICh0aGUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoIGlzIHRoZSBmaXJzdCBub24tYmxhbmsKIyBjaGFyYWN0ZXIgYWZ0ZXIgYSBibGFuayBsaW5lKS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuCiMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guCgpwcm9jIHRrVGV4dE5leHRQYXJhIHt3IHN0YXJ0fSB7CiAgICBzZXQgcG9zIFskdyBpbmRleCAiJHN0YXJ0IGxpbmVzdGFydCArIDEgbGluZSJdCiAgICB3aGlsZSB7W3N0cmluZyBjb21wYXJlIFskdyBnZXQgJHBvc10gIlxuIl19IHsKCWlmIHtbJHcgY29tcGFyZSAkcG9zID09IGVuZF19IHsKCSAgICByZXR1cm4gWyR3IGluZGV4ICJlbmQgLSAxYyJdCgl9CglzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgbGluZSJdCiAgICB9CiAgICB3aGlsZSB7W3N0cmluZyBlcXVhbCBbJHcgZ2V0ICRwb3NdICJcbiJdfSB7CglzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgbGluZSJdCglpZiB7WyR3IGNvbXBhcmUgJHBvcyA9PSBlbmRdfSB7CgkgICAgcmV0dXJuIFskdyBpbmRleCAiZW5kIC0gMWMiXQoJfQogICAgfQogICAgaWYge1tyZWdleHAgLWluZGljZXMge15bIAldKyguKX0gWyR3IGdldCAkcG9zICIkcG9zIGxpbmVlbmQiXSBcCgkgICAgZHVtbXkgaW5kZXhdfSB7CglyZXR1cm4gWyR3IGluZGV4ICIkcG9zICsgW2xpbmRleCAkaW5kZXggMF0gY2hhcnMiXQogICAgfQogICAgcmV0dXJuICRwb3MKfQoKIyB0a1RleHRTY3JvbGxQYWdlcyAtLQojIFRoaXMgaXMgYSB1dGlsaXR5IHByb2NlZHVyZSB1c2VkIGluIGJpbmRpbmdzIGZvciBtb3ZpbmcgdXAgYW5kIGRvd24KIyBwYWdlcyBhbmQgcG9zc2libHkgZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24gYWxvbmcgdGhlIHdheS4gIEl0IHNjcm9sbHMKIyB0aGUgdmlldyBpbiB0aGUgd2lkZ2V0IGJ5IHRoZSBudW1iZXIgb2YgcGFnZXMsIGFuZCBpdCByZXR1cm5zIHRoZQojIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgdGhhdCBpcyBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB0aGUgbmV3IHZpZXcKIyBhcyB0aGUgaW5zZXJ0aW9uIGN1cnNvciB1c2VkIHRvIGJlIGluIHRoZSBvbGQgdmlldy4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuCiMgY291bnQgLQlOdW1iZXIgb2YgcGFnZXMgZm9yd2FyZCB0byBzY3JvbGw7ICBtYXkgYmUgbmVnYXRpdmUKIwkJdG8gc2Nyb2xsIGJhY2t3YXJkcy4KCnByb2MgdGtUZXh0U2Nyb2xsUGFnZXMge3cgY291bnR9IHsKICAgIHNldCBiYm94IFskdyBiYm94IGluc2VydF0KICAgICR3IHl2aWV3IHNjcm9sbCAkY291bnQgcGFnZXMKICAgIGlmIHtbc3RyaW5nIGVxdWFsICRiYm94ICIiXX0gewoJcmV0dXJuIFskdyBpbmRleCBAW2V4cHIge1t3aW5mbyBoZWlnaHQgJHddLzJ9XSwwXQogICAgfQogICAgcmV0dXJuIFskdyBpbmRleCBAW2xpbmRleCAkYmJveCAwXSxbbGluZGV4ICRiYm94IDFdXQp9CgojIHRrVGV4dFRyYW5zcG9zZSAtLQojIFRoaXMgcHJvY2VkdXJlIGltcGxlbWVudHMgdGhlICJ0cmFuc3Bvc2UiIGZ1bmN0aW9uIGZvciB0ZXh0IHdpZGdldHMuCiMgSXQgdHJhbnBvc2VzIHRoZSBjaGFyYWN0ZXJzIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLAojIHVubGVzcyB0aGUgY3Vyc29yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICBJbiB0aGlzIGNhc2UgaXQKIyB0cmFuc3Bvc2VzIHRoZSB0d28gY2hhcmFjdGVycyB0byB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yLiAgSW4gZWl0aGVyCiMgY2FzZSwgdGhlIGN1cnNvciBlbmRzIHVwIHRvIHRoZSByaWdodCBvZiB0aGUgdHJhbnNwb3NlZCBjaGFyYWN0ZXJzLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGV4dCB3aW5kb3cgaW4gd2hpY2ggdG8gdHJhbnNwb3NlLgoKcHJvYyB0a1RleHRUcmFuc3Bvc2UgdyB7CiAgICBzZXQgcG9zIGluc2VydAogICAgaWYge1skdyBjb21wYXJlICRwb3MgIT0gIiRwb3MgbGluZWVuZCJdfSB7CglzZXQgcG9zIFskdyBpbmRleCAiJHBvcyArIDEgY2hhciJdCiAgICB9CiAgICBzZXQgbmV3IFskdyBnZXQgIiRwb3MgLSAxIGNoYXIiXVskdyBnZXQgICIkcG9zIC0gMiBjaGFyIl0KICAgIGlmIHtbJHcgY29tcGFyZSAiJHBvcyAtIDEgY2hhciIgPT0gMS4wXX0gewoJcmV0dXJuCiAgICB9CiAgICAkdyBkZWxldGUgIiRwb3MgLSAyIGNoYXIiICRwb3MKICAgICR3IGluc2VydCBpbnNlcnQgJG5ldwogICAgJHcgc2VlIGluc2VydAp9CgojIHRrX3RleHRDb3B5IC0tCiMgVGhpcyBwcm9jZWR1cmUgY29waWVzIHRoZSBzZWxlY3Rpb24gZnJvbSBhIHRleHQgd2lkZ2V0IGludG8gdGhlCiMgY2xpcGJvYXJkLgojCiMgQXJndW1lbnRzOgojIHcgLQkJTmFtZSBvZiBhIHRleHQgd2lkZ2V0LgoKcHJvYyB0a190ZXh0Q29weSB3IHsKICAgIGlmIHshW2NhdGNoIHtzZXQgZGF0YSBbJHcgZ2V0IHNlbC5maXJzdCBzZWwubGFzdF19XX0gewoJY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJHcKCWNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAkdyAkZGF0YQogICAgfQp9CgojIHRrX3RleHRDdXQgLS0KIyBUaGlzIHByb2NlZHVyZSBjb3BpZXMgdGhlIHNlbGVjdGlvbiBmcm9tIGEgdGV4dCB3aWRnZXQgaW50byB0aGUKIyBjbGlwYm9hcmQsIHRoZW4gZGVsZXRlcyB0aGUgc2VsZWN0aW9uIChpZiBpdCBleGlzdHMgaW4gdGhlIGdpdmVuCiMgd2lkZ2V0KS4KIwojIEFyZ3VtZW50czoKIyB3IC0JCU5hbWUgb2YgYSB0ZXh0IHdpZGdldC4KCnByb2MgdGtfdGV4dEN1dCB3IHsKICAgIGlmIHshW2NhdGNoIHtzZXQgZGF0YSBbJHcgZ2V0IHNlbC5maXJzdCBzZWwubGFzdF19XX0gewoJY2xpcGJvYXJkIGNsZWFyIC1kaXNwbGF5b2YgJHcKCWNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAkdyAkZGF0YQoJJHcgZGVsZXRlIHNlbC5maXJzdCBzZWwubGFzdAogICAgfQp9CgojIHRrX3RleHRQYXN0ZSAtLQojIFRoaXMgcHJvY2VkdXJlIHBhc3RlcyB0aGUgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZCB0byB0aGUgaW5zZXJ0aW9uCiMgcG9pbnQgaW4gYSB0ZXh0IHdpZGdldC4KIwojIEFyZ3VtZW50czoKIyB3IC0JCU5hbWUgb2YgYSB0ZXh0IHdpZGdldC4KCnByb2MgdGtfdGV4dFBhc3RlIHcgewogICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQogICAgY2F0Y2ggewoJaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAidW5peCJdfSB7CgkgICAgY2F0Y2ggewoJCSR3IGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QKCSAgICB9Cgl9CgkkdyBpbnNlcnQgaW5zZXJ0IFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJHcgLXNlbGVjdGlvbiBDTElQQk9BUkRdCiAgICB9Cn0KCiMgdGtUZXh0TmV4dFdvcmQgLS0KIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB3b3JkIHBvc2l0aW9uIGFmdGVyIGEgZ2l2ZW4gcG9zaXRpb24gaW4gdGhlCiMgdGV4dC4gIFRoZSBuZXh0IHdvcmQgaXMgcGxhdGZvcm0gZGVwZW5kZW50IGFuZCBtYXkgYmUgZWl0aGVyIHRoZSBuZXh0CiMgZW5kLW9mLXdvcmQgcG9zaXRpb24gb3IgdGhlIG5leHQgc3RhcnQtb2Ytd29yZCBwb3NpdGlvbiBhZnRlciB0aGUgbmV4dAojIGVuZC1vZi13b3JkIHBvc2l0aW9uLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRoZSBjdXJzb3IgaXMgdG8gbW92ZS4KIyBzdGFydCAtCVBvc2l0aW9uIGF0IHdoaWNoIHRvIHN0YXJ0IHNlYXJjaC4KCmlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19ICB7CiAgICBwcm9jIHRrVGV4dE5leHRXb3JkIHt3IHN0YXJ0fSB7Cgl0a1RleHROZXh0UG9zICR3IFt0a1RleHROZXh0UG9zICR3ICRzdGFydCB0Y2xfZW5kT2ZXb3JkXSBcCgkgICAgdGNsX3N0YXJ0T2ZOZXh0V29yZAogICAgfQp9IGVsc2UgewogICAgcHJvYyB0a1RleHROZXh0V29yZCB7dyBzdGFydH0gewoJdGtUZXh0TmV4dFBvcyAkdyAkc3RhcnQgdGNsX2VuZE9mV29yZAogICAgfQp9CgojIHRrVGV4dE5leHRQb3MgLS0KIyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBwb3NpdGlvbiBhZnRlciB0aGUgZ2l2ZW4gc3RhcnRpbmcKIyBwb3NpdGlvbiBpbiB0aGUgdGV4dCBhcyBjb21wdXRlZCBieSBhIHNwZWNpZmllZCBmdW5jdGlvbi4KIwojIEFyZ3VtZW50czoKIyB3IC0JCVRoZSB0ZXh0IHdpbmRvdyBpbiB3aGljaCB0aGUgY3Vyc29yIGlzIHRvIG1vdmUuCiMgc3RhcnQgLQlQb3NpdGlvbiBhdCB3aGljaCB0byBzdGFydCBzZWFyY2guCiMgb3AgLQkJRnVuY3Rpb24gdG8gdXNlIHRvIGZpbmQgbmV4dCBwb3NpdGlvbi4KCnByb2MgdGtUZXh0TmV4dFBvcyB7dyBzdGFydCBvcH0gewogICAgc2V0IHRleHQgIiIKICAgIHNldCBjdXIgJHN0YXJ0CiAgICB3aGlsZSB7WyR3IGNvbXBhcmUgJGN1ciA8IGVuZF19IHsKCXNldCB0ZXh0ICR0ZXh0WyR3IGdldCAkY3VyICIkY3VyIGxpbmVlbmQgKyAxYyJdCglzZXQgcG9zIFskb3AgJHRleHQgMF0KCWlmIHskcG9zID49IDB9IHsKCSAgICAjIyBBZGp1c3QgZm9yIGVtYmVkZGVkIHdpbmRvd3MgYW5kIGltYWdlcwoJICAgICMjIGR1bXAgZ2l2ZXMgdXMgMyBpdGVtcyBwZXIgd2luZG93L2ltYWdlCgkgICAgc2V0IGR1bXAgWyR3IGR1bXAgLWltYWdlIC13aW5kb3cgJHN0YXJ0ICIkc3RhcnQgKyAkcG9zIGMiXQoJICAgIGlmIHtbbGxlbmd0aCAkZHVtcF19IHsKCQlzZXQgcG9zIFtleHByIHskcG9zICsgKFtsbGVuZ3RoICRkdW1wXS8zKX1dCgkgICAgfQoJICAgIHJldHVybiBbJHcgaW5kZXggIiRzdGFydCArICRwb3MgYyJdCgl9CglzZXQgY3VyIFskdyBpbmRleCAiJGN1ciBsaW5lZW5kICsxYyJdCiAgICB9CiAgICByZXR1cm4gZW5kCn0KCiMgdGtUZXh0UHJldlBvcyAtLQojIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBwb3NpdGlvbiBiZWZvcmUgdGhlIGdpdmVuIHN0YXJ0aW5nCiMgcG9zaXRpb24gaW4gdGhlIHRleHQgYXMgY29tcHV0ZWQgYnkgYSBzcGVjaWZpZWQgZnVuY3Rpb24uCiMKIyBBcmd1bWVudHM6CiMgdyAtCQlUaGUgdGV4dCB3aW5kb3cgaW4gd2hpY2ggdGhlIGN1cnNvciBpcyB0byBtb3ZlLgojIHN0YXJ0IC0JUG9zaXRpb24gYXQgd2hpY2ggdG8gc3RhcnQgc2VhcmNoLgojIG9wIC0JCUZ1bmN0aW9uIHRvIHVzZSB0byBmaW5kIG5leHQgcG9zaXRpb24uCgpwcm9jIHRrVGV4dFByZXZQb3Mge3cgc3RhcnQgb3B9IHsKICAgIHNldCB0ZXh0ICIiCiAgICBzZXQgY3VyICRzdGFydAogICAgd2hpbGUge1skdyBjb21wYXJlICRjdXIgPiAwLjBdfSB7CglzZXQgdGV4dCBbJHcgZ2V0ICIkY3VyIGxpbmVzdGFydCAtIDFjIiAkY3VyXSR0ZXh0CglzZXQgcG9zIFskb3AgJHRleHQgZW5kXQoJaWYgeyRwb3MgPj0gMH0gewoJICAgICMjIEFkanVzdCBmb3IgZW1iZWRkZWQgd2luZG93cyBhbmQgaW1hZ2VzCgkgICAgIyMgZHVtcCBnaXZlcyB1cyAzIGl0ZW1zIHBlciB3aW5kb3cvaW1hZ2UKCSAgICBzZXQgZHVtcCBbJHcgZHVtcCAtaW1hZ2UgLXdpbmRvdyAiJGN1ciBsaW5lc3RhcnQiICIkc3RhcnQgLSAxYyJdCgkgICAgaWYge1tsbGVuZ3RoICRkdW1wXX0gewoJCSMjIFRoaXMgaXMgYSBob2tleSBleHRyYSBoYWNrIGZvciBjb250cm9sLWFycm93IG1vdmVtZW50CgkJIyMgdGhhdCBzaG91bGQgYmUgaW4gYSB3aGlsZSBsb29wIHRvIGJlIGNvcnJlY3QgKGhvYmJzKQoJCWlmIHtbJHcgY29tcGFyZSBbbGluZGV4ICRkdW1wIDJdID4gXAoJCQkiJGN1ciBsaW5lc3RhcnQgLSAxYyArICRwb3MgYyJdfSB7CgkJICAgIGluY3IgcG9zIC0xCgkJfQoJCXNldCBwb3MgW2V4cHIgeyRwb3MgKyAoW2xsZW5ndGggJGR1bXBdLzMpfV0KCSAgICB9CgkgICAgcmV0dXJuIFskdyBpbmRleCAiJGN1ciBsaW5lc3RhcnQgLSAxYyArICRwb3MgYyJdCgl9CglzZXQgY3VyIFskdyBpbmRleCAiJGN1ciBsaW5lc3RhcnQgLSAxYyJdCiAgICB9CiAgICByZXR1cm4gMC4wCn0KAAANuSMgYmdlcnJvci50Y2wgLS0KIwojIFRoaXMgZmlsZSBjb250YWlucyBhIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgYmdlcnJvciBwcm9jZWR1cmUuICBJdAojIHBvc3RzIGEgZGlhbG9nIGJveCB3aXRoIHRoZSBlcnJvciBtZXNzYWdlIGFuZCBnaXZlcyB0aGUgdXNlciBhIGNoYW5jZQojIHRvIHNlZSBhIG1vcmUgZGV0YWlsZWQgc3RhY2sgdHJhY2UuCiMKIyBSQ1M6IEAoIykgJElkOiBiZ2Vycm9yLnRjbCx2IDEuNSAxOTk5LzA0LzE2IDAxOjUxOjI1IHN0YW50b24gRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5Mi0xOTk0IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgojCiMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uCiMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KCgojIGJnZXJyb3IgLS0KIyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZlcnNpb24gb2YgYmdlcnJvci4gCiMgSXQgdHJpZXMgdG8gZXhlY3V0ZSB0a2Vycm9yLCBpZiB0aGF0IGZhaWxzIGl0IHBvc3RzIGEgZGlhbG9nIGJveCBjb250YWluaW5nCiMgdGhlIGVycm9yIG1lc3NhZ2UgYW5kIGdpdmVzIHRoZSB1c2VyIGEgY2hhbmNlIHRvIGFzayB0byBzZWUgYSBzdGFjawojIHRyYWNlLgojIEFyZ3VtZW50czoKIyBlcnIgLQkJCVRoZSBlcnJvciBtZXNzYWdlLgoKcHJvYyBiZ2Vycm9yIGVyciB7CiAgICBnbG9iYWwgZXJyb3JJbmZvIHRjbF9wbGF0Zm9ybQoKICAgICMgc2F2ZSBlcnJvckluZm8gd2hpY2ggd291bGQgYmUgZXJhc2VkIGluIHRoZSBjYXRjaCBiZWxvdyBvdGhlcndpc2UuCiAgICBzZXQgaW5mbyAkZXJyb3JJbmZvIDsKCiAgICAjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IDoKICAgICMgTGV0J3MgdHJ5IHRvIGV4ZWN1dGUgInRrZXJyb3IiICh1c2luZyBjYXRjaCB7dGtlcnJvciAuLi59IAogICAgIyBpbnN0ZWFkIG9mIHNlYXJjaGluZyBpdCB3aXRoIGluZm8gcHJvY3Mgc28gdGhlIGFwcGxpY2F0aW9uIGdldHMKICAgICMgYSBjaGFuY2UgdG8gYXV0byBsb2FkIGl0IHVzaW5nIGl0cyBmYXZvcml0ZSAidW5rbm93biIgbWVjYW5pc20uCiAgICAjICh3ZSBkbyB0aGUgZGVmYXVsdCBkaWFsb2cgb25seSBpZiB3ZSBnZXQgYSBUQ0xfRVJST1IgKD0xKSByZXR1cm4KICAgICMgIGNvZGUgZnJvbSB0aGUgdGtlcnJvciB0cmlhbCwgb3RoZXIgcmV0IGNvZGVzIGFyZSBwYXNzZWQgYmFjawogICAgIyAgdG8gb3VyIGNhbGxlciAodGNsIGJhY2tncm91bmQgZXJyb3IgaGFuZGxlcikgc28gdGhlIGNhbGxlZCAidGtlcnJvciIKICAgICMgIGNhbiBzdGlsbCB1c2UgIHJldHVybiAtY29kZSBicmVhaywgdG8gc2tpcCByZW1haW5pbmcgbWVzc2FnZXMKICAgICMgIGluIHRoZSBlcnJvciBxdWV1ZSBmb3IgaW5zdGFuY2UpCgogICAgc2V0IHJldCBbY2F0Y2gge3RrZXJyb3IgJGVycn0gbXNnXTsKICAgIGlmIHskcmV0ICE9IDF9IHtyZXR1cm4gLWNvZGUgJHJldCAkbXNnfQoKICAgICMgT2sgdGhlIGFwcGxpY2F0aW9uJ3MgdGtlcnJvciBlaXRoZXIgZmFpbGVkIG9yIHdhcyBub3QgZm91bmQKICAgICMgd2UgdXNlIHRoZSBkZWZhdWx0IGRpYWxvZyB0aGVuIDoKICAgIGlmIHskdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSA9PSAibWFjaW50b3NoIn0gewoJc2V0IG9rIE9rCiAgICB9IGVsc2UgewoJc2V0IG9rIE9LCiAgICB9CiAgICBzZXQgYnV0dG9uIFt0a19kaWFsb2cgLmJnZXJyb3JEaWFsb2cgIkVycm9yIGluIFRjbCBTY3JpcHQiIFwKCSAgICAiRXJyb3I6ICRlcnIiIGVycm9yIDAgJG9rICJTa2lwIE1lc3NhZ2VzIiAiU3RhY2sgVHJhY2UiXQogICAgaWYgeyRidXR0b24gPT0gMH0gewoJcmV0dXJuCiAgICB9IGVsc2VpZiB7JGJ1dHRvbiA9PSAxfSB7CglyZXR1cm4gLWNvZGUgYnJlYWsKICAgIH0KCiAgICBzZXQgdyAuYmdlcnJvclRyYWNlCiAgICBjYXRjaCB7ZGVzdHJveSAkd30KICAgIHRvcGxldmVsICR3IC1jbGFzcyBFcnJvclRyYWNlCiAgICB3bSBtaW5zaXplICR3IDEgMQogICAgd20gdGl0bGUgJHcgIlN0YWNrIFRyYWNlIGZvciBFcnJvciIKICAgIHdtIGljb25uYW1lICR3ICJTdGFjayBUcmFjZSIKICAgIGJ1dHRvbiAkdy5vayAtdGV4dCBPSyAtY29tbWFuZCAiZGVzdHJveSAkdyIgLWRlZmF1bHQgYWN0aXZlCiAgICBpZiB7IVtzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKICAgICAgdGV4dCAkdy50ZXh0IC1yZWxpZWYgZmxhdCAtYmQgMiAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAgLXNldGdyaWQgdHJ1ZSBcCgkgICAgLXlzY3JvbGxjb21tYW5kICIkdy5zY3JvbGwgc2V0IiAtd2lkdGggNjAgLWhlaWdodCAyMAogICAgfSBlbHNlIHsKICAgICAgdGV4dCAkdy50ZXh0IC1yZWxpZWYgc3Vua2VuIC1iZCAyIC15c2Nyb2xsY29tbWFuZCAiJHcuc2Nyb2xsIHNldCIgXAoJICAgIC1zZXRncmlkIHRydWUgLXdpZHRoIDYwIC1oZWlnaHQgMjAKICAgIH0KICAgIHNjcm9sbGJhciAkdy5zY3JvbGwgLXJlbGllZiBzdW5rZW4gLWNvbW1hbmQgIiR3LnRleHQgeXZpZXciCiAgICBwYWNrICR3Lm9rIC1zaWRlIGJvdHRvbSAtcGFkeCAzbSAtcGFkeSAybQogICAgcGFjayAkdy5zY3JvbGwgLXNpZGUgcmlnaHQgLWZpbGwgeQogICAgcGFjayAkdy50ZXh0IC1zaWRlIGxlZnQgLWV4cGFuZCB5ZXMgLWZpbGwgYm90aAogICAgJHcudGV4dCBpbnNlcnQgMC4wICRpbmZvCiAgICAkdy50ZXh0IG1hcmsgc2V0IGluc2VydCAwLjAKCiAgICBiaW5kICR3IDxSZXR1cm4+ICJkZXN0cm95ICR3IgogICAgYmluZCAkdy50ZXh0IDxSZXR1cm4+ICJkZXN0cm95ICR3OyBicmVhayIKCiAgICAjIENlbnRlciB0aGUgd2luZG93IG9uIHRoZSBzY3JlZW4uCgogICAgd20gd2l0aGRyYXcgJHcKICAgIHVwZGF0ZSBpZGxldGFza3MKICAgIHNldCB4IFtleHByIHtbd2luZm8gc2NyZWVud2lkdGggJHddLzIgLSBbd2luZm8gcmVxd2lkdGggJHddLzIgXAoJICAgIC0gW3dpbmZvIHZyb290eCBbd2luZm8gcGFyZW50ICR3XV19XQogICAgc2V0IHkgW2V4cHIge1t3aW5mbyBzY3JlZW5oZWlnaHQgJHddLzIgLSBbd2luZm8gcmVxaGVpZ2h0ICR3XS8yIFwKCSAgICAtIFt3aW5mbyB2cm9vdHkgW3dpbmZvIHBhcmVudCAkd11dfV0KICAgIHdtIGdlb20gJHcgKyR4KyR5CiAgICB3bSBkZWljb25pZnkgJHcKCiAgICAjIEJlIHN1cmUgdG8gcmVsZWFzZSBhbnkgZ3JhYnMgdGhhdCBtaWdodCBiZSBwcmVzZW50IG9uIHRoZQogICAgIyBzY3JlZW4sIHNpbmNlIHRoZXkgY291bGQgbWFrZSBpdCBpbXBvc3NpYmxlIGZvciB0aGUgdXNlcgogICAgIyB0byBpbnRlcmFjdCB3aXRoIHRoZSBzdGFjayB0cmFjZS4KCiAgICBpZiB7W3N0cmluZyBjb21wYXJlIFtncmFiIGN1cnJlbnQgLl0gIiJdfSB7CglncmFiIHJlbGVhc2UgW2dyYWIgY3VycmVudCAuXQogICAgfQp9CgAAMDIjIGNvbnNvbGUudGNsIC0tCiMKIyBUaGlzIGNvZGUgY29uc3RydWN0cyB0aGUgY29uc29sZSB3aW5kb3cgZm9yIGFuIGFwcGxpY2F0aW9uLiAgSXQKIyBjYW4gYmUgdXNlZCBieSBub24tdW5peCBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgYnVpbHQtaW4gc3VwcG9ydAojIGZvciBzaGVsbHMuCiMKIyBSQ1M6IEAoIykgJElkOiBjb25zb2xlLnRjbCx2IDEuNyAxOTk5LzA5LzAyIDE3OjAyOjUyIGhvYmJzIEV4cCAkCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBTY3JpcHRpY3MgQ29ycC4KIyBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIFRPRE86IGhpc3RvcnkgLSByZW1lbWJlciBwYXJ0aWFsbHkgd3JpdHRlbiBjb21tYW5kCgojIHRrQ29uc29sZUluaXQgLS0KIyBUaGlzIHByb2NlZHVyZSBjb25zdHJ1Y3RzIGFuZCBjb25maWd1cmVzIHRoZSBjb25zb2xlIHdpbmRvd3MuCiMKIyBBcmd1bWVudHM6CiMgCU5vbmUuCgpwcm9jIHRrQ29uc29sZUluaXQge30gewogICAgZ2xvYmFsIHRjbF9wbGF0Zm9ybQoKICAgIGlmIHshW2NvbnNvbGVpbnRlcnAgZXZhbCB7c2V0IHRjbF9pbnRlcmFjdGl2ZX1dfSB7Cgl3bSB3aXRoZHJhdyAuCiAgICB9CgogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKCXNldCBtb2QgIkN0cmwiCiAgICB9IGVsc2UgewoJc2V0IG1vZCAiQ21kIgogICAgfQoKICAgIG1lbnUgLm1lbnViYXIKICAgIC5tZW51YmFyIGFkZCBjYXNjYWRlIC1sYWJlbCBGaWxlIC1tZW51IC5tZW51YmFyLmZpbGUgLXVuZGVybGluZSAwCiAgICAubWVudWJhciBhZGQgY2FzY2FkZSAtbGFiZWwgRWRpdCAtbWVudSAubWVudWJhci5lZGl0IC11bmRlcmxpbmUgMAoKICAgIG1lbnUgLm1lbnViYXIuZmlsZSAtdGVhcm9mZiAwCiAgICAubWVudWJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiU291cmNlLi4uIiAtdW5kZXJsaW5lIDAgXAoJICAgIC1jb21tYW5kIHRrQ29uc29sZVNvdXJjZQogICAgLm1lbnViYXIuZmlsZSBhZGQgY29tbWFuZCAtbGFiZWwgIkhpZGUgQ29uc29sZSIgLXVuZGVybGluZSAwIFwKCSAgICAtY29tbWFuZCB7d20gd2l0aGRyYXcgLn0KICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7CgkubWVudWJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiRXhpdCIgLXVuZGVybGluZSAxIC1jb21tYW5kIGV4aXQKICAgIH0gZWxzZSB7CgkubWVudWJhci5maWxlIGFkZCBjb21tYW5kIC1sYWJlbCAiUXVpdCIgLWNvbW1hbmQgZXhpdCAtYWNjZWwgQ21kLVEKICAgIH0KCiAgICBtZW51IC5tZW51YmFyLmVkaXQgLXRlYXJvZmYgMAogICAgLm1lbnViYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIkN1dCIgLXVuZGVybGluZSAyIFwKCSAgICAtY29tbWFuZCB7IGV2ZW50IGdlbmVyYXRlIC5jb25zb2xlIDw8Q3V0Pj4gfSAtYWNjZWwgIiRtb2QrWCIKICAgIC5tZW51YmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJDb3B5IiAtdW5kZXJsaW5lIDAgXAoJICAgIC1jb21tYW5kIHsgZXZlbnQgZ2VuZXJhdGUgLmNvbnNvbGUgPDxDb3B5Pj4gfSAtYWNjZWwgIiRtb2QrQyIKICAgIC5tZW51YmFyLmVkaXQgYWRkIGNvbW1hbmQgLWxhYmVsICJQYXN0ZSIgLXVuZGVybGluZSAxIFwKCSAgICAtY29tbWFuZCB7IGV2ZW50IGdlbmVyYXRlIC5jb25zb2xlIDw8UGFzdGU+PiB9IC1hY2NlbCAiJG1vZCtWIgoKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIndpbmRvd3MiXX0gewoJLm1lbnViYXIuZWRpdCBhZGQgY29tbWFuZCAtbGFiZWwgIkNsZWFyIiAtdW5kZXJsaW5lIDIgXAoJCS1jb21tYW5kIHsgZXZlbnQgZ2VuZXJhdGUgLmNvbnNvbGUgPDxDbGVhcj4+IH0KICAgIH0gZWxzZSB7CgkubWVudWJhci5lZGl0IGFkZCBjb21tYW5kIC1sYWJlbCAiRGVsZXRlIiAtdW5kZXJsaW5lIDAgXAoJCS1jb21tYW5kIHsgZXZlbnQgZ2VuZXJhdGUgLmNvbnNvbGUgPDxDbGVhcj4+IH0gLWFjY2VsICJEZWwiCgoJLm1lbnViYXIgYWRkIGNhc2NhZGUgLWxhYmVsIEhlbHAgLW1lbnUgLm1lbnViYXIuaGVscCAtdW5kZXJsaW5lIDAKCW1lbnUgLm1lbnViYXIuaGVscCAtdGVhcm9mZiAwCgkubWVudWJhci5oZWxwIGFkZCBjb21tYW5kIC1sYWJlbCAiQWJvdXQuLi4iIC11bmRlcmxpbmUgMCBcCgkJLWNvbW1hbmQgdGtDb25zb2xlQWJvdXQKICAgIH0KCiAgICAuIGNvbmZpZ3VyZSAtbWVudSAubWVudWJhcgoKICAgIHRleHQgLmNvbnNvbGUgIC15c2Nyb2xsY29tbWFuZCAiLnNiIHNldCIgLXNldGdyaWQgdHJ1ZSAKICAgIHNjcm9sbGJhciAuc2IgLWNvbW1hbmQgIi5jb25zb2xlIHl2aWV3IgogICAgcGFjayAuc2IgLXNpZGUgcmlnaHQgLWZpbGwgYm90aAogICAgcGFjayAuY29uc29sZSAtZmlsbCBib3RoIC1leHBhbmQgMSAtc2lkZSBsZWZ0CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKICAgICAgICAuY29uc29sZSBjb25maWd1cmUgLWZvbnQge01vbmFjbyA5IG5vcm1hbH0gLWhpZ2hsaWdodHRoaWNrbmVzcyAwCiAgICB9CgogICAgdGtDb25zb2xlQmluZCAuY29uc29sZQoKICAgIC5jb25zb2xlIHRhZyBjb25maWd1cmUgc3RkZXJyIC1mb3JlZ3JvdW5kIHJlZAogICAgLmNvbnNvbGUgdGFnIGNvbmZpZ3VyZSBzdGRpbiAtZm9yZWdyb3VuZCBibHVlCgogICAgZm9jdXMgLmNvbnNvbGUKICAgIAogICAgd20gcHJvdG9jb2wgLiBXTV9ERUxFVEVfV0lORE9XIHsgd20gd2l0aGRyYXcgLiB9CiAgICB3bSB0aXRsZSAuICJDb25zb2xlIgogICAgZmx1c2ggc3Rkb3V0CiAgICAuY29uc29sZSBtYXJrIHNldCBvdXRwdXQgWy5jb25zb2xlIGluZGV4ICJlbmQgLSAxIGNoYXIiXQogICAgdGtUZXh0U2V0Q3Vyc29yIC5jb25zb2xlIGVuZAogICAgLmNvbnNvbGUgbWFyayBzZXQgcHJvbXB0RW5kIGluc2VydAogICAgLmNvbnNvbGUgbWFyayBncmF2aXR5IHByb21wdEVuZCBsZWZ0Cn0KCiMgdGtDb25zb2xlU291cmNlIC0tCiMKIyBQcm9tcHRzIHRoZSB1c2VyIGZvciBhIGZpbGUgdG8gc291cmNlIGluIHRoZSBtYWluIGludGVycHJldGVyLgojCiMgQXJndW1lbnRzOgojIE5vbmUuCgpwcm9jIHRrQ29uc29sZVNvdXJjZSB7fSB7CiAgICBzZXQgZmlsZW5hbWUgW3RrX2dldE9wZW5GaWxlIC1kZWZhdWx0ZXh0ZW5zaW9uIC50Y2wgLXBhcmVudCAuIFwKCQkgICAgICAtdGl0bGUgIlNlbGVjdCBhIGZpbGUgdG8gc291cmNlIiBcCgkJICAgICAgLWZpbGV0eXBlcyB7eyJUY2wgU2NyaXB0cyIgLnRjbH0geyJBbGwgRmlsZXMiICp9fV0KICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGZpbGVuYW1lICIiXX0gewogICAgCXNldCBjbWQgW2xpc3Qgc291cmNlICRmaWxlbmFtZV0KCWlmIHtbY2F0Y2gge2NvbnNvbGVpbnRlcnAgZXZhbCAkY21kfSByZXN1bHRdfSB7CgkgICAgdGtDb25zb2xlT3V0cHV0IHN0ZGVyciAiJHJlc3VsdFxuIgoJfQogICAgfQp9CgojIHRrQ29uc29sZUludm9rZSAtLQojIFByb2Nlc3NlcyB0aGUgY29tbWFuZCBsaW5lIGlucHV0LiAgSWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgaXQKIyBpcyBldmFsZWQgaW4gdGhlIG1haW4gaW50ZXJwcmV0ZXIuICBPdGhlcndpc2UsIHRoZSBjb250aW51YXRpb24KIyBwcm9tcHQgaXMgYWRkZWQgYW5kIG1vcmUgaW5wdXQgbWF5IGJlIGFkZGVkLgojCiMgQXJndW1lbnRzOgojIE5vbmUuCgpwcm9jIHRrQ29uc29sZUludm9rZSB7YXJnc30gewogICAgc2V0IHJhbmdlcyBbLmNvbnNvbGUgdGFnIHJhbmdlcyBpbnB1dF0KICAgIHNldCBjbWQgIiIKICAgIGlmIHtbbGxlbmd0aCAkcmFuZ2VzXX0gewoJc2V0IHBvcyAwCgl3aGlsZSB7W3N0cmluZyBjb21wYXJlIFtsaW5kZXggJHJhbmdlcyAkcG9zXSAiIl19IHsKCSAgICBzZXQgc3RhcnQgW2xpbmRleCAkcmFuZ2VzICRwb3NdCgkgICAgc2V0IGVuZCBbbGluZGV4ICRyYW5nZXMgW2luY3IgcG9zXV0KCSAgICBhcHBlbmQgY21kIFsuY29uc29sZSBnZXQgJHN0YXJ0ICRlbmRdCgkgICAgaW5jciBwb3MKCX0KICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRjbWQgIiJdfSB7Cgl0a0NvbnNvbGVQcm9tcHQKICAgIH0gZWxzZWlmIHtbaW5mbyBjb21wbGV0ZSAkY21kXX0gewoJLmNvbnNvbGUgbWFyayBzZXQgb3V0cHV0IGVuZAoJLmNvbnNvbGUgdGFnIGRlbGV0ZSBpbnB1dAoJc2V0IHJlc3VsdCBbY29uc29sZWludGVycCByZWNvcmQgJGNtZF0KCWlmIHtbc3RyaW5nIGNvbXBhcmUgJHJlc3VsdCAiIl19IHsKCSAgICBwdXRzICRyZXN1bHQKCX0KCXRrQ29uc29sZUhpc3RvcnkgcmVzZXQKCXRrQ29uc29sZVByb21wdAogICAgfSBlbHNlIHsKCXRrQ29uc29sZVByb21wdCBwYXJ0aWFsCiAgICB9CiAgICAuY29uc29sZSB5dmlldyAtcGlja3BsYWNlIGluc2VydAp9CgojIHRrQ29uc29sZUhpc3RvcnkgLS0KIyBUaGlzIHByb2NlZHVyZSBpbXBsZW1lbnRzIGNvbW1hbmQgbGluZSBoaXN0b3J5IGZvciB0aGUKIyBjb25zb2xlLiAgSW4gZ2VuZXJhbCBpcyBldmFscyB0aGUgaGlzdG9yeSBjb21tYW5kIGluIHRoZQojIG1haW4gaW50ZXJwcmV0ZXIgdG8gb2J0YWluIHRoZSBoaXN0b3J5LiAgVGhlIGdsb2JhbCB2YXJpYWJsZQojIGhpc3ROdW0gaXMgdXNlZCB0byBzdG9yZSB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaGlzdG9yeS4KIwojIEFyZ3VtZW50czoKIyBjbWQgLQlXaGljaCBhY3Rpb24gdG8gdGFrZTogcHJldiwgbmV4dCwgcmVzZXQuCgpzZXQgaGlzdE51bSAxCnByb2MgdGtDb25zb2xlSGlzdG9yeSB7Y21kfSB7CiAgICBnbG9iYWwgaGlzdE51bQogICAgCiAgICBzd2l0Y2ggJGNtZCB7CiAgICAJcHJldiB7CgkgICAgaW5jciBoaXN0TnVtIC0xCgkgICAgaWYgeyRoaXN0TnVtID09IDB9IHsKCQlzZXQgY21kIHtoaXN0b3J5IGV2ZW50IFtleHByIHtbaGlzdG9yeSBuZXh0aWRdIC0xfV19CgkgICAgfSBlbHNlIHsKCQlzZXQgY21kICJoaXN0b3J5IGV2ZW50ICRoaXN0TnVtIgoJICAgIH0KICAgIAkgICAgaWYge1tjYXRjaCB7Y29uc29sZWludGVycCBldmFsICRjbWR9IGNtZF19IHsKICAgIAkgICAgCWluY3IgaGlzdE51bQogICAgCSAgICAJcmV0dXJuCiAgICAJICAgIH0KCSAgICAuY29uc29sZSBkZWxldGUgcHJvbXB0RW5kIGVuZAogICAgCSAgICAuY29uc29sZSBpbnNlcnQgcHJvbXB0RW5kICRjbWQge2lucHV0IHN0ZGlufQogICAgCX0KICAgIAluZXh0IHsKCSAgICBpbmNyIGhpc3ROdW0KCSAgICBpZiB7JGhpc3ROdW0gPT0gMH0gewoJCXNldCBjbWQge2hpc3RvcnkgZXZlbnQgW2V4cHIge1toaXN0b3J5IG5leHRpZF0gLTF9XX0KCSAgICB9IGVsc2VpZiB7JGhpc3ROdW0gPiAwfSB7CgkJc2V0IGNtZCAiIgoJCXNldCBoaXN0TnVtIDEKCSAgICB9IGVsc2UgewoJCXNldCBjbWQgImhpc3RvcnkgZXZlbnQgJGhpc3ROdW0iCgkgICAgfQoJICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGNtZCAiIl19IHsKCQljYXRjaCB7Y29uc29sZWludGVycCBldmFsICRjbWR9IGNtZAoJICAgIH0KCSAgICAuY29uc29sZSBkZWxldGUgcHJvbXB0RW5kIGVuZAoJICAgIC5jb25zb2xlIGluc2VydCBwcm9tcHRFbmQgJGNtZCB7aW5wdXQgc3RkaW59CiAgICAJfQogICAgCXJlc2V0IHsKICAgIAkgICAgc2V0IGhpc3ROdW0gMQogICAgCX0KICAgIH0KfQoKIyB0a0NvbnNvbGVQcm9tcHQgLS0KIyBUaGlzIHByb2NlZHVyZSBkcmF3cyB0aGUgcHJvbXB0LiAgSWYgdGNsX3Byb21wdDEgb3IgdGNsX3Byb21wdDIKIyBleGlzdHMgaW4gdGhlIG1haW4gaW50ZXJwcmV0ZXIgaXQgd2lsbCBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgdGhlIAojIHByb21wdC4gIE90aGVyd2lzZSwgYSBoYXJkIGNvZGVkIGRlZmF1bHQgcHJvbXB0IGlzIHByaW50ZWQuCiMKIyBBcmd1bWVudHM6CiMgcGFydGlhbCAtCUZsYWcgdG8gc3BlY2lmeSB3aGljaCBwcm9tcHQgdG8gcHJpbnQuCgpwcm9jIHRrQ29uc29sZVByb21wdCB7e3BhcnRpYWwgbm9ybWFsfX0gewogICAgaWYge1tzdHJpbmcgZXF1YWwgJHBhcnRpYWwgIm5vcm1hbCJdfSB7CglzZXQgdGVtcCBbLmNvbnNvbGUgaW5kZXggImVuZCAtIDEgY2hhciJdCgkuY29uc29sZSBtYXJrIHNldCBvdXRwdXQgZW5kCiAgICAJaWYge1tjb25zb2xlaW50ZXJwIGV2YWwgImluZm8gZXhpc3RzIHRjbF9wcm9tcHQxIl19IHsKICAgIAkgICAgY29uc29sZWludGVycCBldmFsICJldmFsIFxbc2V0IHRjbF9wcm9tcHQxXF0iCiAgICAJfSBlbHNlIHsKICAgIAkgICAgcHV0cyAtbm9uZXdsaW5lICIlICIKICAgIAl9CiAgICB9IGVsc2UgewoJc2V0IHRlbXAgWy5jb25zb2xlIGluZGV4IG91dHB1dF0KCS5jb25zb2xlIG1hcmsgc2V0IG91dHB1dCBlbmQKICAgIAlpZiB7W2NvbnNvbGVpbnRlcnAgZXZhbCAiaW5mbyBleGlzdHMgdGNsX3Byb21wdDIiXX0gewogICAgCSAgICBjb25zb2xlaW50ZXJwIGV2YWwgImV2YWwgXFtzZXQgdGNsX3Byb21wdDJcXSIKICAgIAl9IGVsc2UgewoJICAgIHB1dHMgLW5vbmV3bGluZSAiPiAiCiAgICAJfQogICAgfQogICAgZmx1c2ggc3Rkb3V0CiAgICAuY29uc29sZSBtYXJrIHNldCBvdXRwdXQgJHRlbXAKICAgIHRrVGV4dFNldEN1cnNvciAuY29uc29sZSBlbmQKICAgIC5jb25zb2xlIG1hcmsgc2V0IHByb21wdEVuZCBpbnNlcnQKICAgIC5jb25zb2xlIG1hcmsgZ3Jhdml0eSBwcm9tcHRFbmQgbGVmdAp9CgojIHRrQ29uc29sZUJpbmQgLS0KIyBUaGlzIHByb2NlZHVyZSBmaXJzdCBlbnN1cmVzIHRoYXQgdGhlIGRlZmF1bHQgYmluZGluZ3MgZm9yIHRoZSBUZXh0CiMgY2xhc3MgaGF2ZSBiZWVuIGRlZmluZWQuICBUaGVuIGNlcnRhaW4gYmluZGluZ3MgYXJlIG92ZXJyaWRkZW4gZm9yCiMgdGhlIGNsYXNzLgojCiMgQXJndW1lbnRzOgojIE5vbmUuCgpwcm9jIHRrQ29uc29sZUJpbmQge3dpbn0gewogICAgYmluZHRhZ3MgJHdpbiAiJHdpbiBUZXh0IC4gYWxsIgoKICAgICMgSWdub3JlIGFsbCBBbHQsIE1ldGEsIGFuZCBDb250cm9sIGtleXByZXNzZXMgdW5sZXNzIGV4cGxpY2l0bHkgYm91bmQuCiAgICAjIE90aGVyd2lzZSwgaWYgYSB3aWRnZXQgYmluZGluZyBmb3Igb25lIG9mIHRoZXNlIGlzIGRlZmluZWQsIHRoZQogICAgIyA8S2V5UHJlc3M+IGNsYXNzIGJpbmRpbmcgd2lsbCBhbHNvIGZpcmUgYW5kIGluc2VydCB0aGUgY2hhcmFjdGVyLAogICAgIyB3aGljaCBpcyB3cm9uZy4gIERpdHRvIGZvciA8RXNjYXBlPi4KCiAgICBiaW5kICR3aW4gPEFsdC1LZXlQcmVzcz4geyMgbm90aGluZyB9CiAgICBiaW5kICR3aW4gPE1ldGEtS2V5UHJlc3M+IHsjIG5vdGhpbmd9CiAgICBiaW5kICR3aW4gPENvbnRyb2wtS2V5UHJlc3M+IHsjIG5vdGhpbmd9CiAgICBiaW5kICR3aW4gPEVzY2FwZT4geyMgbm90aGluZ30KICAgIGJpbmQgJHdpbiA8S1BfRW50ZXI+IHsjIG5vdGhpbmd9CgogICAgYmluZCAkd2luIDxUYWI+IHsKCXRrQ29uc29sZUluc2VydCAlVyBcdAoJZm9jdXMgJVcKCWJyZWFrCiAgICB9CiAgICBiaW5kICR3aW4gPFJldHVybj4gewoJJVcgbWFyayBzZXQgaW5zZXJ0IHtlbmQgLSAxY30KCXRrQ29uc29sZUluc2VydCAlVyAiXG4iCgl0a0NvbnNvbGVJbnZva2UKCWJyZWFrCiAgICB9CiAgICBiaW5kICR3aW4gPERlbGV0ZT4gewoJaWYge1tzdHJpbmcgY29tcGFyZSBbJVcgdGFnIG5leHRyYW5nZSBzZWwgMS4wIGVuZF0gIiJdfSB7CgkgICAgJVcgdGFnIHJlbW92ZSBzZWwgc2VsLmZpcnN0IHByb21wdEVuZAoJfSBlbHNlaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IHsKCSAgICBicmVhawoJfQogICAgfQogICAgYmluZCAkd2luIDxCYWNrU3BhY2U+IHsKCWlmIHtbc3RyaW5nIGNvbXBhcmUgWyVXIHRhZyBuZXh0cmFuZ2Ugc2VsIDEuMCBlbmRdICIiXX0gewoJICAgICVXIHRhZyByZW1vdmUgc2VsIHNlbC5maXJzdCBwcm9tcHRFbmQKCX0gZWxzZWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPD0gcHJvbXB0RW5kXX0gewoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBmb3JlYWNoIGxlZnQge0NvbnRyb2wtYSBIb21lfSB7CgliaW5kICR3aW4gPCRsZWZ0PiB7CgkgICAgaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IHsKCQl0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lc3RhcnR9CgkgICAgfSBlbHNlIHsKCQl0a1RleHRTZXRDdXJzb3IgJVcgcHJvbXB0RW5kCiAgICAgICAgICAgIH0KCSAgICBicmVhawoJfQogICAgfQogICAgZm9yZWFjaCByaWdodCB7Q29udHJvbC1lIEVuZH0gewoJYmluZCAkd2luIDwkcmlnaHQ+IHsKCSAgICB0a1RleHRTZXRDdXJzb3IgJVcge2luc2VydCBsaW5lZW5kfQoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBiaW5kICR3aW4gPENvbnRyb2wtZD4gewoJaWYge1slVyBjb21wYXJlIGluc2VydCA8IHByb21wdEVuZF19IHsKCSAgICBicmVhawoJfQogICAgfQogICAgYmluZCAkd2luIDxDb250cm9sLWs+IHsKCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPCBwcm9tcHRFbmRdfSB7CgkgICAgJVcgbWFyayBzZXQgaW5zZXJ0IHByb21wdEVuZAoJfQogICAgfQogICAgYmluZCAkd2luIDxDb250cm9sLXQ+IHsKCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPCBwcm9tcHRFbmRdfSB7CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGJpbmQgJHdpbiA8TWV0YS1kPiB7CglpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0IDwgcHJvbXB0RW5kXX0gewoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBiaW5kICR3aW4gPE1ldGEtQmFja1NwYWNlPiB7CglpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0IDw9IHByb21wdEVuZF19IHsKCSAgICBicmVhawoJfQogICAgfQogICAgYmluZCAkd2luIDxDb250cm9sLWg+IHsKCWlmIHtbJVcgY29tcGFyZSBpbnNlcnQgPD0gcHJvbXB0RW5kXX0gewoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBmb3JlYWNoIHByZXYge0NvbnRyb2wtcCBVcH0gewoJYmluZCAkd2luIDwkcHJldj4gewoJICAgIHRrQ29uc29sZUhpc3RvcnkgcHJldgoJICAgIGJyZWFrCgl9CiAgICB9CiAgICBmb3JlYWNoIHByZXYge0NvbnRyb2wtbiBEb3dufSB7CgliaW5kICR3aW4gPCRwcmV2PiB7CgkgICAgdGtDb25zb2xlSGlzdG9yeSBuZXh0CgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGJpbmQgJHdpbiA8SW5zZXJ0PiB7CgljYXRjaCB7dGtDb25zb2xlSW5zZXJ0ICVXIFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJVddfQoJYnJlYWsKICAgIH0KICAgIGJpbmQgJHdpbiA8S2V5UHJlc3M+IHsKCXRrQ29uc29sZUluc2VydCAlVyAlQQoJYnJlYWsKICAgIH0KICAgIGZvcmVhY2ggbGVmdCB7Q29udHJvbC1iIExlZnR9IHsKCWJpbmQgJHdpbiA8JGxlZnQ+IHsKCSAgICBpZiB7WyVXIGNvbXBhcmUgaW5zZXJ0ID09IHByb21wdEVuZF19IHsKCQlicmVhawoJICAgIH0KCSAgICB0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0LTFjCgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGZvcmVhY2ggcmlnaHQge0NvbnRyb2wtZiBSaWdodH0gewoJYmluZCAkd2luIDwkcmlnaHQ+IHsKCSAgICB0a1RleHRTZXRDdXJzb3IgJVcgaW5zZXJ0KzFjCgkgICAgYnJlYWsKCX0KICAgIH0KICAgIGJpbmQgJHdpbiA8Rjk+IHsKCWV2YWwgZGVzdHJveSBbd2luZm8gY2hpbGQgLl0KCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXX0gewoJICAgIHNvdXJjZSAtcnNyYyBDb25zb2xlCgl9IGVsc2UgewoJICAgIHNvdXJjZSBbZmlsZSBqb2luICR0a19saWJyYXJ5IGNvbnNvbGUudGNsXQoJfQogICAgfQogICAgYmluZCAkd2luIDw8Q3V0Pj4gewogICAgICAgICMgU2FtZSBhcyB0aGUgY29weSBldmVudAogCWlmIHshW2NhdGNoIHtzZXQgZGF0YSBbJVcgZ2V0IHNlbC5maXJzdCBzZWwubGFzdF19XX0gewoJICAgIGNsaXBib2FyZCBjbGVhciAtZGlzcGxheW9mICVXCgkgICAgY2xpcGJvYXJkIGFwcGVuZCAtZGlzcGxheW9mICVXICRkYXRhCgl9CglicmVhawogICAgfQogICAgYmluZCAkd2luIDw8Q29weT4+IHsKIAlpZiB7IVtjYXRjaCB7c2V0IGRhdGEgWyVXIGdldCBzZWwuZmlyc3Qgc2VsLmxhc3RdfV19IHsKCSAgICBjbGlwYm9hcmQgY2xlYXIgLWRpc3BsYXlvZiAlVwoJICAgIGNsaXBib2FyZCBhcHBlbmQgLWRpc3BsYXlvZiAlVyAkZGF0YQoJfQoJYnJlYWsKICAgIH0KICAgIGJpbmQgJHdpbiA8PFBhc3RlPj4gewoJY2F0Y2ggewoJICAgIHNldCBjbGlwIFtzZWxlY3Rpb24gZ2V0IC1kaXNwbGF5b2YgJVcgLXNlbGVjdGlvbiBDTElQQk9BUkRdCgkgICAgc2V0IGxpc3QgW3NwbGl0ICRjbGlwIFxuXHJdCgkgICAgdGtDb25zb2xlSW5zZXJ0ICVXIFtsaW5kZXggJGxpc3QgMF0KCSAgICBmb3JlYWNoIHggW2xyYW5nZSAkbGlzdCAxIGVuZF0gewoJCSVXIG1hcmsgc2V0IGluc2VydCB7ZW5kIC0gMWN9CgkJdGtDb25zb2xlSW5zZXJ0ICVXICJcbiIKCQl0a0NvbnNvbGVJbnZva2UKCQl0a0NvbnNvbGVJbnNlcnQgJVcgJHgKCSAgICB9Cgl9CglicmVhawogICAgfQp9CgojIHRrQ29uc29sZUluc2VydCAtLQojIEluc2VydCBhIHN0cmluZyBpbnRvIGEgdGV4dCBhdCB0aGUgcG9pbnQgb2YgdGhlIGluc2VydGlvbiBjdXJzb3IuCiMgSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gaW4gdGhlIHRleHQsIGFuZCBpdCBjb3ZlcnMgdGhlIHBvaW50IG9mIHRoZQojIGluc2VydGlvbiBjdXJzb3IsIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24gYmVmb3JlIGluc2VydGluZy4gIEluc2VydGlvbgojIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHByb21wdCBhcmVhLgojCiMgQXJndW1lbnRzOgojIHcgLQkJVGhlIHRleHQgd2luZG93IGluIHdoaWNoIHRvIGluc2VydCB0aGUgc3RyaW5nCiMgcyAtCQlUaGUgc3RyaW5nIHRvIGluc2VydCAodXN1YWxseSBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlcikKCnByb2MgdGtDb25zb2xlSW5zZXJ0IHt3IHN9IHsKICAgIGlmIHtbc3RyaW5nIGVxdWFsICRzICIiXX0gewoJcmV0dXJuCiAgICB9CiAgICBjYXRjaCB7CglpZiB7WyR3IGNvbXBhcmUgc2VsLmZpcnN0IDw9IGluc2VydF0KCQkmJiBbJHcgY29tcGFyZSBzZWwubGFzdCA+PSBpbnNlcnRdfSB7CgkgICAgJHcgdGFnIHJlbW92ZSBzZWwgc2VsLmZpcnN0IHByb21wdEVuZAoJICAgICR3IGRlbGV0ZSBzZWwuZmlyc3Qgc2VsLmxhc3QKCX0KICAgIH0KICAgIGlmIHtbJHcgY29tcGFyZSBpbnNlcnQgPCBwcm9tcHRFbmRdfSB7CgkkdyBtYXJrIHNldCBpbnNlcnQgZW5kCQogICAgfQogICAgJHcgaW5zZXJ0IGluc2VydCAkcyB7aW5wdXQgc3RkaW59CiAgICAkdyBzZWUgaW5zZXJ0Cn0KCiMgdGtDb25zb2xlT3V0cHV0IC0tCiMKIyBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGRpcmVjdGx5IGJ5IENvbnNvbGVQdXRzQ21kIHRvIGNhdXNlIGEgc3RyaW5nCiMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb25zb2xlLgojCiMgQXJndW1lbnRzOgojIGRlc3QgLQlUaGUgb3V0cHV0IHRhZyB0byBiZSB1c2VkOiBlaXRoZXIgInN0ZGVyciIgb3IgInN0ZG91dCIuCiMgc3RyaW5nIC0JVGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQuCgpwcm9jIHRrQ29uc29sZU91dHB1dCB7ZGVzdCBzdHJpbmd9IHsKICAgIC5jb25zb2xlIGluc2VydCBvdXRwdXQgJHN0cmluZyAkZGVzdAogICAgLmNvbnNvbGUgc2VlIGluc2VydAp9CgojIHRrQ29uc29sZUV4aXQgLS0KIwojIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgQ29uc29sZUV2ZW50UHJvYyB3aGVuIHRoZSBtYWluIHdpbmRvdyBvZgojIHRoZSBhcHBsaWNhdGlvbiBpcyBkZXN0cm95ZWQuICBEb24ndCBjYWxsIGV4aXQgLSB0aGF0IHByb2JhYmx5IGFscmVhZHkKIyBoYXBwZW5lZC4gIEp1c3QgZGVsZXRlIG91ciB3aW5kb3cuCiMKIyBBcmd1bWVudHM6CiMgTm9uZS4KCnByb2MgdGtDb25zb2xlRXhpdCB7fSB7CiAgICBkZXN0cm95IC4KfQoKIyB0a0NvbnNvbGVBYm91dCAtLQojCiMgVGhpcyByb3V0aW5lIGRpc3BsYXlzIGFuIEFib3V0IGJveCB0byBzaG93IFRjbC9UayB2ZXJzaW9uIGluZm8uCiMKIyBBcmd1bWVudHM6CiMgTm9uZS4KCnByb2MgdGtDb25zb2xlQWJvdXQge30gewogICAgZ2xvYmFsIHRrX3BhdGNoTGV2ZWwKICAgIHRrX21lc3NhZ2VCb3ggLXR5cGUgb2sgLW1lc3NhZ2UgIlRjbCBmb3IgV2luZG93cwpDb3B5cmlnaHQgXDI1MSAxOTk5IFNjcmlwdGljcyBDb3Jwb3JhdGlvbgoKVGNsIFtpbmZvIHBhdGNobGV2ZWxdClRrICR0a19wYXRjaExldmVsIgp9CgojIG5vdyBpbml0aWFsaXplIHRoZSBjb25zb2xlCgp0a0NvbnNvbGVJbml0CgAAOcMjIG1zZ2JveC50Y2wgLS0KIwojCUltcGxlbWVudHMgbWVzc2FnZWJveGVzIGZvciBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgaGF2ZSBuYXRpdmUKIwltZXNzYWdlYm94IHN1cHBvcnQuCiMKIyBSQ1M6IEAoIykgJElkOiBtc2dib3gudGNsLHYgMS44IDE5OTkvMTIvMDMgMDc6MTU6MDIgaG9iYnMgRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5NC0xOTk3IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCiMgRW5zdXJlIGV4aXN0ZW5jZSBvZiA6OnRrOjpkaWFsb2cgbmFtZXNwYWNlCiMKbmFtZXNwYWNlIGV2YWwgOjp0azo6ZGlhbG9nIHt9CgppbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6YjEgLWZvcmVncm91bmQgYmxhY2sgXAotZGF0YSAiI2RlZmluZSBiMV93aWR0aCAzMlxuI2RlZmluZSBiMV9oZWlnaHQgMzIKc3RhdGljIHVuc2lnbmVkIGNoYXIgcTFfYml0c1tdID0gewogICAweDAwLCAweGY4LCAweDFmLCAweDAwLCAweDAwLCAweDA3LCAweGUwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAzLAogICAweDIwLCAweDAwLCAweDAwLCAweDA0LCAweDEwLCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLAogICAweDA0LCAweDAwLCAweDAwLCAweDIwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLAogICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLAogICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLAogICAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLCAweDAyLCAweDAwLCAweDAwLCAweDQwLAogICAweDA0LCAweDAwLCAweDAwLCAweDIwLCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDA4LAogICAweDYwLCAweDAwLCAweDAwLCAweDA0LCAweDgwLCAweDAzLCAweDgwLCAweDAzLCAweDAwLCAweDBjLCAweDc4LCAweDAwLAogICAweDAwLCAweDMwLCAweDA0LCAweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDAwLCAweDAwLCAweDQwLCAweDA0LCAweDAwLAogICAweDAwLCAweDgwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsiCmltYWdlIGNyZWF0ZSBiaXRtYXAgOjp0azo6ZGlhbG9nOjpiMiAtZm9yZWdyb3VuZCB3aGl0ZSBcCi1kYXRhICIjZGVmaW5lIGIyX3dpZHRoIDMyXG4jZGVmaW5lIGIyX2hlaWdodCAzMgpzdGF0aWMgdW5zaWduZWQgY2hhciBiMl9iaXRzW10gPSB7CiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsCiAgIDB4YzAsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4MDcsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4MGYsCiAgIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4MWYsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsCiAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsCiAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsCiAgIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4N2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsIDB4ZmMsIDB4ZmYsIDB4ZmYsIDB4M2YsCiAgIDB4ZjgsIDB4ZmYsIDB4ZmYsIDB4MWYsIDB4ZjAsIDB4ZmYsIDB4ZmYsIDB4MGYsIDB4ZTAsIDB4ZmYsIDB4ZmYsIDB4MDcsCiAgIDB4ODAsIDB4ZmYsIDB4ZmYsIDB4MDMsIDB4MDAsIDB4ZmMsIDB4N2YsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDcsIDB4MDAsCiAgIDB4MDAsIDB4YzAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDMsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyIKaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OnEgLWZvcmVncm91bmQgYmx1ZSBcCi1kYXRhICIjZGVmaW5lIHFfd2lkdGggMzJcbiNkZWZpbmUgcV9oZWlnaHQgMzIKc3RhdGljIHVuc2lnbmVkIGNoYXIgcV9iaXRzW10gPSB7CiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDcsIDB4MDAsCiAgIDB4MDAsIDB4MTAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MzgsIDB4MWUsIDB4MDAsCiAgIDB4MDAsIDB4MzgsIDB4MWUsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MGYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDcsIDB4MDAsCiAgIDB4MDAsIDB4YzAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsCiAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyIKaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OmkgLWZvcmVncm91bmQgYmx1ZSBcCi1kYXRhICIjZGVmaW5lIGlfd2lkdGggMzJcbiNkZWZpbmUgaV9oZWlnaHQgMzIKc3RhdGljIHVuc2lnbmVkIGNoYXIgaV9iaXRzW10gPSB7CiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsCiAgIDB4MDAsIDB4ZTAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4ZjgsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsCiAgIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsCiAgIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDcsIDB4MDAsCiAgIDB4MDAsIDB4ZjgsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OyIKaW1hZ2UgY3JlYXRlIGJpdG1hcCA6OnRrOjpkaWFsb2c6OncxIC1mb3JlZ3JvdW5kIGJsYWNrIFwKLWRhdGEgIiNkZWZpbmUgdzFfd2lkdGggMzJcbiNkZWZpbmUgdzFfaGVpZ2h0IDMyCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHcxX2JpdHNbXSA9IHsKICAgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwNCwgMHgwMCwKICAgMHgwMCwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwKICAgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgyMCwgMHgwMCwKICAgMHgwMCwgMHgwMiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MCwgMHgwMCwKICAgMHgwMCwgMHgwMSwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwKICAgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMiwKICAgMHgyMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwKICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwKICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwKICAgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwKICAgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07IgppbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6dzIgLWZvcmVncm91bmQgeWVsbG93IFwKLWRhdGEgIiNkZWZpbmUgdzJfd2lkdGggMzJcbiNkZWZpbmUgdzJfaGVpZ2h0IDMyCnN0YXRpYyB1bnNpZ25lZCBjaGFyIHcyX2JpdHNbXSA9IHsKICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMSwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMywgMHgwMCwKICAgMHgwMCwgMHhlMCwgMHgwMywgMHgwMCwgMHgwMCwgMHhlMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhmMCwgMHgwNywgMHgwMCwKICAgMHgwMCwgMHhmMCwgMHgwZiwgMHgwMCwgMHgwMCwgMHhmOCwgMHgwZiwgMHgwMCwgMHgwMCwgMHhmOCwgMHgxZiwgMHgwMCwKICAgMHgwMCwgMHhmYywgMHgxZiwgMHgwMCwgMHgwMCwgMHhmYywgMHgzZiwgMHgwMCwgMHgwMCwgMHhmZSwgMHgzZiwgMHgwMCwKICAgMHgwMCwgMHhmZSwgMHg3ZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHg3ZiwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwKICAgMHg4MCwgMHhmZiwgMHhmZiwgMHgwMCwgMHg4MCwgMHhmZiwgMHhmZiwgMHgwMSwgMHhjMCwgMHhmZiwgMHhmZiwgMHgwMSwKICAgMHhjMCwgMHhmZiwgMHhmZiwgMHgwMywgMHhlMCwgMHhmZiwgMHhmZiwgMHgwMywgMHhlMCwgMHhmZiwgMHhmZiwgMHgwNywKICAgMHhmMCwgMHhmZiwgMHhmZiwgMHgwNywgMHhmMCwgMHhmZiwgMHhmZiwgMHgwZiwgMHhmOCwgMHhmZiwgMHhmZiwgMHgwZiwKICAgMHhmOCwgMHhmZiwgMHhmZiwgMHgxZiwgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwKICAgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwgMHhmZSwgMHhmZiwgMHhmZiwgMHgzZiwgMHhmYywgMHhmZiwgMHhmZiwgMHgxZiwKICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07IgppbWFnZSBjcmVhdGUgYml0bWFwIDo6dGs6OmRpYWxvZzo6dzMgLWZvcmVncm91bmQgYmxhY2sgXAotZGF0YSAiI2RlZmluZSB3M193aWR0aCAzMlxuI2RlZmluZSB3M19oZWlnaHQgMzIKc3RhdGljIHVuc2lnbmVkIGNoYXIgdzNfYml0c1tdID0gewogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLAogICAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLCAweDAwLCAweGUwLCAweDA3LCAweDAwLAogICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLAogICAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweGMwLCAweDAzLCAweDAwLAogICAweDAwLCAweGMwLCAweDAzLCAweDAwLCAweDAwLCAweDgwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsiCgojIHRrTWVzc2FnZUJveCAtLQojCiMJUG9wcyB1cCBhIG1lc3NhZ2Vib3ggd2l0aCBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBtZXNzYWdlIHdpdGgKIwlhbiBpY29uIGFuZCBhIGxpc3Qgb2YgYnV0dG9ucy4gVGhpcyBwcm9jZWR1cmUgd2lsbCBiZSBjYWxsZWQKIwlieSB0a19tZXNzYWdlQm94IGlmIHRoZSBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIG5hdGl2ZQojCW1lc3NhZ2Vib3ggc3VwcG9ydCwgb3IgaWYgdGhlIHBhcnRpY3VsYXIgdHlwZSBvZiBtZXNzYWdlYm94IGlzCiMJbm90IHN1cHBvcnRlZCBuYXRpdmVseS4KIwojCUNvbG9yIGljb25zIGFyZSB1c2VkIG9uIFVuaXggZGlzcGxheXMgdGhhdCBoYXZlIGEgY29sb3IKIwlkZXB0aCBvZiA0IG9yIG1vcmUgYW5kICR0a19zdHJpY3RNb3RpZiBpcyBub3Qgb24uCiMKIwlUaGlzIHByb2NlZHVyZSBpcyBhIHByaXZhdGUgcHJvY2VkdXJlIHNob3VsZG4ndCBiZSBjYWxsZWQKIwlkaXJlY3RseS4gQ2FsbCB0a19tZXNzYWdlQm94IGluc3RlYWQuCiMKIwlTZWUgdGhlIHVzZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvbiB3aGF0IHRrX21lc3NhZ2VCb3ggZG9lcy4KIwpwcm9jIHRrTWVzc2FnZUJveCB7YXJnc30gewogICAgZ2xvYmFsIHRrUHJpdiB0Y2xfcGxhdGZvcm0gdGtfc3RyaWN0TW90aWYKCiAgICBzZXQgdyB0a1ByaXZNc2dCb3gKICAgIHVwdmFyICMwICR3IGRhdGEKCiAgICAjCiAgICAjIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSB0aXRsZSBpcyBzcGFjZSAoIiAiKSBub3QgdGhlIGVtcHR5IHN0cmluZwogICAgIyBiZWNhdXNlIGZvciBzb21lIHdpbmRvdyBtYW5hZ2VycywgYSAKICAgICMJCXdtIHRpdGxlIC5mb28gIiIKICAgICMgY2F1c2VzIHRoZSB3aW5kb3cgdGl0bGUgdG8gYmUgImZvbyIgaW5zdGVhZCBvZiB0aGUgZW1wdHkgc3RyaW5nLgogICAgIwogICAgc2V0IHNwZWNzIHsKCXstZGVmYXVsdCAiIiAiIiAiIn0KICAgICAgICB7LWljb24gIiIgIiIgImluZm8ifQogICAgICAgIHstbWVzc2FnZSAiIiAiIiAiIn0KICAgICAgICB7LXBhcmVudCAiIiAiIiAufQogICAgICAgIHstdGl0bGUgIiIgIiIgIiAifQogICAgICAgIHstdHlwZSAiIiAiIiAib2sifQogICAgfQoKICAgIHRjbFBhcnNlQ29uZmlnU3BlYyAkdyAkc3BlY3MgIiIgJGFyZ3MKCiAgICBpZiB7W2xzZWFyY2ggLWV4YWN0IHtpbmZvIHdhcm5pbmcgZXJyb3IgcXVlc3Rpb259ICRkYXRhKC1pY29uKV0gPT0gLTF9IHsKCWVycm9yICJiYWQgLWljb24gdmFsdWUgXCIkZGF0YSgtaWNvbilcIjogbXVzdCBiZSBlcnJvciwgaW5mbywgcXVlc3Rpb24sIG9yIHdhcm5pbmciCiAgICB9CiAgICBpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKCXN3aXRjaCAtLSAkZGF0YSgtaWNvbikgewoJICAgICJlcnJvciIgICAgIHtzZXQgZGF0YSgtaWNvbikgInN0b3AifQoJICAgICJ3YXJuaW5nIiAgIHtzZXQgZGF0YSgtaWNvbikgImNhdXRpb24ifQoJICAgICJpbmZvIiAgICAgIHtzZXQgZGF0YSgtaWNvbikgIm5vdGUifQoJfQogICAgfQoKICAgIGlmIHshW3dpbmZvIGV4aXN0cyAkZGF0YSgtcGFyZW50KV19IHsKCWVycm9yICJiYWQgd2luZG93IHBhdGggbmFtZSBcIiRkYXRhKC1wYXJlbnQpXCIiCiAgICB9CgogICAgc3dpdGNoIC0tICRkYXRhKC10eXBlKSB7CglhYm9ydHJldHJ5aWdub3JlIHsKCSAgICBzZXQgYnV0dG9ucyB7CgkJe2Fib3J0ICAtd2lkdGggNiAtdGV4dCBBYm9ydCAtdW5kZXIgMH0KCQl7cmV0cnkgIC13aWR0aCA2IC10ZXh0IFJldHJ5IC11bmRlciAwfQoJCXtpZ25vcmUgLXdpZHRoIDYgLXRleHQgSWdub3JlIC11bmRlciAwfQoJICAgIH0KCX0KCW9rIHsKCSAgICBzZXQgYnV0dG9ucyB7CgkJe29rIC13aWR0aCA2IC10ZXh0IE9LIC11bmRlciAwfQoJICAgIH0KCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZGF0YSgtZGVmYXVsdCkgIiJdfSB7CgkJc2V0IGRhdGEoLWRlZmF1bHQpICJvayIKCSAgICB9Cgl9Cglva2NhbmNlbCB7CgkgICAgc2V0IGJ1dHRvbnMgewoJCXtvayAgICAgLXdpZHRoIDYgLXRleHQgT0sgICAgIC11bmRlciAwfQoJCXtjYW5jZWwgLXdpZHRoIDYgLXRleHQgQ2FuY2VsIC11bmRlciAwfQoJICAgIH0KCX0KCXJldHJ5Y2FuY2VsIHsKCSAgICBzZXQgYnV0dG9ucyB7CgkJe3JldHJ5ICAtd2lkdGggNiAtdGV4dCBSZXRyeSAgLXVuZGVyIDB9CgkJe2NhbmNlbCAtd2lkdGggNiAtdGV4dCBDYW5jZWwgLXVuZGVyIDB9CgkgICAgfQoJfQoJeWVzbm8gewoJICAgIHNldCBidXR0b25zIHsKCQl7eWVzICAgIC13aWR0aCA2IC10ZXh0IFllcyAtdW5kZXIgMH0KCQl7bm8gICAgIC13aWR0aCA2IC10ZXh0IE5vICAtdW5kZXIgMH0KCSAgICB9Cgl9Cgl5ZXNub2NhbmNlbCB7CgkgICAgc2V0IGJ1dHRvbnMgewoJCXt5ZXMgICAgLXdpZHRoIDYgLXRleHQgWWVzIC11bmRlciAwfQoJCXtubyAgICAgLXdpZHRoIDYgLXRleHQgTm8gIC11bmRlciAwfQoJCXtjYW5jZWwgLXdpZHRoIDYgLXRleHQgQ2FuY2VsIC11bmRlciAwfQoJICAgIH0KCX0KCWRlZmF1bHQgewoJICAgIGVycm9yICJiYWQgLXR5cGUgdmFsdWUgXCIkZGF0YSgtdHlwZSlcIjogbXVzdCBiZSBhYm9ydHJldHJ5aWdub3JlLCBvaywgb2tjYW5jZWwsIHJldHJ5Y2FuY2VsLCB5ZXNubywgb3IgeWVzbm9jYW5jZWwiCgl9CiAgICB9CgogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZGF0YSgtZGVmYXVsdCkgIiJdfSB7CglzZXQgdmFsaWQgMAoJZm9yZWFjaCBidG4gJGJ1dHRvbnMgewoJICAgIGlmIHtbc3RyaW5nIGVxdWFsIFtsaW5kZXggJGJ0biAwXSAkZGF0YSgtZGVmYXVsdCldfSB7CgkJc2V0IHZhbGlkIDEKCQlicmVhawoJICAgIH0KCX0KCWlmIHshJHZhbGlkfSB7CgkgICAgZXJyb3IgImludmFsaWQgZGVmYXVsdCBidXR0b24gXCIkZGF0YSgtZGVmYXVsdClcIiIKCX0KICAgIH0KCiAgICAjIDIuIFNldCB0aGUgZGlhbG9nIHRvIGJlIGEgY2hpbGQgd2luZG93IG9mICRwYXJlbnQKICAgICMKICAgICMKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRhdGEoLXBhcmVudCkgLl19IHsKCXNldCB3ICRkYXRhKC1wYXJlbnQpLl9fdGtfX21lc3NhZ2Vib3gKICAgIH0gZWxzZSB7CglzZXQgdyAuX190a19fbWVzc2FnZWJveAogICAgfQoKICAgICMgMy4gQ3JlYXRlIHRoZSB0b3AtbGV2ZWwgd2luZG93IGFuZCBkaXZpZGUgaXQgaW50byB0b3AKICAgICMgYW5kIGJvdHRvbSBwYXJ0cy4KCiAgICBjYXRjaCB7ZGVzdHJveSAkd30KICAgIHRvcGxldmVsICR3IC1jbGFzcyBEaWFsb2cKICAgIHdtIHRpdGxlICR3ICRkYXRhKC10aXRsZSkKICAgIHdtIGljb25uYW1lICR3IERpYWxvZwogICAgd20gcHJvdG9jb2wgJHcgV01fREVMRVRFX1dJTkRPVyB7IH0KICAgIHdtIHRyYW5zaWVudCAkdyAkZGF0YSgtcGFyZW50KQogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7Cgl1bnN1cHBvcnRlZDEgc3R5bGUgJHcgZEJveFByb2MKICAgIH0KCiAgICBmcmFtZSAkdy5ib3QKICAgIHBhY2sgJHcuYm90IC1zaWRlIGJvdHRvbSAtZmlsbCBib3RoCiAgICBmcmFtZSAkdy50b3AKICAgIHBhY2sgJHcudG9wIC1zaWRlIHRvcCAtZmlsbCBib3RoIC1leHBhbmQgMQogICAgaWYge1tzdHJpbmcgY29tcGFyZSAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKCSR3LmJvdCBjb25maWd1cmUgLXJlbGllZiByYWlzZWQgLWJkIDEKCSR3LnRvcCBjb25maWd1cmUgLXJlbGllZiByYWlzZWQgLWJkIDEKICAgIH0KCiAgICAjIDQuIEZpbGwgdGhlIHRvcCBwYXJ0IHdpdGggYml0bWFwIGFuZCBtZXNzYWdlICh1c2UgdGhlIG9wdGlvbgogICAgIyBkYXRhYmFzZSBmb3IgLXdyYXBsZW5ndGggYW5kIC1mb250IHNvIHRoYXQgdGhleSBjYW4gYmUKICAgICMgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyKS4KCiAgICBvcHRpb24gYWRkICpEaWFsb2cubXNnLndyYXBMZW5ndGggM2kgd2lkZ2V0RGVmYXVsdAogICAgaWYge1tzdHJpbmcgZXF1YWwgJHRjbF9wbGF0Zm9ybShwbGF0Zm9ybSkgIm1hY2ludG9zaCJdfSB7CglvcHRpb24gYWRkICpEaWFsb2cubXNnLmZvbnQgc3lzdGVtIHdpZGdldERlZmF1bHQKICAgIH0gZWxzZSB7CglvcHRpb24gYWRkICpEaWFsb2cubXNnLmZvbnQge1RpbWVzIDE4fSB3aWRnZXREZWZhdWx0CiAgICB9CgogICAgbGFiZWwgJHcubXNnIC1qdXN0aWZ5IGxlZnQgLXRleHQgJGRhdGEoLW1lc3NhZ2UpCiAgICBwYWNrICR3Lm1zZyAtaW4gJHcudG9wIC1zaWRlIHJpZ2h0IC1leHBhbmQgMSAtZmlsbCBib3RoIC1wYWR4IDNtIC1wYWR5IDNtCiAgICBpZiB7W3N0cmluZyBjb21wYXJlICRkYXRhKC1pY29uKSAiIl19IHsKCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJtYWNpbnRvc2giXSBcCgkJfHwgKFt3aW5mbyBkZXB0aCAkd10gPCA0KSB8fCAkdGtfc3RyaWN0TW90aWZ9IHsKCSAgICBsYWJlbCAkdy5iaXRtYXAgLWJpdG1hcCAkZGF0YSgtaWNvbikKCX0gZWxzZSB7CgkgICAgY2FudmFzICR3LmJpdG1hcCAtd2lkdGggMzIgLWhlaWdodCAzMiAtaGlnaGxpZ2h0dGhpY2tuZXNzIDAKCSAgICBzd2l0Y2ggJGRhdGEoLWljb24pIHsKCQllcnJvciB7CgkJICAgICR3LmJpdG1hcCBjcmVhdGUgb3ZhbCAwIDAgMzEgMzEgLWZpbGwgcmVkIC1vdXRsaW5lIGJsYWNrCgkJICAgICR3LmJpdG1hcCBjcmVhdGUgbGluZSA5IDkgMjMgMjMgLWZpbGwgd2hpdGUgLXdpZHRoIDQKCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBsaW5lIDkgMjMgMjMgOSAtZmlsbCB3aGl0ZSAtd2lkdGggNAoJCX0KCQlpbmZvIHsKCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcCgkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjpiMQoJCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwKCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OmIyCgkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXAoJCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6aQoJCX0KCQlxdWVzdGlvbiB7CgkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXAoJCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6YjEKCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcCgkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjpiMgoJCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwKCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OnEKCQl9CgkJZGVmYXVsdCB7CgkJICAgICR3LmJpdG1hcCBjcmVhdGUgaW1hZ2UgMCAwIC1hbmNob3IgbncgXAoJCQkgICAgLWltYWdlIDo6dGs6OmRpYWxvZzo6dzEKCQkgICAgJHcuYml0bWFwIGNyZWF0ZSBpbWFnZSAwIDAgLWFuY2hvciBudyBcCgkJCSAgICAtaW1hZ2UgOjp0azo6ZGlhbG9nOjp3MgoJCSAgICAkdy5iaXRtYXAgY3JlYXRlIGltYWdlIDAgMCAtYW5jaG9yIG53IFwKCQkJICAgIC1pbWFnZSA6OnRrOjpkaWFsb2c6OnczCgkJfQoJICAgIH0KCX0KCXBhY2sgJHcuYml0bWFwIC1pbiAkdy50b3AgLXNpZGUgbGVmdCAtcGFkeCAzbSAtcGFkeSAzbQogICAgfQoKICAgICMgNS4gQ3JlYXRlIGEgcm93IG9mIGJ1dHRvbnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZGlhbG9nLgoKICAgIHNldCBpIDAKICAgIGZvcmVhY2ggYnV0ICRidXR0b25zIHsKCXNldCBuYW1lIFtsaW5kZXggJGJ1dCAwXQoJc2V0IG9wdHMgW2xyYW5nZSAkYnV0IDEgZW5kXQoJaWYgeyFbbGxlbmd0aCAkb3B0c119IHsKCSAgICAjIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlciBvZiAkbmFtZQoJICAgIHNldCBjYXBOYW1lIFtzdHJpbmcgdG91cHBlciAkbmFtZSAwXQoJICAgIHNldCBvcHRzIFtsaXN0IC10ZXh0ICRjYXBOYW1lXQoJfQoKCWV2YWwgYnV0dG9uIFtsaXN0ICR3LiRuYW1lXSAkb3B0cyBbbGlzdCAtY29tbWFuZCBbbGlzdCBzZXQgdGtQcml2KGJ1dHRvbikgJG5hbWVdXQoKCWlmIHtbc3RyaW5nIGVxdWFsICRuYW1lICRkYXRhKC1kZWZhdWx0KV19IHsKCSAgICAkdy4kbmFtZSBjb25maWd1cmUgLWRlZmF1bHQgYWN0aXZlCgl9CglwYWNrICR3LiRuYW1lIC1pbiAkdy5ib3QgLXNpZGUgbGVmdCAtZXhwYW5kIDEgLXBhZHggM20gLXBhZHkgMm0KCgkjIGNyZWF0ZSB0aGUgYmluZGluZyBmb3IgdGhlIGtleSBhY2NlbGVyYXRvciwgYmFzZWQgb24gdGhlIHVuZGVybGluZQoJIwoJc2V0IHVuZGVySWR4IFskdy4kbmFtZSBjZ2V0IC11bmRlcl0KCWlmIHskdW5kZXJJZHggPj0gMH0gewoJICAgIHNldCBrZXkgW3N0cmluZyBpbmRleCBbJHcuJG5hbWUgY2dldCAtdGV4dF0gJHVuZGVySWR4XQoJICAgIGJpbmQgJHcgPEFsdC1bc3RyaW5nIHRvbG93ZXIgJGtleV0+ICBbbGlzdCAkdy4kbmFtZSBpbnZva2VdCgkgICAgYmluZCAkdyA8QWx0LVtzdHJpbmcgdG91cHBlciAka2V5XT4gIFtsaXN0ICR3LiRuYW1lIGludm9rZV0KCX0KCWluY3IgaQogICAgfQoKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUge30gJGRhdGEoLWRlZmF1bHQpXX0gewoJYmluZCAkdyA8Rm9jdXNJbj4gewoJICAgIGlmIHtbc3RyaW5nIGVxdWFsIEJ1dHRvbiBbd2luZm8gY2xhc3MgJVddXX0gewoJCSVXIGNvbmZpZ3VyZSAtZGVmYXVsdCBhY3RpdmUKCSAgICB9Cgl9CgliaW5kICR3IDxGb2N1c091dD4gewoJICAgIGlmIHtbc3RyaW5nIGVxdWFsIEJ1dHRvbiBbd2luZm8gY2xhc3MgJVddXX0gewoJCSVXIGNvbmZpZ3VyZSAtZGVmYXVsdCBub3JtYWwKCSAgICB9Cgl9CiAgICB9CgogICAgIyA2LiBDcmVhdGUgYSBiaW5kaW5nIGZvciA8UmV0dXJuPiBvbiB0aGUgZGlhbG9nCgogICAgYmluZCAkdyA8UmV0dXJuPiB7CglpZiB7W3N0cmluZyBlcXVhbCBCdXR0b24gW3dpbmZvIGNsYXNzICVXXV19IHsKCSAgICB0a0J1dHRvbkludm9rZSAlVwoJfQogICAgfQoKICAgICMgNy4gV2l0aGRyYXcgdGhlIHdpbmRvdywgdGhlbiB1cGRhdGUgYWxsIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbgogICAgIyBzbyB3ZSBrbm93IGhvdyBiaWcgaXQgd2FudHMgdG8gYmUsIHRoZW4gY2VudGVyIHRoZSB3aW5kb3cgaW4gdGhlCiAgICAjIGRpc3BsYXkgYW5kIGRlLWljb25pZnkgaXQuCgogICAgOjp0azo6UGxhY2VXaW5kb3cgJHcgd2lkZ2V0ICRkYXRhKC1wYXJlbnQpCgogICAgIyA4LiBTZXQgYSBncmFiIGFuZCBjbGFpbSB0aGUgZm9jdXMgdG9vLgoKICAgIGlmIHtbc3RyaW5nIGNvbXBhcmUgJGRhdGEoLWRlZmF1bHQpICIiXX0gewoJc2V0IGZvY3VzICR3LiRkYXRhKC1kZWZhdWx0KQogICAgfSBlbHNlIHsKCXNldCBmb2N1cyAkdwogICAgfQogICAgOjp0azo6U2V0Rm9jdXNHcmFiICR3ICRmb2N1cwoKICAgICMgOS4gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcmVzcG9uZCwgdGhlbiByZXN0b3JlIHRoZSBmb2N1cyBhbmQKICAgICMgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYnV0dG9uLiAgUmVzdG9yZSB0aGUgZm9jdXMKICAgICMgYmVmb3JlIGRlbGV0aW5nIHRoZSB3aW5kb3csIHNpbmNlIG90aGVyd2lzZSB0aGUgd2luZG93IG1hbmFnZXIKICAgICMgbWF5IHRha2UgdGhlIGZvY3VzIGF3YXkgc28gd2UgY2FuJ3QgcmVkaXJlY3QgaXQuICBGaW5hbGx5LAogICAgIyByZXN0b3JlIGFueSBncmFiIHRoYXQgd2FzIGluIGVmZmVjdC4KCiAgICB0a3dhaXQgdmFyaWFibGUgdGtQcml2KGJ1dHRvbikKCiAgICA6OnRrOjpSZXN0b3JlRm9jdXNHcmFiICR3ICRmb2N1cwoKICAgIHJldHVybiAkdGtQcml2KGJ1dHRvbikKfQoAABwBIyBjb21kbGcudGNsIC0tCiMKIwlTb21lIGZ1bmN0aW9ucyBuZWVkZWQgZm9yIHRoZSBjb21tb24gZGlhbG9nIGJveGVzLiBQcm9iYWJseSBuZWVkIHRvIGdvCiMJaW4gYSBkaWZmZXJlbnQgZmlsZS4KIwojIFJDUzogQCgjKSAkSWQ6IGNvbWRsZy50Y2wsdiAxLjYgMTk5OS8xMi8wNyAwMzowNDo0MyBob2JicyBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTk2IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCiMgdGNsUGFyc2VDb25maWdTcGVjIC0tCiMKIwlQYXJzZXMgYSBsaXN0IG9mICItb3B0aW9uIHZhbHVlIiBwYWlycy4gSWYgYWxsIG9wdGlvbnMgYW5kCiMJdmFsdWVzIGFyZSBsZWdhbCwgdGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluCiMJJGRhdGEoJG9wdGlvbikuIE90aGVyd2lzZSBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLiBXaGVuCiMJYW4gZXJyb3IgaGFwcGVucywgdGhlIGRhdGEoKSBhcnJheSBtYXkgaGF2ZSBiZWVuIHBhcnRpYWxseQojCW1vZGlmaWVkLCBidXQgYWxsIHRoZSBtb2RpZmllZCBtZW1iZXJzIG9mIHRoZSBkYXRhKDAgYXJyYXkgYXJlCiMJZ3VhcmFudGVlZCB0byBoYXZlIHZhbGlkIHZhbHVlcy4gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbgojCVRrX0NvbmZpZ3VyZVdpZGdldCgpIHdoaWNoIGRvZXMgbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgYQojCXdpZGdldCByZWNvcmQgaWYgYW55IGVycm9yIG9jY3Vycy4KIwojIEFyZ3VtZW50czoKIwojIHcgPSB3aWRnZXQgcmVjb3JkIHRvIG1vZGlmeS4gTXVzdCBiZSB0aGUgcGF0aG5hbWUgb2YgYSB3aWRnZXQuCiMKIyBzcGVjcyA9IHsKIyAgICB7LWNvbW1hbmRsaW5lc3dpdGNoIHJlc291cmNlTmFtZSBSZXNvdXJjZUNsYXNzIGRlZmF1bHRWYWx1ZSB2ZXJpZmllcn0KIyAgICB7Li4uLn0KIyB9CiMKIyBmbGFncyA9IGN1cnJlbnRseSB1bnVzZWQuCiMKIyBhcmdMaXN0ID0gVGhlIGxpc3Qgb2YgICItb3B0aW9uIHZhbHVlIiBwYWlycy4KIwpwcm9jIHRjbFBhcnNlQ29uZmlnU3BlYyB7dyBzcGVjcyBmbGFncyBhcmdMaXN0fSB7CiAgICB1cHZhciAjMCAkdyBkYXRhCgogICAgIyAxOiBQdXQgdGhlIHNwZWNzIGluIGFzc29jaWF0aXZlIGFycmF5cyBmb3IgZmFzdGVyIGFjY2VzcwogICAgIwogICAgZm9yZWFjaCBzcGVjICRzcGVjcyB7CglpZiB7W2xsZW5ndGggJHNwZWNdIDwgNH0gewoJICAgIGVycm9yICJcInNwZWNcIiBzaG91bGQgY29udGFpbiA1IG9yIDQgZWxlbWVudHMiCgl9CglzZXQgY21kc3cgW2xpbmRleCAkc3BlYyAwXQoJc2V0IGNtZCgkY21kc3cpICIiCglzZXQgcm5hbWUoJGNtZHN3KSAgIFtsaW5kZXggJHNwZWMgMV0KCXNldCByY2xhc3MoJGNtZHN3KSAgW2xpbmRleCAkc3BlYyAyXQoJc2V0IGRlZigkY21kc3cpICAgICBbbGluZGV4ICRzcGVjIDNdCglzZXQgdmVycHJvYygkY21kc3cpIFtsaW5kZXggJHNwZWMgNF0KICAgIH0KCiAgICBpZiB7W2xsZW5ndGggJGFyZ0xpc3RdICYgMX0gewoJc2V0IGNtZHN3IFtsaW5kZXggJGFyZ0xpc3QgZW5kXQoJaWYgeyFbaW5mbyBleGlzdHMgY21kKCRjbWRzdyldfSB7CgkgICAgZXJyb3IgImJhZCBvcHRpb24gXCIkY21kc3dcIjogbXVzdCBiZSBbdGNsTGlzdFZhbGlkRmxhZ3MgY21kXSIKCX0KCWVycm9yICJ2YWx1ZSBmb3IgXCIkY21kc3dcIiBtaXNzaW5nIgogICAgfQoKICAgICMgMjogc2V0IHRoZSBkZWZhdWx0IHZhbHVlcwogICAgIwogICAgZm9yZWFjaCBjbWRzdyBbYXJyYXkgbmFtZXMgY21kXSB7CglzZXQgZGF0YSgkY21kc3cpICRkZWYoJGNtZHN3KQogICAgfQoKICAgICMgMzogcGFyc2UgdGhlIGFyZ3VtZW50IGxpc3QKICAgICMKICAgIGZvcmVhY2gge2NtZHN3IHZhbHVlfSAkYXJnTGlzdCB7CglpZiB7IVtpbmZvIGV4aXN0cyBjbWQoJGNtZHN3KV19IHsKCSAgICBlcnJvciAiYmFkIG9wdGlvbiBcIiRjbWRzd1wiOiBtdXN0IGJlIFt0Y2xMaXN0VmFsaWRGbGFncyBjbWRdIgoJfQoJc2V0IGRhdGEoJGNtZHN3KSAkdmFsdWUKICAgIH0KCiAgICAjIERvbmUhCn0KCnByb2MgdGNsTGlzdFZhbGlkRmxhZ3Mge3Z9IHsKICAgIHVwdmFyICR2IGNtZAoKICAgIHNldCBsZW4gW2xsZW5ndGggW2FycmF5IG5hbWVzIGNtZF1dCiAgICBzZXQgaSAxCiAgICBzZXQgc2VwYXJhdG9yICIiCiAgICBzZXQgZXJyb3Jtc2cgIiIKICAgIGZvcmVhY2ggY21kc3cgW2xzb3J0IFthcnJheSBuYW1lcyBjbWRdXSB7CglhcHBlbmQgZXJyb3Jtc2cgIiRzZXBhcmF0b3IkY21kc3ciCglpbmNyIGkKCWlmIHskaSA9PSAkbGVufSB7CgkgICAgc2V0IHNlcGFyYXRvciAiLCBvciAiCgl9IGVsc2UgewoJICAgIHNldCBzZXBhcmF0b3IgIiwgIgoJfQogICAgfQogICAgcmV0dXJuICRlcnJvcm1zZwp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMJCQlGb2N1cyBHcm91cAojCiMgRm9jdXMgZ3JvdXBzIGFyZSB1c2VkIHRvIGhhbmRsZSB0aGUgdXNlcidzIGZvY3VzaW5nIGFjdGlvbnMgaW5zaWRlIGEKIyB0b3BsZXZlbC4KIwojIE9uZSBleGFtcGxlIG9mIHVzaW5nIGZvY3VzIGdyb3VwcyBpczogd2hlbiB0aGUgdXNlciBmb2N1c2VzIG9uIGFuCiMgZW50cnksIHRoZSB0ZXh0IGluIHRoZSBlbnRyeSBpcyBoaWdobGlnaHRlZCBhbmQgdGhlIGN1cnNvciBpcyBwdXQgdG8KIyB0aGUgZW5kIG9mIHRoZSB0ZXh0LiBXaGVuIHRoZSB1c2VyIGNoYW5nZXMgZm9jdXMgdG8gYW5vdGhlciB3aWRnZXQsCiMgdGhlIHRleHQgaW4gdGhlIHByZXZpb3VzbHkgZm9jdXNlZCBlbnRyeSBpcyB2YWxpZGF0ZWQuCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojIHRrRm9jdXNHcm91cF9DcmVhdGUgLS0KIwojCUNyZWF0ZSBhIGZvY3VzIGdyb3VwLiBBbGwgdGhlIHdpZGdldHMgaW4gYSBmb2N1cyBncm91cCBtdXN0IGJlCiMJd2l0aGluIHRoZSBzYW1lIGZvY3VzIHRvcGxldmVsLiBFYWNoIHRvcGxldmVsIGNhbiBoYXZlIG9ubHkKIwlvbmUgZm9jdXMgZ3JvdXAsIHdoaWNoIGlzIGlkZW50aWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlCiMJdG9wbGV2ZWwgd2lkZ2V0LgojCnByb2MgdGtGb2N1c0dyb3VwX0NyZWF0ZSB7dH0gewogICAgZ2xvYmFsIHRrUHJpdgogICAgaWYge1tzdHJpbmcgY29tcGFyZSBbd2luZm8gdG9wbGV2ZWwgJHRdICR0XX0gewoJZXJyb3IgIiR0IGlzIG5vdCBhIHRvcGxldmVsIHdpbmRvdyIKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7CglzZXQgdGtQcml2KGZnLCR0KSAxCglzZXQgdGtQcml2KGZvY3VzLCR0KSAiIgoJYmluZCAkdCA8Rm9jdXNJbj4gIFtsaXN0IHRrRm9jdXNHcm91cF9JbiAgJHQgJVcgJWRdCgliaW5kICR0IDxGb2N1c091dD4gW2xpc3QgdGtGb2N1c0dyb3VwX091dCAkdCAlVyAlZF0KCWJpbmQgJHQgPERlc3Ryb3k+ICBbbGlzdCB0a0ZvY3VzR3JvdXBfRGVzdHJveSAkdCAlV10KICAgIH0KfQoKIyB0a0ZvY3VzR3JvdXBfQmluZEluIC0tCiMKIyBBZGQgYSB3aWRnZXQgaW50byB0aGUgIkZvY3VzSW4iIGxpc3Qgb2YgdGhlIGZvY3VzIGdyb3VwLiBUaGUgJGNtZCB3aWxsIGJlCiMgY2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBmb2N1c2VkIG9uIGJ5IHRoZSB1c2VyLgojCnByb2MgdGtGb2N1c0dyb3VwX0JpbmRJbiB7dCB3IGNtZH0gewogICAgZ2xvYmFsIHRrRm9jdXNJbiB0a1ByaXYKICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7CgllcnJvciAiZm9jdXMgZ3JvdXAgXCIkdFwiIGRvZXNuJ3QgZXhpc3QiCiAgICB9CiAgICBzZXQgdGtGb2N1c0luKCR0LCR3KSAkY21kCn0KCgojIHRrRm9jdXNHcm91cF9CaW5kT3V0IC0tCiMKIwlBZGQgYSB3aWRnZXQgaW50byB0aGUgIkZvY3VzT3V0IiBsaXN0IG9mIHRoZSBmb2N1cyBncm91cC4gVGhlCiMJJGNtZCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSB3aWRnZXQgbG9zZXMgdGhlIGZvY3VzIChVc2VyCiMJdHlwZXMgVGFiIG9yIGNsaWNrIG9uIGFub3RoZXIgd2lkZ2V0KS4KIwpwcm9jIHRrRm9jdXNHcm91cF9CaW5kT3V0IHt0IHcgY21kfSB7CiAgICBnbG9iYWwgdGtGb2N1c091dCB0a1ByaXYKICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmZywkdCldfSB7CgllcnJvciAiZm9jdXMgZ3JvdXAgXCIkdFwiIGRvZXNuJ3QgZXhpc3QiCiAgICB9CiAgICBzZXQgdGtGb2N1c091dCgkdCwkdykgJGNtZAp9CgojIHRrRm9jdXNHcm91cF9EZXN0cm95IC0tCiMKIwlDbGVhbnMgdXAgd2hlbiBtZW1iZXJzIG9mIHRoZSBmb2N1cyBncm91cCBpcyBkZWxldGVkLCBvciB3aGVuIHRoZQojCXRvcGxldmVsIGl0c2VsZiBnZXRzIGRlbGV0ZWQuCiMKcHJvYyB0a0ZvY3VzR3JvdXBfRGVzdHJveSB7dCB3fSB7CiAgICBnbG9iYWwgdGtQcml2IHRrRm9jdXNJbiB0a0ZvY3VzT3V0CgogICAgaWYge1tzdHJpbmcgZXF1YWwgJHQgJHddfSB7Cgl1bnNldCB0a1ByaXYoZmcsJHQpCgl1bnNldCB0a1ByaXYoZm9jdXMsJHQpIAoKCWZvcmVhY2ggbmFtZSBbYXJyYXkgbmFtZXMgdGtGb2N1c0luICR0LCpdIHsKCSAgICB1bnNldCB0a0ZvY3VzSW4oJG5hbWUpCgl9Cglmb3JlYWNoIG5hbWUgW2FycmF5IG5hbWVzIHRrRm9jdXNPdXQgJHQsKl0gewoJICAgIHVuc2V0IHRrRm9jdXNPdXQoJG5hbWUpCgl9CiAgICB9IGVsc2UgewoJaWYge1tpbmZvIGV4aXN0cyB0a1ByaXYoZm9jdXMsJHQpXSAmJiBcCgkJW3N0cmluZyBlcXVhbCAkdGtQcml2KGZvY3VzLCR0KSAkd119IHsKCSAgICBzZXQgdGtQcml2KGZvY3VzLCR0KSAiIgoJfQoJY2F0Y2ggewoJICAgIHVuc2V0IHRrRm9jdXNJbigkdCwkdykKCX0KCWNhdGNoIHsKCSAgICB1bnNldCB0a0ZvY3VzT3V0KCR0LCR3KQoJfQogICAgfQp9CgojIHRrRm9jdXNHcm91cF9JbiAtLQojCiMJSGFuZGxlcyB0aGUgPEZvY3VzSW4+IGV2ZW50LiBDYWxscyB0aGUgRm9jdXNJbiBjb21tYW5kIGZvciB0aGUgbmV3bHkKIwlmb2N1c2VkIHdpZGdldCBpbiB0aGUgZm9jdXMgZ3JvdXAuCiMKcHJvYyB0a0ZvY3VzR3JvdXBfSW4ge3QgdyBkZXRhaWx9IHsKICAgIGdsb2JhbCB0a1ByaXYgdGtGb2N1c0luCgogICAgaWYgeyFbaW5mbyBleGlzdHMgdGtGb2N1c0luKCR0LCR3KV19IHsKCXNldCB0a0ZvY3VzSW4oJHQsJHcpICIiCglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmb2N1cywkdCldfSB7CglyZXR1cm4KICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0a1ByaXYoZm9jdXMsJHQpICR3XX0gewoJIyBUaGlzIGlzIGFscmVhZHkgaW4gZm9jdXMKCSMKCXJldHVybgogICAgfSBlbHNlIHsKCXNldCB0a1ByaXYoZm9jdXMsJHQpICR3CglldmFsICR0a0ZvY3VzSW4oJHQsJHcpCiAgICB9Cn0KCiMgdGtGb2N1c0dyb3VwX091dCAtLQojCiMJSGFuZGxlcyB0aGUgPEZvY3VzT3V0PiBldmVudC4gQ2hlY2tzIGlmIHRoaXMgaXMgcmVhbGx5IGEgbG9zZQojCWZvY3VzIGV2ZW50LCBub3Qgb25lIGdlbmVyYXRlZCBieSB0aGUgbW91c2UgbW92aW5nIG91dCBvZiB0aGUKIwl0b3BsZXZlbCB3aW5kb3cuICBDYWxscyB0aGUgRm9jdXNPdXQgY29tbWFuZCBmb3IgdGhlIHdpZGdldAojCXdobyBsb3NlcyBpdHMgZm9jdXMuCiMKcHJvYyB0a0ZvY3VzR3JvdXBfT3V0IHt0IHcgZGV0YWlsfSB7CiAgICBnbG9iYWwgdGtQcml2IHRrRm9jdXNPdXQKCiAgICBpZiB7W3N0cmluZyBjb21wYXJlICRkZXRhaWwgTm90aWZ5Tm9ubGluZWFyXSAmJgoJW3N0cmluZyBjb21wYXJlICRkZXRhaWwgTm90aWZ5Tm9ubGluZWFyVmlydHVhbF19IHsKCSMgVGhpcyBpcyBjYXVzZWQgYnkgbW91c2UgbW92aW5nIG91dCBvZiB0aGUgd2luZG93CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRrUHJpdihmb2N1cywkdCldfSB7CglyZXR1cm4KICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIHRrRm9jdXNPdXQoJHQsJHcpXX0gewoJcmV0dXJuCiAgICB9IGVsc2UgewoJZXZhbCAkdGtGb2N1c091dCgkdCwkdykKCXNldCB0a1ByaXYoZm9jdXMsJHQpICIiCiAgICB9Cn0KCiMgdGtGREdldEZpbGVUeXBlcyAtLQojCiMJUHJvY2VzcyB0aGUgc3RyaW5nIGdpdmVuIGJ5IHRoZSAtZmlsZXR5cGVzIG9wdGlvbiBvZiB0aGUgZmlsZQojCWRpYWxvZ3MuIFNpbWlsYXIgdG8gdGhlIEMgZnVuY3Rpb24gVGtHZXRGaWxlRmlsdGVycygpIG9uIHRoZSBNYWMKIwlhbmQgV2luZG93cyBwbGF0Zm9ybS4KIwpwcm9jIHRrRkRHZXRGaWxlVHlwZXMge3N0cmluZ30gewogICAgZm9yZWFjaCB0ICRzdHJpbmcgewoJaWYge1tsbGVuZ3RoICR0XSA8IDIgfHwgW2xsZW5ndGggJHRdID4gM30gewoJICAgIGVycm9yICJiYWQgZmlsZSB0eXBlIFwiJHRcIiwgc2hvdWxkIGJlIFwidHlwZU5hbWUge2V4dGVuc2lvbiA/ZXh0ZW5zaW9ucyAuLi4/fSA/e21hY1R5cGUgP21hY1R5cGVzIC4uLj99P1wiIgoJfQoJZXZhbCBsYXBwZW5kIFtsaXN0IGZpbGVUeXBlcyhbbGluZGV4ICR0IDBdKV0gW2xpbmRleCAkdCAxXQogICAgfQoKICAgIHNldCB0eXBlcyB7fQogICAgZm9yZWFjaCB0ICRzdHJpbmcgewoJc2V0IGxhYmVsIFtsaW5kZXggJHQgMF0KCXNldCBleHRzIHt9CgoJaWYge1tpbmZvIGV4aXN0cyBoYXNEb25lVHlwZSgkbGFiZWwpXX0gewoJICAgIGNvbnRpbnVlCgl9CgoJc2V0IG5hbWUgIiRsYWJlbCAoIgoJc2V0IHNlcCAiIgoJZm9yZWFjaCBleHQgJGZpbGVUeXBlcygkbGFiZWwpIHsKCSAgICBpZiB7W3N0cmluZyBlcXVhbCAkZXh0ICIiXX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIHJlZ3N1YiB7XlsuXX0gJGV4dCAiKi4iIGV4dAoJICAgIGlmIHshW2luZm8gZXhpc3RzIGhhc0dvdEV4dCgkbGFiZWwsJGV4dCldfSB7CgkJYXBwZW5kIG5hbWUgJHNlcCRleHQKCQlsYXBwZW5kIGV4dHMgJGV4dAoJCXNldCBoYXNHb3RFeHQoJGxhYmVsLCRleHQpIDEKCSAgICB9CgkgICAgc2V0IHNlcCAsCgl9CglhcHBlbmQgbmFtZSAiKSIKCWxhcHBlbmQgdHlwZXMgW2xpc3QgJG5hbWUgJGV4dHNdCgoJc2V0IGhhc0RvbmVUeXBlKCRsYWJlbCkgMQogICAgfQoKICAgIHJldHVybiAkdHlwZXMKfQoAAEL9IyBpbml0LnRjbCAtLQojCiMgRGVmYXVsdCBzeXN0ZW0gc3RhcnR1cCBmaWxlIGZvciBUY2wtYmFzZWQgYXBwbGljYXRpb25zLiAgRGVmaW5lcwojICJ1bmtub3duIiBwcm9jZWR1cmUgYW5kIGF1dG8tbG9hZCBmYWNpbGl0aWVzLgojCiMgUkNTOiBAKCMpICRJZDogaW5pdC50Y2wsdiAxLjM5IDIwMDAvMDIvMDEgMTk6MjY6MDggZXJpY20gRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTYgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgojIENvcHlyaWdodCAoYykgMTk5OC0xOTk5IFNjcmlwdGljcyBDb3Jwb3JhdGlvbi4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCmlmIHtbaW5mbyBjb21tYW5kcyBwYWNrYWdlXSA9PSAiIn0gewogICAgZXJyb3IgInZlcnNpb24gbWlzbWF0Y2g6IGxpYnJhcnlcbnNjcmlwdHMgZXhwZWN0IFRjbCB2ZXJzaW9uIDcuNWIxIG9yIGxhdGVyIGJ1dCB0aGUgbG9hZGVkIHZlcnNpb24gaXNcbm9ubHkgW2luZm8gcGF0Y2hsZXZlbF0iCn0KcGFja2FnZSByZXF1aXJlIC1leGFjdCBUY2wgOC4zCgojIENvbXB1dGUgdGhlIGF1dG8gcGF0aCB0byB1c2UgaW4gdGhpcyBpbnRlcnByZXRlci4KIyBUaGUgdmFsdWVzIG9uIHRoZSBwYXRoIGNvbWUgZnJvbSBzZXZlcmFsIGxvY2F0aW9uczoKIwojIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBUQ0xMSUJQQVRICiMKIyB0Y2xfbGlicmFyeSwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgaW5pdC50Y2wgc2NyaXB0LgojIHRjbEluaXRTY3JpcHQuaCBzZWFyY2hlcyBhcm91bmQgZm9yIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzCiMgaW5pdC50Y2wgYW5kIGRlZmluZXMgdGNsX2xpYnJhcnkgdG8gdGhhdCBsb2NhdGlvbiBiZWZvcmUgc291cmNpbmcgaXQuCiMKIyBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0Y2xfbGlicmFyeS4gQWRkaW5nIHRoZSBwYXJlbnQKIyBtZWFucyB0aGF0IHBhY2thZ2VzIGluIHBlZXIgZGlyZWN0b3JpZXMgd2lsbCBiZSBmb3VuZCBhdXRvbWF0aWNhbGx5LgojCiMgQWxzbyBhZGQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLCBwbHVzIC4uL2xpYgojIHJlbGF0aXZlIHRvIHRoYXQgcGF0aC4KIwojIHRjbF9wa2dQYXRoLCB3aGljaCBpcyBzZXQgYnkgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzCiMJT24gVU5JWCBpdCBpcyBjb21waWxlZCBpbgojICAgICAgIE9uIFdpbmRvd3MsIGl0IGlzIG5vdCB1c2VkCiMJT24gTWFjaW50b3NoIGl0IGlzICJUb29sIENvbW1hbmQgTGFuZ3VhZ2UiIGluIHRoZSBFeHRlbnNpb25zIGZvbGRlcgoKaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gewogICAgaWYge1tpbmZvIGV4aXN0IGVudihUQ0xMSUJQQVRIKV19IHsKCXNldCBhdXRvX3BhdGggJGVudihUQ0xMSUJQQVRIKQogICAgfSBlbHNlIHsKCXNldCBhdXRvX3BhdGggIiIKICAgIH0KfQppZiB7W3N0cmluZyBjb21wYXJlIFtpbmZvIGxpYnJhcnldIHt9XX0gewogICAgZm9yZWFjaCBfX2RpciBbbGlzdCBbaW5mbyBsaWJyYXJ5XSBbZmlsZSBkaXJuYW1lIFtpbmZvIGxpYnJhcnldXV0gewoJaWYge1tsc2VhcmNoIC1leGFjdCAkYXV0b19wYXRoICRfX2Rpcl0gPCAwfSB7CgkgICAgbGFwcGVuZCBhdXRvX3BhdGggJF9fZGlyCgl9CiAgICB9Cn0Kc2V0IF9fZGlyIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFwKCVtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXV0gbGliXQppZiB7W2xzZWFyY2ggLWV4YWN0ICRhdXRvX3BhdGggJF9fZGlyXSA8IDB9IHsKICAgIGxhcHBlbmQgYXV0b19wYXRoICRfX2Rpcgp9CmlmIHtbaW5mbyBleGlzdCB0Y2xfcGtnUGF0aF19IHsKICAgIGZvcmVhY2ggX19kaXIgJHRjbF9wa2dQYXRoIHsKCWlmIHtbbHNlYXJjaCAtZXhhY3QgJGF1dG9fcGF0aCAkX19kaXJdIDwgMH0gewoJICAgIGxhcHBlbmQgYXV0b19wYXRoICRfX2RpcgoJfQogICAgfQp9CmlmIHtbaW5mbyBleGlzdHMgX19kaXJdfSB7CiAgICB1bnNldCBfX2Rpcgp9CiAgCiMgV2luZG93cyBzcGVjaWZpYyBlbmQgb2YgaW5pdGlhbGl6YXRpb24KCmlmIHsoIVtpbnRlcnAgaXNzYWZlXSkgJiYgW3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAid2luZG93cyJdfSB7CiAgICBuYW1lc3BhY2UgZXZhbCB0Y2wgewoJcHJvYyBlbnZUcmFjZVByb2Mge2xvIG4xIG4yIG9wfSB7CgkgICAgc2V0IHggJDo6ZW52KCRuMikKCSAgICBzZXQgOjplbnYoJGxvKSAkeAoJICAgIHNldCA6OmVudihbc3RyaW5nIHRvdXBwZXIgJGxvXSkgJHgKCX0KICAgIH0KICAgIGZvcmVhY2ggcCBbYXJyYXkgbmFtZXMgZW52XSB7CglzZXQgdSBbc3RyaW5nIHRvdXBwZXIgJHBdCglpZiB7W3N0cmluZyBjb21wYXJlICR1ICRwXX0gewoJICAgIHN3aXRjaCAtLSAkdSB7CgkJQ09NU1BFQyAtCgkJUEFUSCB7CgkJICAgIGlmIHshW2luZm8gZXhpc3RzIGVudigkdSldfSB7CgkJCXNldCBlbnYoJHUpICRlbnYoJHApCgkJICAgIH0KCQkgICAgdHJhY2UgdmFyaWFibGUgZW52KCRwKSB3IFtsaXN0IHRjbDo6ZW52VHJhY2VQcm9jICRwXQoJCSAgICB0cmFjZSB2YXJpYWJsZSBlbnYoJHUpIHcgW2xpc3QgdGNsOjplbnZUcmFjZVByb2MgJHBdCgkJfQoJICAgIH0KCX0KICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgcF19IHsKCXVuc2V0IHAKICAgIH0KICAgIGlmIHtbaW5mbyBleGlzdHMgdV19IHsKCXVuc2V0IHUKICAgIH0KICAgIGlmIHshW2luZm8gZXhpc3RzIGVudihDT01TUEVDKV19IHsKCWlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ob3MpICJXaW5kb3dzIE5UIl19IHsKCSAgICBzZXQgZW52KENPTVNQRUMpIGNtZC5leGUKCX0gZWxzZSB7CgkgICAgc2V0IGVudihDT01TUEVDKSBjb21tYW5kLmNvbQoJfQogICAgfQp9CgojIFNldHVwIHRoZSB1bmtub3duIHBhY2thZ2UgaGFuZGxlcgoKcGFja2FnZSB1bmtub3duIHRjbFBrZ1Vua25vd24KCiMgQ29uZGl0aW9uYWxpemUgZm9yIHByZXNlbmNlIG9mIGV4ZWMuCgppZiB7W2xsZW5ndGggW2luZm8gY29tbWFuZHMgZXhlY11dID09IDB9IHsKCiAgICAjIFNvbWUgbWFjaGluZXMsIHN1Y2ggYXMgdGhlIE1hY2ludG9zaCwgZG8gbm90IGhhdmUgZXhlYy4gQWxzbywgb24gYWxsCiAgICAjIHBsYXRmb3Jtcywgc2FmZSBpbnRlcnByZXRlcnMgZG8gbm90IGhhdmUgZXhlYy4KCiAgICBzZXQgYXV0b19ub2V4ZWMgMQp9CnNldCBlcnJvckNvZGUgIiIKc2V0IGVycm9ySW5mbyAiIgoKIyBEZWZpbmUgYSBsb2cgY29tbWFuZCAod2hpY2ggY2FuIGJlIG92ZXJ3aXR0ZW4gdG8gbG9nIGVycm9ycwojIGRpZmZlcmVudGx5LCBzcGVjaWFsbHkgd2hlbiBzdGRlcnIgaXMgbm90IGF2YWlsYWJsZSkKCmlmIHtbbGxlbmd0aCBbaW5mbyBjb21tYW5kcyB0Y2xMb2ddXSA9PSAwfSB7CiAgICBwcm9jIHRjbExvZyB7c3RyaW5nfSB7CgljYXRjaCB7cHV0cyBzdGRlcnIgJHN0cmluZ30KICAgIH0KfQoKIyB1bmtub3duIC0tCiMgVGhpcyBwcm9jZWR1cmUgaXMgY2FsbGVkIHdoZW4gYSBUY2wgY29tbWFuZCBpcyBpbnZva2VkIHRoYXQgZG9lc24ndAojIGV4aXN0IGluIHRoZSBpbnRlcnByZXRlci4gIEl0IHRha2VzIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gbWFrZSB0aGUKIyBjb21tYW5kIGF2YWlsYWJsZToKIwojCTEuIFNlZSBpZiB0aGUgY29tbWFuZCBoYXMgdGhlIGZvcm0gIm5hbWVzcGFjZSBpbnNjb3BlIG5zIGNtZCIgYW5kCiMJICAgaWYgc28sIGNvbmNhdGVuYXRlIGl0cyBhcmd1bWVudHMgb250byB0aGUgZW5kIGFuZCBldmFsdWF0ZSBpdC4KIwkyLiBTZWUgaWYgdGhlIGF1dG9sb2FkIGZhY2lsaXR5IGNhbiBsb2NhdGUgdGhlIGNvbW1hbmQgaW4gYQojCSAgIFRjbCBzY3JpcHQgZmlsZS4gIElmIHNvLCBsb2FkIGl0IGFuZCBleGVjdXRlIGl0LgojCTMuIElmIHRoZSBjb21tYW5kIHdhcyBpbnZva2VkIGludGVyYWN0aXZlbHkgYXQgdG9wLWxldmVsOgojCSAgICAoYSkgc2VlIGlmIHRoZSBjb21tYW5kIGV4aXN0cyBhcyBhbiBleGVjdXRhYmxlIFVOSVggcHJvZ3JhbS4KIwkJSWYgc28sICJleGVjIiB0aGUgY29tbWFuZC4KIwkgICAgKGIpIHNlZSBpZiB0aGUgY29tbWFuZCByZXF1ZXN0cyBjc2gtbGlrZSBoaXN0b3J5IHN1YnN0aXR1dGlvbgojCQlpbiBvbmUgb2YgdGhlIGNvbW1vbiBmb3JtcyAhISwgITxudW1iZXI+LCBvciBeb2xkXm5ldy4gIElmCiMJCXNvLCBlbXVsYXRlIGNzaCdzIGhpc3Rvcnkgc3Vic3RpdHV0aW9uLgojCSAgICAoYykgc2VlIGlmIHRoZSBjb21tYW5kIGlzIGEgdW5pcXVlIGFiYnJldmlhdGlvbiBmb3IgYW5vdGhlcgojCQljb21tYW5kLiAgSWYgc28sIGludm9rZSB0aGUgY29tbWFuZC4KIwojIEFyZ3VtZW50czoKIyBhcmdzIC0JQSBsaXN0IHdob3NlIGVsZW1lbnRzIGFyZSB0aGUgd29yZHMgb2YgdGhlIG9yaWdpbmFsCiMJCWNvbW1hbmQsIGluY2x1ZGluZyB0aGUgY29tbWFuZCBuYW1lLgoKcHJvYyB1bmtub3duIGFyZ3MgewogICAgZ2xvYmFsIGF1dG9fbm9leGVjIGF1dG9fbm9sb2FkIGVudiB1bmtub3duX3BlbmRpbmcgdGNsX2ludGVyYWN0aXZlCiAgICBnbG9iYWwgZXJyb3JDb2RlIGVycm9ySW5mbwoKICAgICMgSWYgdGhlIGNvbW1hbmQgd29yZCBoYXMgdGhlIGZvcm0gIm5hbWVzcGFjZSBpbnNjb3BlIG5zIGNtZCIKICAgICMgdGhlbiBjb25jYXRlbmF0ZSBpdHMgYXJndW1lbnRzIG9udG8gdGhlIGVuZCBhbmQgZXZhbHVhdGUgaXQuCgogICAgc2V0IGNtZCBbbGluZGV4ICRhcmdzIDBdCiAgICBpZiB7W3JlZ2V4cCAiXm5hbWVzcGFjZVxbIFx0XG5cXStpbnNjb3BlIiAkY21kXSAmJiBbbGxlbmd0aCAkY21kXSA9PSA0fSB7CiAgICAgICAgc2V0IGFyZ2xpc3QgW2xyYW5nZSAkYXJncyAxIGVuZF0KCXNldCByZXQgW2NhdGNoIHt1cGxldmVsICRjbWQgJGFyZ2xpc3R9IHJlc3VsdF0KICAgICAgICBpZiB7JHJldCA9PSAwfSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0CiAgICAgICAgfSBlbHNlIHsKCSAgICByZXR1cm4gLWNvZGUgJHJldCAtZXJyb3Jjb2RlICRlcnJvckNvZGUgJHJlc3VsdAogICAgICAgIH0KICAgIH0KCiAgICAjIFNhdmUgdGhlIHZhbHVlcyBvZiBlcnJvckNvZGUgYW5kIGVycm9ySW5mbyB2YXJpYWJsZXMsIHNpbmNlIHRoZXkKICAgICMgbWF5IGdldCBtb2RpZmllZCBpZiBjYXVnaHQgZXJyb3JzIG9jY3VyIGJlbG93LiAgVGhlIHZhcmlhYmxlcyB3aWxsCiAgICAjIGJlIHJlc3RvcmVkIGp1c3QgYmVmb3JlIHJlLWV4ZWN1dGluZyB0aGUgbWlzc2luZyBjb21tYW5kLgoKICAgIHNldCBzYXZlZEVycm9yQ29kZSAkZXJyb3JDb2RlCiAgICBzZXQgc2F2ZWRFcnJvckluZm8gJGVycm9ySW5mbwogICAgc2V0IG5hbWUgW2xpbmRleCAkYXJncyAwXQogICAgaWYgeyFbaW5mbyBleGlzdHMgYXV0b19ub2xvYWRdfSB7CgkjCgkjIE1ha2Ugc3VyZSB3ZSdyZSBub3QgdHJ5aW5nIHRvIGxvYWQgdGhlIHNhbWUgcHJvYyB0d2ljZS4KCSMKCWlmIHtbaW5mbyBleGlzdHMgdW5rbm93bl9wZW5kaW5nKCRuYW1lKV19IHsKCSAgICByZXR1cm4gLWNvZGUgZXJyb3IgInNlbGYtcmVmZXJlbnRpYWwgcmVjdXJzaW9uIGluIFwidW5rbm93blwiIGZvciBjb21tYW5kIFwiJG5hbWVcIiI7Cgl9CglzZXQgdW5rbm93bl9wZW5kaW5nKCRuYW1lKSBwZW5kaW5nOwoJc2V0IHJldCBbY2F0Y2gge2F1dG9fbG9hZCAkbmFtZSBbdXBsZXZlbCAxIHtuYW1lc3BhY2UgY3VycmVudH1dfSBtc2ddCgl1bnNldCB1bmtub3duX3BlbmRpbmcoJG5hbWUpOwoJaWYgeyRyZXQgIT0gMH0gewoJICAgIGFwcGVuZCBlcnJvckluZm8gIlxuICAgIChhdXRvbG9hZGluZyBcIiRuYW1lXCIpIgoJICAgIHJldHVybiAtY29kZSAkcmV0IC1lcnJvcmNvZGUgJGVycm9yQ29kZSAtZXJyb3JpbmZvICRlcnJvckluZm8gJG1zZwoJfQoJaWYgeyFbYXJyYXkgc2l6ZSB1bmtub3duX3BlbmRpbmddfSB7CgkgICAgdW5zZXQgdW5rbm93bl9wZW5kaW5nCgl9CglpZiB7JG1zZ30gewoJICAgIHNldCBlcnJvckNvZGUgJHNhdmVkRXJyb3JDb2RlCgkgICAgc2V0IGVycm9ySW5mbyAkc2F2ZWRFcnJvckluZm8KCSAgICBzZXQgY29kZSBbY2F0Y2gge3VwbGV2ZWwgMSAkYXJnc30gbXNnXQoJICAgIGlmIHskY29kZSA9PSAgMX0gewoJCSMKCQkjIFN0cmlwIHRoZSBsYXN0IGZpdmUgbGluZXMgb2ZmIHRoZSBlcnJvciBzdGFjayAodGhleSdyZQoJCSMgZnJvbSB0aGUgInVwbGV2ZWwiIGNvbW1hbmQpLgoJCSMKCgkJc2V0IG5ldyBbc3BsaXQgJGVycm9ySW5mbyBcbl0KCQlzZXQgbmV3IFtqb2luIFtscmFuZ2UgJG5ldyAwIFtleHByIHtbbGxlbmd0aCAkbmV3XSAtIDZ9XV0gXG5dCgkJcmV0dXJuIC1jb2RlIGVycm9yIC1lcnJvcmNvZGUgJGVycm9yQ29kZSBcCgkJCS1lcnJvcmluZm8gJG5ldyAkbXNnCgkgICAgfSBlbHNlIHsKCQlyZXR1cm4gLWNvZGUgJGNvZGUgJG1zZwoJICAgIH0KCX0KICAgIH0KCiAgICBpZiB7KFtpbmZvIGxldmVsXSA9PSAxKSAmJiBbc3RyaW5nIGVxdWFsIFtpbmZvIHNjcmlwdF0gIiJdIFwKCSAgICAmJiBbaW5mbyBleGlzdHMgdGNsX2ludGVyYWN0aXZlXSAmJiAkdGNsX2ludGVyYWN0aXZlfSB7CglpZiB7IVtpbmZvIGV4aXN0cyBhdXRvX25vZXhlY119IHsKCSAgICBzZXQgbmV3IFthdXRvX2V4ZWNvayAkbmFtZV0KCSAgICBpZiB7W3N0cmluZyBjb21wYXJlIHt9ICRuZXddfSB7CgkJc2V0IGVycm9yQ29kZSAkc2F2ZWRFcnJvckNvZGUKCQlzZXQgZXJyb3JJbmZvICRzYXZlZEVycm9ySW5mbwoJCXNldCByZWRpciAiIgoJCWlmIHtbc3RyaW5nIGVxdWFsIFtpbmZvIGNvbW1hbmRzIGNvbnNvbGVdICIiXX0gewoJCSAgICBzZXQgcmVkaXIgIj4mQHN0ZG91dCA8QHN0ZGluIgoJCX0KCQlyZXR1cm4gW3VwbGV2ZWwgZXhlYyAkcmVkaXIgJG5ldyBbbHJhbmdlICRhcmdzIDEgZW5kXV0KCSAgICB9Cgl9CglzZXQgZXJyb3JDb2RlICRzYXZlZEVycm9yQ29kZQoJc2V0IGVycm9ySW5mbyAkc2F2ZWRFcnJvckluZm8KCWlmIHtbc3RyaW5nIGVxdWFsICRuYW1lICIhISJdfSB7CgkgICAgc2V0IG5ld2NtZCBbaGlzdG9yeSBldmVudF0KCX0gZWxzZWlmIHtbcmVnZXhwIHteISguKykkfSAkbmFtZSBkdW1teSBldmVudF19IHsKCSAgICBzZXQgbmV3Y21kIFtoaXN0b3J5IGV2ZW50ICRldmVudF0KCX0gZWxzZWlmIHtbcmVnZXhwIHteXF4oW15eXSopXF4oW15eXSopXF4/JH0gJG5hbWUgZHVtbXkgb2xkIG5ld119IHsKCSAgICBzZXQgbmV3Y21kIFtoaXN0b3J5IGV2ZW50IC0xXQoJICAgIGNhdGNoIHtyZWdzdWIgLWFsbCAtLSAkb2xkICRuZXdjbWQgJG5ldyBuZXdjbWR9Cgl9CglpZiB7W2luZm8gZXhpc3RzIG5ld2NtZF19IHsKCSAgICB0Y2xMb2cgJG5ld2NtZAoJICAgIGhpc3RvcnkgY2hhbmdlICRuZXdjbWQgMAoJICAgIHJldHVybiBbdXBsZXZlbCAkbmV3Y21kXQoJfQoKCXNldCByZXQgW2NhdGNoIHtzZXQgY21kcyBbaW5mbyBjb21tYW5kcyAkbmFtZSpdfSBtc2ddCglpZiB7W3N0cmluZyBlcXVhbCAkbmFtZSAiOjoiXX0gewoJICAgIHNldCBuYW1lICIiCgl9CglpZiB7JHJldCAhPSAwfSB7CgkgICAgcmV0dXJuIC1jb2RlICRyZXQgLWVycm9yY29kZSAkZXJyb3JDb2RlIFwKCQkiZXJyb3IgaW4gdW5rbm93biB3aGlsZSBjaGVja2luZyBpZiBcIiRuYW1lXCIgaXMgYSB1bmlxdWUgY29tbWFuZCBhYmJyZXZpYXRpb246ICRtc2ciCgl9CglpZiB7W2xsZW5ndGggJGNtZHNdID09IDF9IHsKCSAgICByZXR1cm4gW3VwbGV2ZWwgW2xyZXBsYWNlICRhcmdzIDAgMCAkY21kc11dCgl9CglpZiB7W2xsZW5ndGggJGNtZHNdfSB7CgkgICAgaWYge1tzdHJpbmcgZXF1YWwgJG5hbWUgIiJdfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJlbXB0eSBjb21tYW5kIG5hbWUgXCJcIiIKCSAgICB9IGVsc2UgewoJCXJldHVybiAtY29kZSBlcnJvciBcCgkJCSJhbWJpZ3VvdXMgY29tbWFuZCBuYW1lIFwiJG5hbWVcIjogW2xzb3J0ICRjbWRzXSIKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gLWNvZGUgZXJyb3IgImludmFsaWQgY29tbWFuZCBuYW1lIFwiJG5hbWVcIiIKfQoKIyBhdXRvX2xvYWQgLS0KIyBDaGVja3MgYSBjb2xsZWN0aW9uIG9mIGxpYnJhcnkgZGlyZWN0b3JpZXMgdG8gc2VlIGlmIGEgcHJvY2VkdXJlCiMgaXMgZGVmaW5lZCBpbiBvbmUgb2YgdGhlbS4gIElmIHNvLCBpdCBzb3VyY2VzIHRoZSBhcHByb3ByaWF0ZQojIGxpYnJhcnkgZmlsZSB0byBjcmVhdGUgdGhlIHByb2NlZHVyZS4gIFJldHVybnMgMSBpZiBpdCBzdWNjZXNzZnVsbHkKIyBsb2FkZWQgdGhlIHByb2NlZHVyZSwgMCBvdGhlcndpc2UuCiMKIyBBcmd1bWVudHM6IAojIGNtZCAtCQkJTmFtZSBvZiB0aGUgY29tbWFuZCB0byBmaW5kIGFuZCBsb2FkLgojIG5hbWVzcGFjZSAob3B0aW9uYWwpICBUaGUgbmFtZXNwYWNlIHdoZXJlIHRoZSBjb21tYW5kIGlzIGJlaW5nIHVzZWQgLSBtdXN0IGJlCiMgICAgICAgICAgICAgICAgICAgICAgIGEgY2Fub25pY2FsIG5hbWVzcGFjZSBhcyByZXR1cm5lZCBbbmFtZXNwYWNlIGN1cnJlbnRdCiMgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnN0YW5jZS4gSWYgbm90IGdpdmVuLCBuYW1lc3BhY2UgY3VycmVudCBpcyB1c2VkLgoKcHJvYyBhdXRvX2xvYWQge2NtZCB7bmFtZXNwYWNlIHt9fX0gewogICAgZ2xvYmFsIGF1dG9faW5kZXggYXV0b19vbGRwYXRoIGF1dG9fcGF0aAoKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkbmFtZXNwYWNlXSA9PSAwfSB7CglzZXQgbmFtZXNwYWNlIFt1cGxldmVsIHtuYW1lc3BhY2UgY3VycmVudH1dCiAgICB9CiAgICBzZXQgbmFtZUxpc3QgW2F1dG9fcXVhbGlmeSAkY21kICRuYW1lc3BhY2VdCiAgICAjIHdvcmthcm91bmQgbm9uIGNhbm9uaWNhbCBhdXRvX2luZGV4IGVudHJpZXMgdGhhdCBtaWdodCBiZSBhcm91bmQKICAgICMgZnJvbSBvbGRlciBhdXRvX21raW5kZXggdmVyc2lvbnMKICAgIGxhcHBlbmQgbmFtZUxpc3QgJGNtZAogICAgZm9yZWFjaCBuYW1lICRuYW1lTGlzdCB7CglpZiB7W2luZm8gZXhpc3RzIGF1dG9faW5kZXgoJG5hbWUpXX0gewoJICAgIHVwbGV2ZWwgIzAgJGF1dG9faW5kZXgoJG5hbWUpCgkgICAgcmV0dXJuIFtleHByIHtbaW5mbyBjb21tYW5kcyAkbmFtZV0gIT0gIiJ9XQoJfQogICAgfQogICAgaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gewoJcmV0dXJuIDAKICAgIH0KCiAgICBpZiB7IVthdXRvX2xvYWRfaW5kZXhdfSB7CglyZXR1cm4gMAogICAgfQogICAgZm9yZWFjaCBuYW1lICRuYW1lTGlzdCB7CglpZiB7W2luZm8gZXhpc3RzIGF1dG9faW5kZXgoJG5hbWUpXX0gewoJICAgIHVwbGV2ZWwgIzAgJGF1dG9faW5kZXgoJG5hbWUpCgkgICAgIyBUaGVyZSdzIGEgY291cGxlIG9mIHdheXMgdG8gbG9vayBmb3IgYSBjb21tYW5kIG9mIGEgZ2l2ZW4KCSAgICAjIG5hbWUuICBPbmUgaXMgdG8gdXNlCgkgICAgIyAgICBpbmZvIGNvbW1hbmRzICRuYW1lCgkgICAgIyBVbmZvcnR1bmF0ZWx5LCBpZiB0aGUgbmFtZSBoYXMgZ2xvYi1tYWdpYyBjaGFycyBpbiBpdCBsaWtlICoKCSAgICAjIG9yIFtdLCBpdCBtYXkgbm90IG1hdGNoLiAgRm9yIG91ciBwdXJwb3NlcyBoZXJlLCBhIGJldHRlcgoJICAgICMgcm91dGUgaXMgdG8gdXNlIAoJICAgICMgICAgbmFtZXNwYWNlIHdoaWNoIC1jb21tYW5kICRuYW1lCgkgICAgaWYgeyAhW3N0cmluZyBlcXVhbCBbbmFtZXNwYWNlIHdoaWNoIC1jb21tYW5kICRuYW1lXSAiIl0gfSB7CgkJcmV0dXJuIDEKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gMAp9CgojIGF1dG9fbG9hZF9pbmRleCAtLQojIExvYWRzIHRoZSBjb250ZW50cyBvZiB0Y2xJbmRleCBmaWxlcyBvbiB0aGUgYXV0b19wYXRoIGRpcmVjdG9yeQojIGxpc3QuICBUaGlzIGlzIHVzdWFsbHkgaW52b2tlZCB3aXRoaW4gYXV0b19sb2FkIHRvIGxvYWQgdGhlIGluZGV4CiMgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgUmV0dXJucyAxIGlmIHRoZSBpbmRleCBpcyBsb2FkZWQsIGFuZCAwIGlmCiMgdGhlIGluZGV4IGlzIGFscmVhZHkgbG9hZGVkIGFuZCB1cCB0byBkYXRlLgojCiMgQXJndW1lbnRzOiAKIyBOb25lLgoKcHJvYyBhdXRvX2xvYWRfaW5kZXgge30gewogICAgZ2xvYmFsIGF1dG9faW5kZXggYXV0b19vbGRwYXRoIGF1dG9fcGF0aCBlcnJvckluZm8gZXJyb3JDb2RlCgogICAgaWYge1tpbmZvIGV4aXN0cyBhdXRvX29sZHBhdGhdICYmIFwKCSAgICBbc3RyaW5nIGVxdWFsICRhdXRvX29sZHBhdGggJGF1dG9fcGF0aF19IHsKCXJldHVybiAwCiAgICB9CiAgICBzZXQgYXV0b19vbGRwYXRoICRhdXRvX3BhdGgKCiAgICAjIENoZWNrIGlmIHdlIGFyZSBhIHNhZmUgaW50ZXJwcmV0ZXIuIEluIHRoYXQgY2FzZSwgd2Ugc3VwcG9ydCBvbmx5CiAgICAjIG5ld2VyIGZvcm1hdCB0Y2xJbmRleCBmaWxlcy4KCiAgICBzZXQgaXNzYWZlIFtpbnRlcnAgaXNzYWZlXQogICAgZm9yIHtzZXQgaSBbZXhwciB7W2xsZW5ndGggJGF1dG9fcGF0aF0gLSAxfV19IHskaSA+PSAwfSB7aW5jciBpIC0xfSB7CglzZXQgZGlyIFtsaW5kZXggJGF1dG9fcGF0aCAkaV0KCXNldCBmICIiCglpZiB7JGlzc2FmZX0gewoJICAgIGNhdGNoIHtzb3VyY2UgW2ZpbGUgam9pbiAkZGlyIHRjbEluZGV4XX0KCX0gZWxzZWlmIHtbY2F0Y2gge3NldCBmIFtvcGVuIFtmaWxlIGpvaW4gJGRpciB0Y2xJbmRleF1dfV19IHsKCSAgICBjb250aW51ZQoJfSBlbHNlIHsKCSAgICBzZXQgZXJyb3IgW2NhdGNoIHsKCQlzZXQgaWQgW2dldHMgJGZdCgkJaWYge1tzdHJpbmcgZXF1YWwgJGlkIFwKCQkJIiMgVGNsIGF1dG9sb2FkIGluZGV4IGZpbGUsIHZlcnNpb24gMi4wIl19IHsKCQkgICAgZXZhbCBbcmVhZCAkZl0KCQl9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAkaWQgIiMgVGNsIGF1dG9sb2FkIGluZGV4IGZpbGU6IGVhY2ggbGluZSBpZGVudGlmaWVzIGEgVGNsIl19IHsKCQkgICAgd2hpbGUge1tnZXRzICRmIGxpbmVdID49IDB9IHsKCQkJaWYge1tzdHJpbmcgZXF1YWwgW3N0cmluZyBpbmRleCAkbGluZSAwXSAiIyJdIFwKCQkJCXx8IChbbGxlbmd0aCAkbGluZV0gIT0gMil9IHsKCQkJICAgIGNvbnRpbnVlCgkJCX0KCQkJc2V0IG5hbWUgW2xpbmRleCAkbGluZSAwXQoJCQlzZXQgYXV0b19pbmRleCgkbmFtZSkgXAoJCQkJInNvdXJjZSBbZmlsZSBqb2luICRkaXIgW2xpbmRleCAkbGluZSAxXV0iCgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICBlcnJvciAiW2ZpbGUgam9pbiAkZGlyIHRjbEluZGV4XSBpc24ndCBhIHByb3BlciBUY2wgaW5kZXggZmlsZSIKCQl9CgkgICAgfSBtc2ddCgkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkZiAiIl19IHsKCQljbG9zZSAkZgoJICAgIH0KCSAgICBpZiB7JGVycm9yfSB7CgkJZXJyb3IgJG1zZyAkZXJyb3JJbmZvICRlcnJvckNvZGUKCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gMQp9CgojIGF1dG9fcXVhbGlmeSAtLQojCiMgQ29tcHV0ZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBsaXN0IGZvciB1c2UgaW4gdGhlIGF1dG9faW5kZXggYXJyYXkuCiMgRm9yIGhpc3RvcmljYWwgcmVhc29ucywgY29tbWFuZHMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgZG8gbm90IGhhdmUgbGVhZGluZwojIDo6IGluIHRoZSBpbmRleCBrZXkuIFRoZSBsaXN0IGhhcyB0d28gZWxlbWVudHMgd2hlbiB0aGUgY29tbWFuZCBuYW1lIGlzCiMgcmVsYXRpdmUgKG5vIGxlYWRpbmcgOjopIGFuZCB0aGUgbmFtZXNwYWNlIGlzIG5vdCB0aGUgZ2xvYmFsIG9uZS4gT3RoZXJ3aXNlCiMgb25seSBvbmUgbmFtZSBpcyByZXR1cm5lZCAoYW5kIHNlYXJjaGVkIGluIHRoZSBhdXRvX2luZGV4KS4KIwojIEFyZ3VtZW50cyAtCiMgY21kCQlUaGUgY29tbWFuZCBuYW1lLiBDYW4gYmUgYW55IG5hbWUgYWNjZXB0ZWQgZm9yIGNvbW1hbmQKIyAgICAgICAgICAgICAgIGludm9jYXRpb25zIChMaWtlICJmb286Ojo6YmFyIikuCiMgbmFtZXNwYWNlCVRoZSBuYW1lc3BhY2Ugd2hlcmUgdGhlIGNvbW1hbmQgaXMgYmVpbmcgdXNlZCAtIG11c3QgYmUKIyAgICAgICAgICAgICAgIGEgY2Fub25pY2FsIG5hbWVzcGFjZSBhcyByZXR1cm5lZCBieSBbbmFtZXNwYWNlIGN1cnJlbnRdCiMgICAgICAgICAgICAgICBmb3IgaW5zdGFuY2UuCgpwcm9jIGF1dG9fcXVhbGlmeSB7Y21kIG5hbWVzcGFjZX0gewoKICAgICMgY291bnQgc2VwYXJhdG9ycyBhbmQgY2xlYW4gdGhlbSB1cAogICAgIyAobWFraW5nIHN1cmUgdGhhdCBmb286Ojo6OmJhciB3aWxsIGJlIHRyZWF0ZWQgYXMgZm9vOjpiYXIpCiAgICBzZXQgbiBbcmVnc3ViIC1hbGwgezo6K30gJGNtZCA6OiBjbWRdCgogICAgIyBJZ25vcmUgbmFtZXNwYWNlIGlmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIDo6CiAgICAjIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygb25seSBsZWFkaW5nIDo6CgogICAgIyBCZWZvcmUgZWFjaCByZXR1cm4gY2FzZSB3ZSBnaXZlIGFuIGV4YW1wbGUgb2Ygd2hpY2ggY2F0ZWdvcnkgaXQgaXMKICAgICMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm0gOgogICAgIyAoIGlucHV0Q21kLCBpbnB1dE5hbWVTcGFjZSkgLT4gb3V0cHV0CgogICAgaWYge1tyZWdleHAge146OiguKikkfSAkY21kIHggdGFpbF19IHsKCWlmIHskbiA+IDF9IHsKCSAgICAjICggOjpmb286OmJhciAsICogKSAtPiA6OmZvbzo6YmFyCgkgICAgcmV0dXJuIFtsaXN0ICRjbWRdCgl9IGVsc2UgewoJICAgICMgKCA6Omdsb2JhbCAsICogKSAtPiBnbG9iYWwKCSAgICByZXR1cm4gW2xpc3QgJHRhaWxdCgl9CiAgICB9CiAgICAKICAgICMgUG90ZW50aWFsbHkgcmV0dXJuaW5nIDIgZWxlbWVudHMgdG8gdHJ5ICA6CiAgICAjIChpZiB0aGUgY3VycmVudCBuYW1lc3BhY2UgaXMgbm90IHRoZSBnbG9iYWwgb25lKQoKICAgIGlmIHskbiA9PSAwfSB7CglpZiB7W3N0cmluZyBlcXVhbCAkbmFtZXNwYWNlIDo6XX0gewoJICAgICMgKCBub2NvbG9ucyAsIDo6ICkgLT4gbm9jb2xvbnMKCSAgICByZXR1cm4gW2xpc3QgJGNtZF0KCX0gZWxzZSB7CgkgICAgIyAoIG5vY29sb25zICwgOjpzdWIgKSAtPiA6OnN1Yjo6bm9jb2xvbnMgbm9jb2xvbnMKCSAgICByZXR1cm4gW2xpc3QgJHtuYW1lc3BhY2V9OjokY21kICRjbWRdCgl9CiAgICB9IGVsc2VpZiB7W3N0cmluZyBlcXVhbCAkbmFtZXNwYWNlIDo6XX0gewoJIyAgKCBmb286OmJhciAsIDo6ICkgLT4gOjpmb286OmJhcgoJcmV0dXJuIFtsaXN0IDo6JGNtZF0KICAgIH0gZWxzZSB7CgkjICggZm9vOjpiYXIgLCA6OnN1YiApIC0+IDo6c3ViOjpmb286OmJhciA6OmZvbzo6YmFyCglyZXR1cm4gW2xpc3QgJHtuYW1lc3BhY2V9OjokY21kIDo6JGNtZF0KICAgIH0KfQoKIyBhdXRvX2ltcG9ydCAtLQojCiMgSW52b2tlZCBkdXJpbmcgIm5hbWVzcGFjZSBpbXBvcnQiIHRvIG1ha2Ugc2VlIGlmIHRoZSBpbXBvcnRlZCBjb21tYW5kcwojIHJlc2lkZSBpbiBhbiBhdXRvbG9hZGVkIGxpYnJhcnkuICBJZiBzbywgdGhlIGNvbW1hbmRzIGFyZSBsb2FkZWQgc28KIyB0aGF0IHRoZXkgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHRoZSBpbXBvcnQgbGlua3MuICBJZiBub3QsIHRoZW4gdGhpcwojIHByb2NlZHVyZSBkb2VzIG5vdGhpbmcuCiMKIyBBcmd1bWVudHMgLQojIHBhdHRlcm4JVGhlIHBhdHRlcm4gb2YgY29tbWFuZHMgYmVpbmcgaW1wb3J0ZWQgKGxpa2UgImZvbzo6KiIpCiMgICAgICAgICAgICAgICBhIGNhbm9uaWNhbCBuYW1lc3BhY2UgYXMgcmV0dXJuZWQgYnkgW25hbWVzcGFjZSBjdXJyZW50XQoKcHJvYyBhdXRvX2ltcG9ydCB7cGF0dGVybn0gewogICAgZ2xvYmFsIGF1dG9faW5kZXgKCiAgICBzZXQgbnMgW3VwbGV2ZWwgbmFtZXNwYWNlIGN1cnJlbnRdCiAgICBzZXQgcGF0dGVybkxpc3QgW2F1dG9fcXVhbGlmeSAkcGF0dGVybiAkbnNdCgogICAgYXV0b19sb2FkX2luZGV4CgogICAgZm9yZWFjaCBwYXR0ZXJuICRwYXR0ZXJuTGlzdCB7CiAgICAgICAgZm9yZWFjaCBuYW1lIFthcnJheSBuYW1lcyBhdXRvX2luZGV4XSB7CiAgICAgICAgICAgIGlmIHtbc3RyaW5nIG1hdGNoICRwYXR0ZXJuICRuYW1lXSAmJiBcCgkJICAgIFtzdHJpbmcgZXF1YWwgIiIgW2luZm8gY29tbWFuZHMgJG5hbWVdXX0gewogICAgICAgICAgICAgICAgdXBsZXZlbCAjMCAkYXV0b19pbmRleCgkbmFtZSkKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKIyBhdXRvX2V4ZWNvayAtLQojCiMgUmV0dXJucyBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgbmFtZSBvZiBwcm9ncmFtIHRvIGV4ZWN1dGUgaWYgCiMgbmFtZSBjb3JyZXNwb25kcyB0byBhIHNoZWxsIGJ1aWx0aW4gb3IgYW4gZXhlY3V0YWJsZSBpbiB0aGUKIyBXaW5kb3dzIHNlYXJjaCBwYXRoLCBvciAiIiBvdGhlcndpc2UuICBCdWlsZHMgYW4gYXNzb2NpYXRpdmUgCiMgYXJyYXkgYXV0b19leGVjcyB0aGF0IGNhY2hlcyBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91cyBjaGVja3MsIAojIGZvciBzcGVlZC4KIwojIEFyZ3VtZW50czogCiMgbmFtZSAtCQkJTmFtZSBvZiBhIGNvbW1hbmQuCgppZiB7W3N0cmluZyBlcXVhbCB3aW5kb3dzICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pXX0gewojIFdpbmRvd3MgdmVyc2lvbi4KIwojIE5vdGUgdGhhdCBpbmZvIGV4ZWN1dGFibGUgZG9lc24ndCB3b3JrIHVuZGVyIFdpbmRvd3MsIHNvIHdlIGhhdmUgdG8KIyBsb29rIGZvciBmaWxlcyB3aXRoIC5leGUsIC5jb20sIG9yIC5iYXQgZXh0ZW5zaW9ucy4gIEFsc28sIHRoZSBwYXRoCiMgbWF5IGJlIGluIHRoZSBQYXRoIG9yIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGVzLCBhbmQgcGF0aAojIGNvbXBvbmVudHMgYXJlIHNlcGFyYXRlZCB3aXRoIHNlbWljb2xvbnMsIG5vdCBjb2xvbnMgYXMgdW5kZXIgVW5peC4KIwpwcm9jIGF1dG9fZXhlY29rIG5hbWUgewogICAgZ2xvYmFsIGF1dG9fZXhlY3MgZW52IHRjbF9wbGF0Zm9ybQoKICAgIGlmIHtbaW5mbyBleGlzdHMgYXV0b19leGVjcygkbmFtZSldfSB7CglyZXR1cm4gJGF1dG9fZXhlY3MoJG5hbWUpCiAgICB9CiAgICBzZXQgYXV0b19leGVjcygkbmFtZSkgIiIKCiAgICBzZXQgc2hlbGxCdWlsdGlucyBbbGlzdCBjbHMgY29weSBkYXRlIGRlbCBlcmFzZSBkaXIgZWNobyBta2RpciBcCgkgICAgbWQgcmVuYW1lIHJlbiBybWRpciByZCB0aW1lIHR5cGUgdmVyIHZvbF0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ob3MpICJXaW5kb3dzIE5UIl19IHsKCSMgTlQgaW5jbHVkZXMgdGhlICdzdGFydCcgYnVpbHQtaW4KCWxhcHBlbmQgc2hlbGxCdWlsdGlucyAic3RhcnQiCiAgICB9CgogICAgaWYge1tsc2VhcmNoIC1leGFjdCAkc2hlbGxCdWlsdGlucyAkbmFtZV0gIT0gLTF9IHsKCXJldHVybiBbc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRlbnYoQ09NU1BFQykgL2MgJG5hbWVdXQogICAgfQoKICAgIGlmIHtbbGxlbmd0aCBbZmlsZSBzcGxpdCAkbmFtZV1dICE9IDF9IHsKCWZvcmVhY2ggZXh0IHt7fSAuY29tIC5leGUgLmJhdH0gewoJICAgIHNldCBmaWxlICR7bmFtZX0ke2V4dH0KCSAgICBpZiB7W2ZpbGUgZXhpc3RzICRmaWxlXSAmJiAhW2ZpbGUgaXNkaXJlY3RvcnkgJGZpbGVdfSB7CgkJcmV0dXJuIFtzZXQgYXV0b19leGVjcygkbmFtZSkgW2xpc3QgJGZpbGVdXQoJICAgIH0KCX0KCXJldHVybiAiIgogICAgfQoKICAgIHNldCBwYXRoICJbZmlsZSBkaXJuYW1lIFtpbmZvIG5hbWVvZl1dOy47IgogICAgaWYge1tpbmZvIGV4aXN0cyBlbnYoV0lORElSKV19IHsKCXNldCB3aW5kaXIgJGVudihXSU5ESVIpIAogICAgfQogICAgaWYge1tpbmZvIGV4aXN0cyB3aW5kaXJdfSB7CglpZiB7W3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKG9zKSAiV2luZG93cyBOVCJdfSB7CgkgICAgYXBwZW5kIHBhdGggIiR3aW5kaXIvc3lzdGVtMzI7IgoJfQoJYXBwZW5kIHBhdGggIiR3aW5kaXIvc3lzdGVtOyR3aW5kaXI7IgogICAgfQoKICAgIGZvcmVhY2ggdmFyIHtQQVRIIFBhdGggcGF0aH0gewoJaWYge1tpbmZvIGV4aXN0cyBlbnYoJHZhcildfSB7CgkgICAgYXBwZW5kIHBhdGggIjskZW52KCR2YXIpIgoJfQogICAgfQoKICAgIGZvcmVhY2ggZGlyIFtzcGxpdCAkcGF0aCB7O31dIHsKCSMgU2tpcCBhbHJlYWR5IGNoZWNrZWQgZGlyZWN0b3JpZXMKCWlmIHtbaW5mbyBleGlzdHMgY2hlY2tlZCgkZGlyKV0gfHwgW3N0cmluZyBlcXVhbCB7fSAkZGlyXX0geyBjb250aW51ZSB9CglzZXQgY2hlY2tlZCgkZGlyKSB7fQoJZm9yZWFjaCBleHQge3t9IC5jb20gLmV4ZSAuYmF0fSB7CgkgICAgc2V0IGZpbGUgW2ZpbGUgam9pbiAkZGlyICR7bmFtZX0ke2V4dH1dCgkgICAgaWYge1tmaWxlIGV4aXN0cyAkZmlsZV0gJiYgIVtmaWxlIGlzZGlyZWN0b3J5ICRmaWxlXX0gewoJCXJldHVybiBbc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRmaWxlXV0KCSAgICB9Cgl9CiAgICB9CiAgICByZXR1cm4gIiIKfQoKfSBlbHNlIHsKIyBVbml4IHZlcnNpb24uCiMKcHJvYyBhdXRvX2V4ZWNvayBuYW1lIHsKICAgIGdsb2JhbCBhdXRvX2V4ZWNzIGVudgoKICAgIGlmIHtbaW5mbyBleGlzdHMgYXV0b19leGVjcygkbmFtZSldfSB7CglyZXR1cm4gJGF1dG9fZXhlY3MoJG5hbWUpCiAgICB9CiAgICBzZXQgYXV0b19leGVjcygkbmFtZSkgIiIKICAgIGlmIHtbbGxlbmd0aCBbZmlsZSBzcGxpdCAkbmFtZV1dICE9IDF9IHsKCWlmIHtbZmlsZSBleGVjdXRhYmxlICRuYW1lXSAmJiAhW2ZpbGUgaXNkaXJlY3RvcnkgJG5hbWVdfSB7CgkgICAgc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRuYW1lXQoJfQoJcmV0dXJuICRhdXRvX2V4ZWNzKCRuYW1lKQogICAgfQogICAgZm9yZWFjaCBkaXIgW3NwbGl0ICRlbnYoUEFUSCkgOl0gewoJaWYge1tzdHJpbmcgZXF1YWwgJGRpciAiIl19IHsKCSAgICBzZXQgZGlyIC4KCX0KCXNldCBmaWxlIFtmaWxlIGpvaW4gJGRpciAkbmFtZV0KCWlmIHtbZmlsZSBleGVjdXRhYmxlICRmaWxlXSAmJiAhW2ZpbGUgaXNkaXJlY3RvcnkgJGZpbGVdfSB7CgkgICAgc2V0IGF1dG9fZXhlY3MoJG5hbWUpIFtsaXN0ICRmaWxlXQoJICAgIHJldHVybiAkYXV0b19leGVjcygkbmFtZSkKCX0KICAgIH0KICAgIHJldHVybiAiIgp9Cgp9CgAASuIjIGF1dG8udGNsIC0tCiMKIyB1dGlsaXR5IHByb2NzIGZvcm1lcmx5IGluIGluaXQudGNsIGRlYWxpbmcgd2l0aCBhdXRvIGV4ZWN1dGlvbgojIG9mIGNvbW1hbmRzIGFuZCBjYW4gYmUgYXV0byBsb2FkZWQgdGhlbXNlbHZlcy4KIwojIFJDUzogQCgjKSAkSWQ6IGF1dG8udGNsLHYgMS43IDIwMDAvMDIvMDggMTA6MDY6MTIgaG9iYnMgRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiMgQ29weXJpZ2h0IChjKSAxOTk0LTE5OTggU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgojCiMgU2VlIHRoZSBmaWxlICJsaWNlbnNlLnRlcm1zIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uCiMgb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KIwoKIyBhdXRvX3Jlc2V0IC0tCiMKIyBEZXN0cm95IGFsbCBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGF1dG8tbG9hZGluZyBhbmQgYXV0by1leGVjdXRpb24sCiMgc28gdGhhdCB0aGUgaW5mb3JtYXRpb24gZ2V0cyByZWNvbXB1dGVkIHRoZSBuZXh0IHRpbWUgaXQncyBuZWVkZWQuCiMgQWxzbyBkZWxldGUgYW55IHByb2NlZHVyZXMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBhdXRvLWxvYWQgaW5kZXgKIyBleGNlcHQgdGhvc2UgZGVmaW5lZCBpbiB0aGlzIGZpbGUuCiMKIyBBcmd1bWVudHM6IAojIE5vbmUuCgpwcm9jIGF1dG9fcmVzZXQge30gewogICAgZ2xvYmFsIGF1dG9fZXhlY3MgYXV0b19pbmRleCBhdXRvX29sZHBhdGgKICAgIGZvcmVhY2ggcCBbaW5mbyBwcm9jc10gewoJaWYge1tpbmZvIGV4aXN0cyBhdXRvX2luZGV4KCRwKV0gJiYgIVtzdHJpbmcgbWF0Y2ggYXV0b18qICRwXQoJCSYmIChbbHNlYXJjaCAtZXhhY3Qge3Vua25vd24gcGtnX21rSW5kZXggdGNsUGtnU2V0dXAKCQkJdGNsX2ZpbmRMaWJyYXJ5IHBrZ19jb21wYXJlRXh0ZW5zaW9uCgkJCXRjbE1hY1BrZ1NlYXJjaCB0Y2xQa2dVbmtub3dufSAkcF0gPCAwKX0gewoJICAgIHJlbmFtZSAkcCB7fQoJfQogICAgfQogICAgY2F0Y2gge3Vuc2V0IGF1dG9fZXhlY3N9CiAgICBjYXRjaCB7dW5zZXQgYXV0b19pbmRleH0KICAgIGNhdGNoIHt1bnNldCBhdXRvX29sZHBhdGh9Cn0KCiMgdGNsX2ZpbmRMaWJyYXJ5IC0tCiMKIwlUaGlzIGlzIGEgdXRpbGl0eSBmb3IgZXh0ZW5zaW9ucyB0aGF0IHNlYXJjaGVzIGZvciBhIGxpYnJhcnkgZGlyZWN0b3J5CiMJdXNpbmcgYSBjYW5vbmljYWwgc2VhcmNoaW5nIGFsZ29yaXRobS4gQSBzaWRlIGVmZmVjdCBpcyB0byBzb3VyY2UKIwl0aGUgaW5pdGlhbGl6YXRpb24gc2NyaXB0IGFuZCBzZXQgYSBnbG9iYWwgbGlicmFyeSB2YXJpYWJsZS4KIwojIEFyZ3VtZW50czoKIyAJYmFzZW5hbWUJUHJlZml4IG9mIHRoZSBkaXJlY3RvcnkgbmFtZSwgKGUuZy4sICJ0ayIpCiMJdmVyc2lvbgkJVmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhY2thZ2UsIChlLmcuLCAiOC4wIikKIwlwYXRjaAkJUGF0Y2hsZXZlbCBvZiB0aGUgcGFja2FnZSwgKGUuZy4sICI4LjAuMyIpCiMJaW5pdFNjcmlwdAlJbml0aWFsaXphdGlvbiBzY3JpcHQgdG8gc291cmNlIChlLmcuLCB0ay50Y2wpCiMJZW5WYXJOYW1lCWVudmlyb25tZW50IHZhcmlhYmxlIHRvIGhvbm9yIChlLmcuLCBUS19MSUJSQVJZKQojCXZhck5hbWUJCUdsb2JhbCB2YXJpYWJsZSB0byBzZXQgd2hlbiBkb25lIChlLmcuLCB0a19saWJyYXJ5KQoKcHJvYyB0Y2xfZmluZExpYnJhcnkge2Jhc2VuYW1lIHZlcnNpb24gcGF0Y2ggaW5pdFNjcmlwdCBlblZhck5hbWUgdmFyTmFtZX0gewogICAgdXB2YXIgIzAgJHZhck5hbWUgdGhlX2xpYnJhcnkKICAgIGdsb2JhbCBlbnYgZXJyb3JJbmZvCgogICAgc2V0IGRpcnMge30KICAgIHNldCBlcnJvcnMge30KCiAgICAjIFRoZSBDIGFwcGxpY2F0aW9uIG1heSBoYXZlIGhhcmR3aXJlZCBhIHBhdGgsIHdoaWNoIHdlIGhvbm9yCiAgICAKICAgIGlmIHtbaW5mbyBleGlzdCB0aGVfbGlicmFyeV0gJiYgW3N0cmluZyBjb21wYXJlICR0aGVfbGlicmFyeSB7fV19IHsKCWxhcHBlbmQgZGlycyAkdGhlX2xpYnJhcnkKICAgIH0gZWxzZSB7CgoJIyBEbyB0aGUgY2Fub25pY2FsIHNlYXJjaAoKCSMgMS4gRnJvbSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgaXQgZXhpc3RzCgogICAgICAgIGlmIHtbaW5mbyBleGlzdHMgZW52KCRlblZhck5hbWUpXX0gewogICAgICAgICAgICBsYXBwZW5kIGRpcnMgJGVudigkZW5WYXJOYW1lKQogICAgICAgIH0KCgkjIDIuIFJlbGF0aXZlIHRvIHRoZSBUY2wgbGlicmFyeQoKICAgICAgICBsYXBwZW5kIGRpcnMgW2ZpbGUgam9pbiBbZmlsZSBkaXJuYW1lIFtpbmZvIGxpYnJhcnldXSBcCgkJJGJhc2VuYW1lJHZlcnNpb25dCgoJIyAzLiBWYXJpb3VzIGxvY2F0aW9ucyByZWxhdGl2ZSB0byB0aGUgZXhlY3V0YWJsZQoJIyAuLi9saWIvZm9vMS4wCQkoRnJvbSBiaW4gZGlyZWN0b3J5IGluIGluc3RhbGwgaGllcmFyY2h5KQoJIyAuLi8uLi9saWIvZm9vMS4wCShGcm9tIGJpbi9hcmNoIGRpcmVjdG9yeSBpbiBpbnN0YWxsIGhpZXJhcmNoeSkKCSMgLi4vbGlicmFyeQkJKEZyb20gdW5peCBkaXJlY3RvcnkgaW4gYnVpbGQgaGllcmFyY2h5KQoJIyAuLi8uLi9saWJyYXJ5CQkoRnJvbSB1bml4L2FyY2ggZGlyZWN0b3J5IGluIGJ1aWxkIGhpZXJhcmNoeSkKCSMgLi4vLi4vZm9vMS4wYjEvbGlicmFyeSAoRnJvbSB1bml4IGRpcmVjdG9yeSBpbiBwYXJhbGxlbCBidWlsZCBoaWVyYXJjaHkpCgkjIC4uLy4uLy4uL2ZvbzEuMGIxL2xpYnJhcnkgKEZyb20gdW5peC9hcmNoIGRpcmVjdG9yeSBpbiBwYXJhbGxlbCBidWlsZCBoaWVyYXJjaHkpCgogICAgICAgIHNldCBwYXJlbnREaXIgW2ZpbGUgZGlybmFtZSBbZmlsZSBkaXJuYW1lIFtpbmZvIG5hbWVvZmV4ZWN1dGFibGVdXV0KICAgICAgICBzZXQgZ3JhbmRQYXJlbnREaXIgW2ZpbGUgZGlybmFtZSAkcGFyZW50RGlyXQogICAgICAgIGxhcHBlbmQgZGlycyBbZmlsZSBqb2luICRwYXJlbnREaXIgbGliICRiYXNlbmFtZSR2ZXJzaW9uXQogICAgICAgIGxhcHBlbmQgZGlycyBbZmlsZSBqb2luICRncmFuZFBhcmVudERpciBsaWIgJGJhc2VuYW1lJHZlcnNpb25dCiAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gJHBhcmVudERpciBsaWJyYXJ5XQogICAgICAgIGxhcHBlbmQgZGlycyBbZmlsZSBqb2luICRncmFuZFBhcmVudERpciBsaWJyYXJ5XQogICAgICAgIGlmIHshW3JlZ2V4cCB7LipbYWJdWzAtOV0qfSAkcGF0Y2ggdmVyXX0gewogICAgICAgICAgICBzZXQgdmVyICR2ZXJzaW9uCiAgICAgICAgfQogICAgICAgIGxhcHBlbmQgZGlycyBbZmlsZSBqb2luICRncmFuZFBhcmVudERpciAkYmFzZW5hbWUkdmVyIGxpYnJhcnldCiAgICAgICAgbGFwcGVuZCBkaXJzIFtmaWxlIGpvaW4gW2ZpbGUgZGlybmFtZSAkZ3JhbmRQYXJlbnREaXJdICRiYXNlbmFtZSR2ZXIgbGlicmFyeV0KICAgIH0KICAgIGZvcmVhY2ggaSAkZGlycyB7CiAgICAgICAgc2V0IHRoZV9saWJyYXJ5ICRpCiAgICAgICAgc2V0IGZpbGUgW2ZpbGUgam9pbiAkaSAkaW5pdFNjcmlwdF0KCgkjIHNvdXJjZSBldmVyeXRoaW5nIHdoZW4gaW4gYSBzYWZlIGludGVycHJldGVyIGJlY2F1c2UKCSMgd2UgaGF2ZSBhIHNvdXJjZSBjb21tYW5kLCBidXQgbm8gZmlsZSBleGlzdHMgY29tbWFuZAoKICAgICAgICBpZiB7W2ludGVycCBpc3NhZmVdIHx8IFtmaWxlIGV4aXN0cyAkZmlsZV19IHsKICAgICAgICAgICAgaWYgeyFbY2F0Y2gge3VwbGV2ZWwgIzAgW2xpc3Qgc291cmNlICRmaWxlXX0gbXNnXX0gewogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhcHBlbmQgZXJyb3JzICIkZmlsZTogJG1zZ1xuJGVycm9ySW5mb1xuIgogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc2V0IG1zZyAiQ2FuJ3QgZmluZCBhIHVzYWJsZSAkaW5pdFNjcmlwdCBpbiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzOiBcbiIKICAgIGFwcGVuZCBtc2cgIiAgICAkZGlyc1xuXG4iCiAgICBhcHBlbmQgbXNnICIkZXJyb3JzXG5cbiIKICAgIGFwcGVuZCBtc2cgIlRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCAkYmFzZW5hbWUgd2Fzbid0IGluc3RhbGxlZCBwcm9wZXJseS5cbiIKICAgIGVycm9yICRtc2cKfQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGF1dG9fbWtpbmRleAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRjbEluZGV4IGZpbGUKIyBmcm9tIFRjbCBzb3VyY2UgZmlsZXMuICBUaGV5IHVzZSBhIHNwZWNpYWwgc2FmZSBpbnRlcnByZXRlciB0bwojIHBhcnNlIFRjbCBzb3VyY2UgZmlsZXMsIHdyaXRpbmcgb3V0IGluZGV4IGVudHJpZXMgYXMgInByb2MiCiMgY29tbWFuZHMgYXJlIGVuY291bnRlcmVkLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB3b24ndCB3b3JrIGluIGEKIyBzYWZlIGludGVycHJldGVyLCBzaW5jZSBhIHNhZmUgaW50ZXJwcmV0ZXIgY2FuJ3QgY3JlYXRlIHRoZQojIHNwZWNpYWwgcGFyc2VyIGFuZCBtZXNzIHdpdGggaXRzIGNvbW1hbmRzLiAgCgppZiB7W2ludGVycCBpc3NhZmVdfSB7CiAgICByZXR1cm4JOyMgU3RvcCBzb3VyY2luZyB0aGUgZmlsZSBoZXJlCn0KCiMgYXV0b19ta2luZGV4IC0tCiMgUmVnZW5lcmF0ZSBhIHRjbEluZGV4IGZpbGUgZnJvbSBUY2wgc291cmNlIGZpbGVzLiAgVGFrZXMgYXMgYXJndW1lbnQKIyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSB0Y2xJbmRleCBmaWxlIGlzIHRvIGJlIHBsYWNlZCwKIyBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIGdsb2IgcGF0dGVybnMgdG8gdXNlIGluIHRoYXQgZGlyZWN0b3J5IHRvCiMgbG9jYXRlIGFsbCBvZiB0aGUgcmVsZXZhbnQgZmlsZXMuCiMKIyBBcmd1bWVudHM6IAojIGRpciAtCQlOYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gY3JlYXRlIGFuIGluZGV4LgojIGFyZ3MgLQlBbnkgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGdpdmluZyB0aGUKIwkJbmFtZXMgb2YgZmlsZXMgd2l0aGluIGRpci4gIElmIG5vIGFkZGl0aW9uYWwKIwkJYXJlIGdpdmVuIGF1dG9fbWtpbmRleCB3aWxsIGxvb2sgZm9yICoudGNsLgoKcHJvYyBhdXRvX21raW5kZXgge2RpciBhcmdzfSB7CiAgICBnbG9iYWwgZXJyb3JDb2RlIGVycm9ySW5mbwoKICAgIGlmIHtbaW50ZXJwIGlzc2FmZV19IHsKICAgICAgICBlcnJvciAiY2FuJ3QgZ2VuZXJhdGUgaW5kZXggd2l0aGluIHNhZmUgaW50ZXJwcmV0ZXIiCiAgICB9CgogICAgc2V0IG9sZERpciBbcHdkXQogICAgY2QgJGRpcgogICAgc2V0IGRpciBbcHdkXQoKICAgIGFwcGVuZCBpbmRleCAiIyBUY2wgYXV0b2xvYWQgaW5kZXggZmlsZSwgdmVyc2lvbiAyLjBcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBcImF1dG9fbWtpbmRleFwiIGNvbW1hbmRcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBhbmQgc291cmNlZCB0byBzZXQgdXAgaW5kZXhpbmcgaW5mb3JtYXRpb24gZm9yIG9uZSBvclxuIgogICAgYXBwZW5kIGluZGV4ICIjIG1vcmUgY29tbWFuZHMuICBUeXBpY2FsbHkgZWFjaCBsaW5lIGlzIGEgY29tbWFuZCB0aGF0XG4iCiAgICBhcHBlbmQgaW5kZXggIiMgc2V0cyBhbiBlbGVtZW50IGluIHRoZSBhdXRvX2luZGV4IGFycmF5LCB3aGVyZSB0aGVcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBlbGVtZW50IG5hbWUgaXMgdGhlIG5hbWUgb2YgYSBjb21tYW5kIGFuZCB0aGUgdmFsdWUgaXNcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBhIHNjcmlwdCB0aGF0IGxvYWRzIHRoZSBjb21tYW5kLlxuXG4iCiAgICBpZiB7JGFyZ3MgPT0gIiJ9IHsKCXNldCBhcmdzICoudGNsCiAgICB9CgogICAgYXV0b19ta2luZGV4X3BhcnNlcjo6aW5pdAogICAgZm9yZWFjaCBmaWxlIFtldmFsIGdsb2IgJGFyZ3NdIHsKICAgICAgICBpZiB7W2NhdGNoIHthdXRvX21raW5kZXhfcGFyc2VyOjpta2luZGV4ICRmaWxlfSBtc2ddID09IDB9IHsKICAgICAgICAgICAgYXBwZW5kIGluZGV4ICRtc2cKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzZXQgY29kZSAkZXJyb3JDb2RlCiAgICAgICAgICAgIHNldCBpbmZvICRlcnJvckluZm8KICAgICAgICAgICAgY2QgJG9sZERpcgogICAgICAgICAgICBlcnJvciAkbXNnICRpbmZvICRjb2RlCiAgICAgICAgfQogICAgfQogICAgYXV0b19ta2luZGV4X3BhcnNlcjo6Y2xlYW51cAoKICAgIHNldCBmaWQgW29wZW4gInRjbEluZGV4IiB3XQogICAgcHV0cyAtbm9uZXdsaW5lICRmaWQgJGluZGV4CiAgICBjbG9zZSAkZmlkCiAgICBjZCAkb2xkRGlyCn0KCiMgT3JpZ2luYWwgdmVyc2lvbiBvZiBhdXRvX21raW5kZXggdGhhdCBqdXN0IHNlYXJjaGVzIHRoZSBzb3VyY2UKIyBjb2RlIGZvciAicHJvYyIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4KCnByb2MgYXV0b19ta2luZGV4X29sZCB7ZGlyIGFyZ3N9IHsKICAgIGdsb2JhbCBlcnJvckNvZGUgZXJyb3JJbmZvCiAgICBzZXQgb2xkRGlyIFtwd2RdCiAgICBjZCAkZGlyCiAgICBzZXQgZGlyIFtwd2RdCiAgICBhcHBlbmQgaW5kZXggIiMgVGNsIGF1dG9sb2FkIGluZGV4IGZpbGUsIHZlcnNpb24gMi4wXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSB0aGUgXCJhdXRvX21raW5kZXhcIiBjb21tYW5kXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgYW5kIHNvdXJjZWQgdG8gc2V0IHVwIGluZGV4aW5nIGluZm9ybWF0aW9uIGZvciBvbmUgb3JcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBtb3JlIGNvbW1hbmRzLiAgVHlwaWNhbGx5IGVhY2ggbGluZSBpcyBhIGNvbW1hbmQgdGhhdFxuIgogICAgYXBwZW5kIGluZGV4ICIjIHNldHMgYW4gZWxlbWVudCBpbiB0aGUgYXV0b19pbmRleCBhcnJheSwgd2hlcmUgdGhlXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgZWxlbWVudCBuYW1lIGlzIHRoZSBuYW1lIG9mIGEgY29tbWFuZCBhbmQgdGhlIHZhbHVlIGlzXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgYSBzY3JpcHQgdGhhdCBsb2FkcyB0aGUgY29tbWFuZC5cblxuIgogICAgaWYge1tzdHJpbmcgZXF1YWwgJGFyZ3MgIiJdfSB7CglzZXQgYXJncyAqLnRjbAogICAgfQogICAgZm9yZWFjaCBmaWxlIFtldmFsIGdsb2IgJGFyZ3NdIHsKCXNldCBmICIiCglzZXQgZXJyb3IgW2NhdGNoIHsKCSAgICBzZXQgZiBbb3BlbiAkZmlsZV0KCSAgICB3aGlsZSB7W2dldHMgJGYgbGluZV0gPj0gMH0gewoJCWlmIHtbcmVnZXhwIHtecHJvY1sgCV0rKFteIAldKil9ICRsaW5lIG1hdGNoIHByb2NOYW1lXX0gewoJCSAgICBzZXQgcHJvY05hbWUgW2xpbmRleCBbYXV0b19xdWFsaWZ5ICRwcm9jTmFtZSAiOjoiXSAwXQoJCSAgICBhcHBlbmQgaW5kZXggInNldCBbbGlzdCBhdXRvX2luZGV4KCRwcm9jTmFtZSldIgoJCSAgICBhcHBlbmQgaW5kZXggIiBcW2xpc3Qgc291cmNlIFxbZmlsZSBqb2luIFwkZGlyIFtsaXN0ICRmaWxlXVxdXF1cbiIKCQl9CgkgICAgfQoJICAgIGNsb3NlICRmCgl9IG1zZ10KCWlmIHskZXJyb3J9IHsKCSAgICBzZXQgY29kZSAkZXJyb3JDb2RlCgkgICAgc2V0IGluZm8gJGVycm9ySW5mbwoJICAgIGNhdGNoIHtjbG9zZSAkZn0KCSAgICBjZCAkb2xkRGlyCgkgICAgZXJyb3IgJG1zZyAkaW5mbyAkY29kZQoJfQogICAgfQogICAgc2V0IGYgIiIKICAgIHNldCBlcnJvciBbY2F0Y2ggewoJc2V0IGYgW29wZW4gdGNsSW5kZXggd10KCXB1dHMgLW5vbmV3bGluZSAkZiAkaW5kZXgKCWNsb3NlICRmCgljZCAkb2xkRGlyCiAgICB9IG1zZ10KICAgIGlmIHskZXJyb3J9IHsKCXNldCBjb2RlICRlcnJvckNvZGUKCXNldCBpbmZvICRlcnJvckluZm8KCWNhdGNoIHtjbG9zZSAkZn0KCWNkICRvbGREaXIKCWVycm9yICRtc2cgJGluZm8gJGNvZGUKICAgIH0KfQoKIyBDcmVhdGUgYSBzYWZlIGludGVycHJldGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgVGNsIHNvdXJjZSBmaWxlcwojIGdlbmVyYXRlIGEgdGNsSW5kZXggZmlsZSBmb3IgYXV0b2xvYWRpbmcuICBUaGlzIGludGVycCBjb250YWlucwojIGNvbW1hbmRzIGZvciB0aGluZ3MgdGhhdCBuZWVkIGluZGV4IGVudHJpZXMuICBFYWNoIHRpbWUgYSBjb21tYW5kCiMgaXMgZXhlY3V0ZWQsIGl0IHdyaXRlcyBhbiBlbnRyeSBvdXQgdG8gdGhlIGluZGV4IGZpbGUuCgpuYW1lc3BhY2UgZXZhbCBhdXRvX21raW5kZXhfcGFyc2VyIHsKICAgIHZhcmlhYmxlIHBhcnNlciAiIiAgICAgICAgICA7IyBwYXJzZXIgdXNlZCB0byBidWlsZCBpbmRleAogICAgdmFyaWFibGUgaW5kZXggIiIgICAgICAgICAgIDsjIG1haW50YWlucyBpbmRleCBhcyBpdCBpcyBidWlsdAogICAgdmFyaWFibGUgc2NyaXB0RmlsZSAiIiAgICAgIDsjIG5hbWUgb2YgZmlsZSBiZWluZyBwcm9jZXNzZWQKICAgIHZhcmlhYmxlIGNvbnRleHRTdGFjayAiIiAgICA7IyBzdGFjayBvZiBuYW1lc3BhY2Ugc2NvcGVzCiAgICB2YXJpYWJsZSBpbXBvcnRzICIiICAgICAgICAgOyMga2VlcHMgdHJhY2sgb2YgYWxsIGltcG9ydGVkIGNtZHMKICAgIHZhcmlhYmxlIGluaXRDb21tYW5kcyAiIiAgICA7IyBsaXN0IG9mIGNvbW1hbmRzIHRoYXQgY3JlYXRlIGFsaWFzZXMKCiAgICBwcm9jIGluaXQge30gewoJdmFyaWFibGUgcGFyc2VyCgl2YXJpYWJsZSBpbml0Q29tbWFuZHMKCglpZiB7IVtpbnRlcnAgaXNzYWZlXX0gewoJICAgIHNldCBwYXJzZXIgW2ludGVycCBjcmVhdGUgLXNhZmVdCgkgICAgJHBhcnNlciBoaWRlIGluZm8KCSAgICAkcGFyc2VyIGhpZGUgcmVuYW1lCgkgICAgJHBhcnNlciBoaWRlIHByb2MKCSAgICAkcGFyc2VyIGhpZGUgbmFtZXNwYWNlCgkgICAgJHBhcnNlciBoaWRlIGV2YWwKCSAgICAkcGFyc2VyIGhpZGUgcHV0cwoJICAgICRwYXJzZXIgaW52b2tlaGlkZGVuIG5hbWVzcGFjZSBkZWxldGUgOjoKCSAgICAkcGFyc2VyIGludm9rZWhpZGRlbiBwcm9jIHVua25vd24ge2FyZ3N9IHt9CgoJICAgICMgV2UnbGwgbmVlZCBhY2Nlc3MgdG8gdGhlICJuYW1lc3BhY2UiIGNvbW1hbmQgd2l0aGluIHRoZQoJICAgICMgaW50ZXJwLiAgUHV0IGl0IGJhY2ssIGJ1dCBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5LgoKCSAgICAkcGFyc2VyIGV4cG9zZSBuYW1lc3BhY2UKCSAgICAkcGFyc2VyIGludm9rZWhpZGRlbiByZW5hbWUgbmFtZXNwYWNlIF8lQG5hbWVzcGFjZQoJICAgICRwYXJzZXIgZXhwb3NlIGV2YWwKCSAgICAkcGFyc2VyIGludm9rZWhpZGRlbiByZW5hbWUgZXZhbCBfJUBldmFsCgoJICAgICMgSW5zdGFsbCBhbGwgdGhlIHJlZ2lzdGVyZWQgcHN1ZWRvLWNvbW1hbmQgaW1wbGVtZW50YXRpb25zCgoJICAgIGZvcmVhY2ggY21kICRpbml0Q29tbWFuZHMgewoJCWV2YWwgJGNtZAoJICAgIH0KCX0KICAgIH0KICAgIHByb2MgY2xlYW51cCB7fSB7Cgl2YXJpYWJsZSBwYXJzZXIKCWludGVycCBkZWxldGUgJHBhcnNlcgoJdW5zZXQgcGFyc2VyCiAgICB9Cn0KCiMgYXV0b19ta2luZGV4X3BhcnNlcjo6bWtpbmRleCAtLQojCiMgVXNlZCBieSB0aGUgImF1dG9fbWtpbmRleCIgY29tbWFuZCB0byBjcmVhdGUgYSAidGNsSW5kZXgiIGZpbGUgZm9yCiMgdGhlIGdpdmVuIFRjbCBzb3VyY2UgZmlsZS4gIEV4ZWN1dGVzIHRoZSBjb21tYW5kcyBpbiB0aGUgZmlsZSwgYW5kCiMgaGFuZGxlcyB0aGluZ3MgbGlrZSB0aGUgInByb2MiIGNvbW1hbmQgYnkgYWRkaW5nIGFuIGVudHJ5IGZvciB0aGUKIyBpbmRleCBmaWxlLiAgUmV0dXJucyBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgdGhlIGluZGV4IGZpbGUuCiMKIyBBcmd1bWVudHM6IAojCWZpbGUJTmFtZSBvZiBUY2wgc291cmNlIGZpbGUgdG8gYmUgaW5kZXhlZC4KCnByb2MgYXV0b19ta2luZGV4X3BhcnNlcjo6bWtpbmRleCB7ZmlsZX0gewogICAgdmFyaWFibGUgcGFyc2VyCiAgICB2YXJpYWJsZSBpbmRleAogICAgdmFyaWFibGUgc2NyaXB0RmlsZQogICAgdmFyaWFibGUgY29udGV4dFN0YWNrCiAgICB2YXJpYWJsZSBpbXBvcnRzCgogICAgc2V0IHNjcmlwdEZpbGUgJGZpbGUKCiAgICBzZXQgZmlkIFtvcGVuICRmaWxlXQogICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWRdCiAgICBjbG9zZSAkZmlkCgogICAgIyBUaGVyZSBpcyBvbmUgcHJvYmxlbSB3aXRoIHNvdXJjaW5nIGZpbGVzIGludG8gdGhlIHNhZmUKICAgICMgaW50ZXJwcmV0ZXI6ICByZWZlcmVuY2VzIGxpa2UgIiR4IiB3aWxsIGZhaWwgc2luY2UgY29kZSBpcyBub3QKICAgICMgcmVhbGx5IGJlaW5nIGV4ZWN1dGVkIGFuZCB2YXJpYWJsZXMgZG8gbm90IHJlYWxseSBleGlzdC4KICAgICMgVG8gYXZvaWQgdGhpcywgd2UgcmVwbGFjZSBhbGwgJCB3aXRoIFwwIChsaXRlcmFsbHksIHRoZSBudWxsIGNoYXIpCiAgICAjIGxhdGVyLCB3aGVuIGdldHRpbmcgcHJvYyBuYW1lcyB3ZSB3aWxsIGhhdmUgdG8gcmV2ZXJzZSB0aGlzIHJlcGxhY2VtZW50LAogICAgIyBpbiBjYXNlIHRoZXJlIHdlcmUgYW55ICQgaW4gdGhlIHByb2MgbmFtZS4gIFRoaXMgd2lsbCBjYXVzZSBhIHByb2JsZW0KICAgICMgaWYgc29tZWJvZHkgYWN0dWFsbHkgdHJpZXMgdG8gaGF2ZSBhIFwwIGluIHRoZWlyIHByb2MgbmFtZS4gIFRvbyBiYWQKICAgICMgZm9yIHRoZW0uCiAgICByZWdzdWIgLWFsbCB7XCR9ICRjb250ZW50cyAiXDAiIGNvbnRlbnRzCiAgICAKICAgIHNldCBpbmRleCAiIgogICAgc2V0IGNvbnRleHRTdGFjayAiIgogICAgc2V0IGltcG9ydHMgIiIKCiAgICAkcGFyc2VyIGV2YWwgJGNvbnRlbnRzCgogICAgZm9yZWFjaCBuYW1lICRpbXBvcnRzIHsKICAgICAgICBjYXRjaCB7JHBhcnNlciBldmFsIFtsaXN0IF8lQG5hbWVzcGFjZSBmb3JnZXQgJG5hbWVdfQogICAgfQogICAgcmV0dXJuICRpbmRleAp9CgojIGF1dG9fbWtpbmRleF9wYXJzZXI6Omhvb2sgY29tbWFuZAojCiMgUmVnaXN0ZXJzIGEgVGNsIGNvbW1hbmQgdG8gZXZhbHVhdGUgd2hlbiBpbml0aWFsaXppbmcgdGhlCiMgc2xhdmUgaW50ZXJwcmV0ZXIgdXNlZCBieSB0aGUgbWtpbmRleCBwYXJzZXIuCiMgVGhlIGNvbW1hbmQgaXMgZXZhbHVhdGVkIGluIHRoZSBtYXN0ZXIgaW50ZXJwcmV0ZXIsIGFuZCBjYW4KIyB1c2UgdGhlIHZhcmlhYmxlIGF1dG9fbWtpbmRleF9wYXJzZXI6OnBhcnNlciB0byBnZXQgdG8gdGhlIHNsYXZlCgpwcm9jIGF1dG9fbWtpbmRleF9wYXJzZXI6Omhvb2sge2NtZH0gewogICAgdmFyaWFibGUgaW5pdENvbW1hbmRzCgogICAgbGFwcGVuZCBpbml0Q29tbWFuZHMgJGNtZAp9CgojIGF1dG9fbWtpbmRleF9wYXJzZXI6OnNsYXZlaG9vayBjb21tYW5kCiMKIyBSZWdpc3RlcnMgYSBUY2wgY29tbWFuZCB0byBldmFsdWF0ZSB3aGVuIGluaXRpYWxpemluZyB0aGUKIyBzbGF2ZSBpbnRlcnByZXRlciB1c2VkIGJ5IHRoZSBta2luZGV4IHBhcnNlci4KIyBUaGUgY29tbWFuZCBpcyBldmFsdWF0ZWQgaW4gdGhlIHNsYXZlIGludGVycHJldGVyLgoKcHJvYyBhdXRvX21raW5kZXhfcGFyc2VyOjpzbGF2ZWhvb2sge2NtZH0gewogICAgdmFyaWFibGUgaW5pdENvbW1hbmRzCgogICAgIyBUaGUgJHBhcnNlciB2YXJpYWJsZSBpcyBkZWZpbmVkIHRvIGJlIHRoZSBuYW1lIG9mIHRoZQogICAgIyBzbGF2ZSBpbnRlcnByZXRlciB3aGVuIHRoaXMgY29tbWFuZCBpcyB1c2VkIGxhdGVyLgoKICAgIGxhcHBlbmQgaW5pdENvbW1hbmRzICJcJHBhcnNlciBldmFsIFtsaXN0ICRjbWRdIgp9CgojIGF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmQgLS0KIwojIFJlZ2lzdGVycyBhIG5ldyBjb21tYW5kIHdpdGggdGhlICJhdXRvX21raW5kZXhfcGFyc2VyIiBpbnRlcnByZXRlcgojIHRoYXQgcGFyc2VzIFRjbCBmaWxlcy4gIFRoZXNlIGNvbW1hbmRzIGFyZSBmYWtlIHZlcnNpb25zIG9mIHRoaW5ncwojIGxpa2UgdGhlICJwcm9jIiBjb21tYW5kLiAgV2hlbiB5b3UgZXhlY3V0ZSB0aGVtLCB0aGV5IHNpbXBseSB3cml0ZQojIG91dCBhbiBlbnRyeSB0byBhICJ0Y2xJbmRleCIgZmlsZSBmb3IgYXV0by1sb2FkaW5nLgojCiMgVGhpcyBwcm9jZWR1cmUgYWxsb3dzIGV4dGVuc2lvbnMgdG8gcmVnaXN0ZXIgdGhlaXIgb3duIGNvbW1hbmRzCiMgd2l0aCB0aGUgYXV0b19ta2luZGV4IGZhY2lsaXR5LiAgRm9yIGV4YW1wbGUsIGEgcGFja2FnZSBsaWtlCiMgW2luY3IgVGNsXSBtaWdodCByZWdpc3RlciBhICJjbGFzcyIgY29tbWFuZCBzbyB0aGF0IGNsYXNzIGRlZmluaXRpb25zCiMgY291bGQgYmUgYWRkZWQgdG8gYSAidGNsSW5kZXgiIGZpbGUgZm9yIGF1dG8tbG9hZGluZy4KIwojIEFyZ3VtZW50czoKIwluYW1lIAlOYW1lIG9mIGNvbW1hbmQgcmVjb2duaXplZCBpbiBUY2wgZmlsZXMuCiMJYXJnbGlzdAlBcmd1bWVudCBsaXN0IGZvciBjb21tYW5kLgojCWJvZHkgCUltcGxlbWVudGF0aW9uIG9mIGNvbW1hbmQgdG8gaGFuZGxlIGluZGV4aW5nLgoKcHJvYyBhdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kIHtuYW1lIGFyZ2xpc3QgYm9keX0gewogICAgaG9vayBbbGlzdCBhdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kSW5pdCAkbmFtZSAkYXJnbGlzdCAkYm9keV0KfQoKIyBhdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kSW5pdCAtLQojCiMgVGhpcyBkb2VzIHRoZSBhY3R1YWwgd29yayBzZXQgdXAgYnkgYXV0b19ta2luZGV4X3BhcnNlcjo6Y29tbWFuZAojIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGludGVycHJldGVyIHVzZWQgYnkgdGhlIHBhcnNlciBpcyBjcmVhdGVkLgojCiMgQXJndW1lbnRzOgojCW5hbWUgCU5hbWUgb2YgY29tbWFuZCByZWNvZ25pemVkIGluIFRjbCBmaWxlcy4KIwlhcmdsaXN0CUFyZ3VtZW50IGxpc3QgZm9yIGNvbW1hbmQuCiMJYm9keSAJSW1wbGVtZW50YXRpb24gb2YgY29tbWFuZCB0byBoYW5kbGUgaW5kZXhpbmcuCgpwcm9jIGF1dG9fbWtpbmRleF9wYXJzZXI6OmNvbW1hbmRJbml0IHtuYW1lIGFyZ2xpc3QgYm9keX0gewogICAgdmFyaWFibGUgcGFyc2VyCgogICAgc2V0IG5zIFtuYW1lc3BhY2UgcXVhbGlmaWVycyAkbmFtZV0KICAgIHNldCB0YWlsIFtuYW1lc3BhY2UgdGFpbCAkbmFtZV0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICRucyAiIl19IHsKICAgICAgICBzZXQgZmFrZU5hbWUgIltuYW1lc3BhY2UgY3VycmVudF06Ol8lQGZha2VfJHRhaWwiCiAgICB9IGVsc2UgewogICAgICAgIHNldCBmYWtlTmFtZSAiXyVAZmFrZV8kbmFtZSIKICAgICAgICByZWdzdWIgLWFsbCB7Ojp9ICRmYWtlTmFtZSAiXyIgZmFrZU5hbWUKICAgICAgICBzZXQgZmFrZU5hbWUgIltuYW1lc3BhY2UgY3VycmVudF06OiRmYWtlTmFtZSIKICAgIH0KICAgIHByb2MgJGZha2VOYW1lICRhcmdsaXN0ICRib2R5CgogICAgIyBZVUshICBUY2wgd29uJ3QgbGV0IHVzIGFsaWFzIGZ1bGx5IHF1YWxpZmllZCBjb21tYW5kIG5hbWVzLAogICAgIyBzbyB3ZSBjYW4ndCBoYW5kbGUgbmFtZXMgbGlrZSAiOjppdGNsOjpjbGFzcyIuICBJbnN0ZWFkLAogICAgIyB3ZSBoYXZlIHRvIGJ1aWxkIHByb2NzIHdpdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lcywgYW5kCiAgICAjIGhhdmUgdGhlIHByb2NzIHBvaW50IHRvIHRoZSBhbGlhc2VzLgoKICAgIGlmIHtbcmVnZXhwIHs6On0gJG5hbWVdfSB7CiAgICAgICAgc2V0IGV4cG9ydENtZCBbbGlzdCBfJUBuYW1lc3BhY2UgZXhwb3J0IFtuYW1lc3BhY2UgdGFpbCAkbmFtZV1dCiAgICAgICAgJHBhcnNlciBldmFsIFtsaXN0IF8lQG5hbWVzcGFjZSBldmFsICRucyAkZXhwb3J0Q21kXQogCgkjIFRoZSBmb2xsb3dpbmcgcHJvYyBkZWZpbml0aW9uIGRvZXMgbm90IHdvcmsgaWYgeW91CgkjIHdhbnQgdG8gdG9sZXJhdGUgc3BhY2Ugb3Igc29tZXRoaW5nIGVsc2UgZGlhYm9saWNhbAoJIyBpbiB0aGUgcHJvY2VkdXJlIG5hbWUsIChpLmUuLCBzcGFjZSBpbiAkYWxpYXMpCgkjIFRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgd29yazoKCSMgICAiXyVAZXZhbCB7JGFsaWFzfSBcJGFyZ3MiCgkjIGJlY2F1c2UgJGFsaWFzIGdldHMgY29uY2F0J2VkIHRvICRhcmdzLgoJIyBUaGUgZm9sbG93aW5nIGRvZXMgbm90IHdvcmsgYmVjYXVzZSAkY21kIGlzIHNvbWVob3cgdW5kZWZpbmVkCgkjICAgInNldCBjbWQgeyRhbGlhc30gXDsgXyVAZXZhbCB7XCRjbWR9IFwkYXJncyIKCSMgQSBnb2xkIHN0YXIgdG8gc29tZW9uZSB0aGF0IGNhbiBtYWtlIHRlc3QKCSMgYXV0b01raW5kZXgtMy4zIHdvcmsgcHJvcGVybHkKCiAgICAgICAgc2V0IGFsaWFzIFtuYW1lc3BhY2UgdGFpbCAkZmFrZU5hbWVdCiAgICAgICAgJHBhcnNlciBpbnZva2VoaWRkZW4gcHJvYyAkbmFtZSB7YXJnc30gIl8lQGV2YWwgeyRhbGlhc30gXCRhcmdzIgogICAgICAgICRwYXJzZXIgYWxpYXMgJGFsaWFzICRmYWtlTmFtZQogICAgfSBlbHNlIHsKICAgICAgICAkcGFyc2VyIGFsaWFzICRuYW1lICRmYWtlTmFtZQogICAgfQogICAgcmV0dXJuCn0KCiMgYXV0b19ta2luZGV4X3BhcnNlcjo6ZnVsbG5hbWUgLS0KIyBVc2VkIGJ5IGNvbW1hbmRzIGxpa2UgInByb2MiIHdpdGhpbiB0aGUgYXV0b19ta2luZGV4IHBhcnNlci4KIyBSZXR1cm5zIHRoZSBxdWFsaWZpZWQgbmFtZXNwYWNlIG5hbWUgZm9yIHRoZSAibmFtZSIgYXJndW1lbnQuCiMgSWYgdGhlICJuYW1lIiBkb2VzIG5vdCBzdGFydCB3aXRoICI6OiIsIGVsZW1lbnRzIGFyZSBhZGRlZCBmcm9tCiMgdGhlIGN1cnJlbnQgbmFtZXNwYWNlIHN0YWNrIHRvIHByb2R1Y2UgYSBxdWFsaWZpZWQgbmFtZS4gIFRoZW4sCiMgdGhlIG5hbWUgaXMgZXhhbWluZWQgdG8gc2VlIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCByZWFsbHkgYmUKIyBxdWFsaWZpZWQuICBJZiB0aGUgbmFtZSBoYXMgbW9yZSB0aGFuIHRoZSBsZWFkaW5nICI6OiIsIGl0IGlzCiMgcmV0dXJuZWQgYXMgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4gIE90aGVyd2lzZSwgaXQgaXMgcmV0dXJuZWQKIyBhcyBhIHNpbXBsZSBuYW1lLiAgVGhhdCB3YXksIHRoZSBUY2wgYXV0b2xvYWRlciB3aWxsIHJlY29nbml6ZQojIGl0IHByb3Blcmx5LgojCiMgQXJndW1lbnRzOgojIG5hbWUgLQkJTmFtZSB0aGF0IGlzIGJlaW5nIGFkZGVkIHRvIGluZGV4LgoKcHJvYyBhdXRvX21raW5kZXhfcGFyc2VyOjpmdWxsbmFtZSB7bmFtZX0gewogICAgdmFyaWFibGUgY29udGV4dFN0YWNrCgogICAgaWYgeyFbc3RyaW5nIG1hdGNoIDo6KiAkbmFtZV19IHsKICAgICAgICBmb3JlYWNoIG5zICRjb250ZXh0U3RhY2sgewogICAgICAgICAgICBzZXQgbmFtZSAiJHtuc306OiRuYW1lIgogICAgICAgICAgICBpZiB7W3N0cmluZyBtYXRjaCA6OiogJG5hbWVdfSB7CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmIHtbc3RyaW5nIGVxdWFsIFtuYW1lc3BhY2UgcXVhbGlmaWVycyAkbmFtZV0gIiJdfSB7CiAgICAgICAgc2V0IG5hbWUgW25hbWVzcGFjZSB0YWlsICRuYW1lXQogICAgfSBlbHNlaWYgeyFbc3RyaW5nIG1hdGNoIDo6KiAkbmFtZV19IHsKICAgICAgICBzZXQgbmFtZSAiOjokbmFtZSIKICAgIH0KICAgIAogICAgIyBFYXJsaWVyLCBta2luZGV4IHJlcGxhY2VkIGFsbCAkJ3Mgd2l0aCBcMC4gIE5vdywgd2UgaGF2ZSB0byByZXZlcnNlCiAgICAjIHRoYXQgcmVwbGFjZW1lbnQuCiAgICByZWdzdWIgLWFsbCAiXDAiICRuYW1lICJcJCIgbmFtZQogICAgcmV0dXJuICRuYW1lCn0KCiMgUmVnaXN0ZXIgYWxsIG9mIHRoZSBwcm9jZWR1cmVzIGZvciB0aGUgYXV0b19ta2luZGV4IHBhcnNlciB0aGF0CiMgd2lsbCBidWlsZCB0aGUgInRjbEluZGV4IiBmaWxlLgoKIyBBVVRPIE1LSU5ERVg6ICBwcm9jIG5hbWUgYXJnbGlzdCBib2R5CiMgQWRkcyBhbiBlbnRyeSB0byB0aGUgYXV0byBpbmRleCBsaXN0IGZvciB0aGUgZ2l2ZW4gcHJvY2VkdXJlIG5hbWUuCgphdXRvX21raW5kZXhfcGFyc2VyOjpjb21tYW5kIHByb2Mge25hbWUgYXJnc30gewogICAgdmFyaWFibGUgaW5kZXgKICAgIHZhcmlhYmxlIHNjcmlwdEZpbGUKICAgICMgRG8gc29tZSBmYW5jeSByZWZvcm1hdHRpbmcgb24gdGhlICJzb3VyY2UiIGNhbGwgdG8gaGFuZGxlIHBsYXRmb3JtCiAgICAjIGRpZmZlcmVuY2VzIHdpdGggcmVzcGVjdCB0byBwYXRobmFtZXMuICBVc2UgZm9ybWF0IGp1c3Qgc28gdGhhdCB0aGUKICAgICMgY29tbWFuZCBpcyBhIGxpdHRsZSBlYXNpZXIgdG8gcmVhZCAob3RoZXJ3aXNlIGl0J2QgYmUgZnVsbCBvZiAKICAgICMgYmFja3NsYXNoZWQgZG9sbGFyIHNpZ25zLCBldGMuCiAgICBhcHBlbmQgaW5kZXggW2xpc3Qgc2V0IGF1dG9faW5kZXgoW2Z1bGxuYW1lICRuYW1lXSldIFwKCSAgICBbZm9ybWF0IHsgW2xpc3Qgc291cmNlIFtmaWxlIGpvaW4gJGRpciAlc11dfSBcCgkgICAgW2ZpbGUgc3BsaXQgJHNjcmlwdEZpbGVdXSAiXG4iCn0KCiMgQ29uZGl0aW9uYWxseSBhZGQgc3VwcG9ydCBmb3IgVGNsIGJ5dGUgY29kZSBmaWxlcy4gIFRoZXJlIGFyZSBzb21lCiMgdHJpY2t5IGRldGFpbHMgaGVyZS4gIEZpcnN0LCB3ZSBuZWVkIHRvIGdldCB0aGUgdGJjbG9hZCBsaWJyYXJ5CiMgaW5pdGlhbGl6ZWQgaW4gdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIuICBXZSBjYW5ub3QgbG9hZCB0YmNsb2FkIGludG8gdGhlCiMgc2xhdmUgdW50aWwgd2UgaGF2ZSBkb25lIHNvIGJlY2F1c2UgaXQgbmVlZHMgYWNjZXNzIHRvIHRoZSB0Y2xfcGF0Y2hMZXZlbAojIHZhcmlhYmxlLiAgU2Vjb25kLCBiZWNhdXNlIHRoZSBwYWNrYWdlIGluZGV4IGZpbGUgbWF5IGRlZmVyIGxvYWRpbmcgdGhlCiMgbGlicmFyeSB1bnRpbCB3ZSBpbnZva2UgYSBjb21tYW5kLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgaW52b2tlIGF1dG9fbG9hZAojIHRvIGZvcmNlIGl0IHRvIGJlIGxvYWRlZC4gIFRoaXMgc2hvdWxkIGJlIGEgbm9vcCBpZiB0aGUgcGFja2FnZSBoYXMKIyBhbHJlYWR5IGJlZW4gbG9hZGVkCgphdXRvX21raW5kZXhfcGFyc2VyOjpob29rIHsKICAgIGlmIHshW2NhdGNoIHtwYWNrYWdlIHJlcXVpcmUgdGJjbG9hZH1dfSB7CglpZiB7W2xsZW5ndGggW2luZm8gY29tbWFuZHMgdGJjbG9hZDo6YmNwcm9jXV0gPT0gMH0gewoJICAgIGF1dG9fbG9hZCB0YmNsb2FkOjpiY3Byb2MKCX0KCWxvYWQge30gdGJjbG9hZCAkYXV0b19ta2luZGV4X3BhcnNlcjo6cGFyc2VyCgoJIyBBVVRPIE1LSU5ERVg6ICB0YmNsb2FkOjpiY3Byb2MgbmFtZSBhcmdsaXN0IGJvZHkKCSMgQWRkcyBhbiBlbnRyeSB0byB0aGUgYXV0byBpbmRleCBsaXN0IGZvciB0aGUgZ2l2ZW4gcHJlLWNvbXBpbGVkCgkjIHByb2NlZHVyZSBuYW1lLiAgCgoJYXV0b19ta2luZGV4X3BhcnNlcjo6Y29tbWFuZEluaXQgdGJjbG9hZDo6YmNwcm9jIHtuYW1lIGFyZ3N9IHsKCSAgICB2YXJpYWJsZSBpbmRleAoJICAgIHZhcmlhYmxlIHNjcmlwdEZpbGUKCSAgICAjIERvIHNvbWUgbmljZSByZWZvcm1hdHRpbmcgb2YgdGhlICJzb3VyY2UiIGNhbGwsIHRvIGdldCBhcm91bmQKCSAgICAjIHBhdGggZGlmZmVyZW5jZXMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIFdlIHVzZSB0aGUgZm9ybWF0CgkgICAgIyBjb21tYW5kIGp1c3Qgc28gdGhhdCB0aGUgY29kZSBpcyBhIGxpdHRsZSBlYXNpZXIgdG8gcmVhZC4KCSAgICBhcHBlbmQgaW5kZXggW2xpc3Qgc2V0IGF1dG9faW5kZXgoW2Z1bGxuYW1lICRuYW1lXSldIFwKCQkgICAgW2Zvcm1hdCB7IFtsaXN0IHNvdXJjZSBbZmlsZSBqb2luICRkaXIgJXNdXX0gXAoJCSAgICBbZmlsZSBzcGxpdCAkc2NyaXB0RmlsZV1dICJcbiIKCX0KICAgIH0KfQoKIyBBVVRPIE1LSU5ERVg6ICBuYW1lc3BhY2UgZXZhbCBuYW1lIGNvbW1hbmQgP2FyZyBhcmcuLi4/CiMgQWRkcyB0aGUgbmFtZXNwYWNlIG5hbWUgb250byB0aGUgY29udGV4dCBzdGFjayBhbmQgZXZhbHVhdGVzIHRoZQojIGFzc29jaWF0ZWQgYm9keSBvZiBjb21tYW5kcy4KIwojIEFVVE8gTUtJTkRFWDogIG5hbWVzcGFjZSBpbXBvcnQgPy1mb3JjZT8gcGF0dGVybiA/cGF0dGVybi4uLj8KIyBQZXJmb3JtcyB0aGUgImltcG9ydCIgYWN0aW9uIGluIHRoZSBwYXJzZXIgaW50ZXJwcmV0ZXIuICBUaGlzIGlzCiMgaW1wb3J0YW50IGZvciBhbnkgY29tbWFuZHMgY29udGFpbmVkIGluIGEgbmFtZXNwYWNlIHRoYXQgYWZmZWN0CiMgdGhlIGluZGV4LiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IG1heSBzYXkgIml0Y2w6OmNsYXNzIC4uLiIsCiMgb3IgaXQgbWF5IGltcG9ydCAiaXRjbDo6KiIgYW5kIHRoZW4gc2F5ICJjbGFzcyAuLi4iLiAgVGhpcwojIHByb2NlZHVyZSBkb2VzIHRoZSBpbXBvcnQgb3BlcmF0aW9uLCBidXQga2VlcHMgdHJhY2sgb2YgaW1wb3J0ZWQKIyBwYXR0ZXJucyBzbyB3ZSBjYW4gcmVtb3ZlIHRoZSBpbXBvcnRzIGxhdGVyLgoKYXV0b19ta2luZGV4X3BhcnNlcjo6Y29tbWFuZCBuYW1lc3BhY2Uge29wIGFyZ3N9IHsKICAgIHN3aXRjaCAtLSAkb3AgewogICAgICAgIGV2YWwgewogICAgICAgICAgICB2YXJpYWJsZSBwYXJzZXIKICAgICAgICAgICAgdmFyaWFibGUgY29udGV4dFN0YWNrCgogICAgICAgICAgICBzZXQgbmFtZSBbbGluZGV4ICRhcmdzIDBdCiAgICAgICAgICAgIHNldCBhcmdzIFtscmFuZ2UgJGFyZ3MgMSBlbmRdCgogICAgICAgICAgICBzZXQgY29udGV4dFN0YWNrIFtsaW5zZXJ0ICRjb250ZXh0U3RhY2sgMCAkbmFtZV0KCSAgICAkcGFyc2VyIGV2YWwgW2xpc3QgXyVAbmFtZXNwYWNlIGV2YWwgJG5hbWVdICRhcmdzCiAgICAgICAgICAgIHNldCBjb250ZXh0U3RhY2sgW2xyYW5nZSAkY29udGV4dFN0YWNrIDEgZW5kXQogICAgICAgIH0KICAgICAgICBpbXBvcnQgewogICAgICAgICAgICB2YXJpYWJsZSBwYXJzZXIKICAgICAgICAgICAgdmFyaWFibGUgaW1wb3J0cwogICAgICAgICAgICBmb3JlYWNoIHBhdHRlcm4gJGFyZ3MgewogICAgICAgICAgICAgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkcGF0dGVybiAiLWZvcmNlIl19IHsKICAgICAgICAgICAgICAgICAgICBsYXBwZW5kIGltcG9ydHMgJHBhdHRlcm4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCB7JHBhcnNlciBldmFsICJfJUBuYW1lc3BhY2UgaW1wb3J0ICRhcmdzIn0KICAgICAgICB9CiAgICB9Cn0KCnJldHVybgoAAEg8IyBwYWNrYWdlLnRjbCAtLQojCiMgdXRpbGl0eSBwcm9jcyBmb3JtZXJseSBpbiBpbml0LnRjbCB3aGljaCBjYW4gYmUgbG9hZGVkIG9uIGRlbWFuZAojIGZvciBwYWNrYWdlIG1hbmFnZW1lbnQuCiMKIyBSQ1M6IEAoIykgJElkOiBwYWNrYWdlLnRjbCx2IDEuMTEgMjAwMC8wMi8wNyAyMjozMzoxNyBlcmljbSBFeHAgJAojCiMgQ29weXJpZ2h0IChjKSAxOTkxLTE5OTMgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KIyBDb3B5cmlnaHQgKGMpIDE5OTQtMTk5OCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIENyZWF0ZSB0aGUgcGFja2FnZSBuYW1lc3BhY2UKbmFtZXNwYWNlIGV2YWwgOjpwa2cgewp9CgojIHBrZ19jb21wYXJlRXh0ZW5zaW9uIC0tCiMKIyAgVXNlZCBpbnRlcm5hbGx5IGJ5IHBrZ19ta0luZGV4IHRvIGNvbXBhcmUgdGhlIGV4dGVuc2lvbiBvZiBhIGZpbGUgdG8KIyAgYSBnaXZlbiBleHRlbnNpb24uIE9uIFdpbmRvd3MsIGl0IHVzZXMgYSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24KIyAgYmVjYXVzZSB0aGUgZmlsZSBzeXN0ZW0gY2FuIGJlIGZpbGUgaW5zZW5zaXRpdmUuCiMKIyBBcmd1bWVudHM6CiMgIGZpbGVOYW1lCW5hbWUgb2YgYSBmaWxlIHdob3NlIGV4dGVuc2lvbiBpcyBjb21wYXJlZAojICBleHQJCShvcHRpb25hbCkgVGhlIGV4dGVuc2lvbiB0byBjb21wYXJlIGFnYWluc3Q7IHlvdSBtdXN0CiMJCXByb3ZpZGUgdGhlIHN0YXJ0aW5nIGRvdC4KIwkJRGVmYXVsdHMgdG8gW2luZm8gc2hhcmVkbGliZXh0ZW5zaW9uXQojCiMgUmVzdWx0czoKIyAgUmV0dXJucyAxIGlmIHRoZSBleHRlbnNpb24gbWF0Y2hlcywgMCBvdGhlcndpc2UKCnByb2MgcGtnX2NvbXBhcmVFeHRlbnNpb24geyBmaWxlTmFtZSB7ZXh0IHt9fSB9IHsKICAgIGdsb2JhbCB0Y2xfcGxhdGZvcm0KICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkZXh0XSA9PSAwfSB7CglzZXQgZXh0IFtpbmZvIHNoYXJlZGxpYmV4dGVuc2lvbl0KICAgIH0KICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19IHsKCXJldHVybiBbc3RyaW5nIGVxdWFsIC1ub2Nhc2UgW2ZpbGUgZXh0ZW5zaW9uICRmaWxlTmFtZV0gJGV4dF0KICAgIH0gZWxzZSB7CglyZXR1cm4gW3N0cmluZyBlcXVhbCBbZmlsZSBleHRlbnNpb24gJGZpbGVOYW1lXSAkZXh0XQogICAgfQp9CgojIHBrZ19ta0luZGV4IC0tCiMgVGhpcyBwcm9jZWR1cmUgY3JlYXRlcyBhIHBhY2thZ2UgaW5kZXggaW4gYSBnaXZlbiBkaXJlY3RvcnkuICBUaGUKIyBwYWNrYWdlIGluZGV4IGNvbnNpc3RzIG9mIGEgInBrZ0luZGV4LnRjbCIgZmlsZSB3aG9zZSBjb250ZW50cyBhcmUKIyBhIFRjbCBzY3JpcHQgdGhhdCBzZXRzIHVwIHBhY2thZ2UgaW5mb3JtYXRpb24gd2l0aCAicGFja2FnZSByZXF1aXJlIgojIGNvbW1hbmRzLiAgVGhlIGNvbW1hbmRzIGRlc2NyaWJlIGFsbCBvZiB0aGUgcGFja2FnZXMgZGVmaW5lZCBieSB0aGUKIyBmaWxlcyBnaXZlbiBhcyBhcmd1bWVudHMuCiMKIyBBcmd1bWVudHM6CiMgLWRpcmVjdAkJKG9wdGlvbmFsKSBJZiB0aGlzIGZsYWcgaXMgcHJlc2VudCwgdGhlIGdlbmVyYXRlZAojCQkJY29kZSBpbiBwa2dNa0luZGV4LnRjbCB3aWxsIGNhdXNlIHRoZSBwYWNrYWdlIHRvIGJlCiMJCQlsb2FkZWQgd2hlbiAicGFja2FnZSByZXF1aXJlIiBpcyBleGVjdXRlZCwgcmF0aGVyCiMJCQl0aGFuIGxhemlseSB3aGVuIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gYW4gZXhwb3J0ZWQKIwkJCXByb2NlZHVyZSBpbiB0aGUgcGFja2FnZSBpcyBtYWRlLgojIC12ZXJib3NlCQkob3B0aW9uYWwpIFZlcmJvc2Ugb3V0cHV0OyB0aGUgbmFtZSBvZiBlYWNoIGZpbGUgdGhhdAojCQkJd2FzIHN1Y2Nlc3NmdWxseSByb2Nlc3NlZCBpcyBwcmludGVkIG91dC4gQWRkaXRpb25hbGx5LAojCQkJaWYgcHJvY2Vzc2luZyBvZiBhIGZpbGUgZmFpbGVkIGEgbWVzc2FnZSBpcyBwcmludGVkLgojIC1sb2FkIHBhdAkJKG9wdGlvbmFsKSBQcmVsb2FkIGFueSBwYWNrYWdlcyB3aG9zZSBuYW1lcyBtYXRjaAojCQkJdGhlIHBhdHRlcm4uICBVc2VkIHRvIGhhbmRsZSBETExzIHRoYXQgZGVwZW5kIG9uCiMJCQlvdGhlciBwYWNrYWdlcyBkdXJpbmcgdGhlaXIgSW5pdCBwcm9jZWR1cmUuCiMgZGlyIC0JCQlOYW1lIG9mIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBpbmRleC4KIyBhcmdzIC0JCUFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMsIGVhY2ggZ2l2aW5nCiMJCQlhIGdsb2IgcGF0dGVybiB0aGF0IG1hdGNoZXMgdGhlIG5hbWVzIG9mIG9uZSBvcgojCQkJbW9yZSBzaGFyZWQgbGlicmFyaWVzIG9yIFRjbCBzY3JpcHQgZmlsZXMgaW4KIwkJCWRpci4KCnByb2MgcGtnX21rSW5kZXgge2FyZ3N9IHsKICAgIGdsb2JhbCBlcnJvckNvZGUgZXJyb3JJbmZvCiAgICBzZXQgdXNhZ2UgeyJwa2dfbWtJbmRleCA/LWRpcmVjdD8gPy12ZXJib3NlPyA/LWxvYWQgcGF0dGVybj8gPy0tPyBkaXIgP3BhdHRlcm4gLi4uPyJ9OwoKICAgIHNldCBhcmdDb3VudCBbbGxlbmd0aCAkYXJnc10KICAgIGlmIHskYXJnQ291bnQgPCAxfSB7CglyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlXG4kdXNhZ2UiCiAgICB9CgogICAgc2V0IG1vcmUgIiIKICAgIHNldCBkaXJlY3QgMQogICAgc2V0IGRvVmVyYm9zZSAwCiAgICBzZXQgbG9hZFBhdCAiIgogICAgZm9yIHtzZXQgaWR4IDB9IHskaWR4IDwgJGFyZ0NvdW50fSB7aW5jciBpZHh9IHsKCXNldCBmbGFnIFtsaW5kZXggJGFyZ3MgJGlkeF0KCXN3aXRjaCAtZ2xvYiAtLSAkZmxhZyB7CgkgICAgLS0gewoJCSMgZG9uZSB3aXRoIHRoZSBmbGFncwoJCWluY3IgaWR4CgkJYnJlYWsKCSAgICB9CgkgICAgLXZlcmJvc2UgewoJCXNldCBkb1ZlcmJvc2UgMQoJICAgIH0KCSAgICAtbGF6eSB7CgkJc2V0IGRpcmVjdCAwCgkJYXBwZW5kIG1vcmUgIiAtbGF6eSIKCSAgICB9CgkgICAgLWRpcmVjdCB7CgkJYXBwZW5kIG1vcmUgIiAtZGlyZWN0IgoJICAgIH0KCSAgICAtbG9hZCB7CgkJaW5jciBpZHgKCQlzZXQgbG9hZFBhdCBbbGluZGV4ICRhcmdzICRpZHhdCgkJYXBwZW5kIG1vcmUgIiAtbG9hZCAkbG9hZFBhdCIKCSAgICB9CgkgICAgLSogewoJCXJldHVybiAtY29kZSBlcnJvciAidW5rbm93biBmbGFnICRmbGFnOiBzaG91bGQgYmVcbiR1c2FnZSIKCSAgICB9CgkgICAgZGVmYXVsdCB7CgkJIyBkb25lIHdpdGggdGhlIGZsYWdzCgkJYnJlYWsKCSAgICB9Cgl9CiAgICB9CgogICAgc2V0IGRpciBbbGluZGV4ICRhcmdzICRpZHhdCiAgICBzZXQgcGF0dGVybkxpc3QgW2xyYW5nZSAkYXJncyBbZXhwciB7JGlkeCArIDF9XSBlbmRdCiAgICBpZiB7W2xsZW5ndGggJHBhdHRlcm5MaXN0XSA9PSAwfSB7CglzZXQgcGF0dGVybkxpc3QgW2xpc3QgIioudGNsIiAiKltpbmZvIHNoYXJlZGxpYmV4dGVuc2lvbl0iXQogICAgfQoKICAgIHNldCBvbGREaXIgW3B3ZF0KICAgIGNkICRkaXIKCiAgICBpZiB7W2NhdGNoIHtldmFsIGdsb2IgJHBhdHRlcm5MaXN0fSBmaWxlTGlzdF19IHsKCWdsb2JhbCBlcnJvckNvZGUgZXJyb3JJbmZvCgljZCAkb2xkRGlyCglyZXR1cm4gLWNvZGUgZXJyb3IgLWVycm9yY29kZSAkZXJyb3JDb2RlIC1lcnJvcmluZm8gJGVycm9ySW5mbyAkZmlsZUxpc3QKICAgIH0KICAgIGZvcmVhY2ggZmlsZSAkZmlsZUxpc3QgewoJIyBGb3IgZWFjaCBmaWxlLCBmaWd1cmUgb3V0IHdoYXQgY29tbWFuZHMgYW5kIHBhY2thZ2VzIGl0IHByb3ZpZGVzLgoJIyBUbyBkbyB0aGlzLCBjcmVhdGUgYSBjaGlsZCBpbnRlcnByZXRlciwgbG9hZCB0aGUgZmlsZSBpbnRvIHRoZQoJIyBpbnRlcnByZXRlciwgYW5kIGdldCBhIGxpc3Qgb2YgdGhlIG5ldyBjb21tYW5kcyBhbmQgcGFja2FnZXMKCSMgdGhhdCBhcmUgZGVmaW5lZC4KCglpZiB7W3N0cmluZyBlcXVhbCAkZmlsZSAicGtnSW5kZXgudGNsIl19IHsKCSAgICBjb250aW51ZQoJfQoKCSMgQ2hhbmdlZCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkaXJlY3RvcnkgYmVmb3JlIGluaXRpYWxpemluZyB0aGUKCSMgc2xhdmUgaW4gY2FzZSBUQ0xfTElCUkFSWSBpcyBhIHJlbGF0aXZlIHBhdGggKGUuZy4gaW4gdGhlIHRlc3QKCSMgc3VpdGUpLiAKCgljZCAkb2xkRGlyCglzZXQgYyBbaW50ZXJwIGNyZWF0ZV0KCgkjIExvYWQgaW50byB0aGUgY2hpbGQgYW55IHBhY2thZ2VzIGN1cnJlbnRseSBsb2FkZWQgaW4gdGhlIHBhcmVudAoJIyBpbnRlcnByZXRlciB0aGF0IG1hdGNoIHRoZSAtbG9hZCBwYXR0ZXJuLgoKCWZvcmVhY2ggcGtnIFtpbmZvIGxvYWRlZF0gewoJICAgIGlmIHshIFtzdHJpbmcgbWF0Y2ggJGxvYWRQYXQgW2xpbmRleCAkcGtnIDFdXX0gewoJCWNvbnRpbnVlCgkgICAgfQoJICAgIGlmIHtbc3RyaW5nIGVxdWFsIFtsaW5kZXggJHBrZyAxXSAiVGsiXX0gewoJCSRjIGV2YWwge3NldCBhcmd2IHstZ2VvbWV0cnkgKzArMH19CgkgICAgfQoJICAgIGlmIHtbY2F0Y2ggewoJCWxvYWQgW2xpbmRleCAkcGtnIDBdIFtsaW5kZXggJHBrZyAxXSAkYwoJICAgIH0gZXJyXX0gewoJCWlmIHskZG9WZXJib3NlfSB7CgkJICAgIHRjbExvZyAid2FybmluZzogbG9hZCBbbGluZGV4ICRwa2cgMF0gW2xpbmRleCAkcGtnIDFdXG5mYWlsZWQgd2l0aDogJGVyciIKCQl9CgkgICAgfSBlbHNlaWYgeyRkb1ZlcmJvc2V9IHsKCQl0Y2xMb2cgImxvYWRlZCBbbGluZGV4ICRwa2cgMF0gW2xpbmRleCAkcGtnIDFdIgoJICAgIH0KCX0KCWNkICRkaXIKCgkkYyBldmFsIHsKCSAgICAjIFN0dWIgb3V0IHRoZSBwYWNrYWdlIGNvbW1hbmQgc28gcGFja2FnZXMgY2FuCgkgICAgIyByZXF1aXJlIG90aGVyIHBhY2thZ2VzLgoKCSAgICByZW5hbWUgcGFja2FnZSBfX3BhY2thZ2Vfb3JpZwoJICAgIHByb2MgcGFja2FnZSB7d2hhdCBhcmdzfSB7CgkJc3dpdGNoIC0tICR3aGF0IHsKCQkgICAgcmVxdWlyZSB7IHJldHVybiA7ICMgaWdub3JlIHRyYW5zaXRpdmUgcmVxdWlyZXMgfQoJCSAgICBkZWZhdWx0IHsgZXZhbCBfX3BhY2thZ2Vfb3JpZyB7JHdoYXR9ICRhcmdzIH0KCQl9CgkgICAgfQoJICAgIHByb2MgdGNsUGtnVW5rbm93biBhcmdzIHt9CgkgICAgcGFja2FnZSB1bmtub3duIHRjbFBrZ1Vua25vd24KCgkgICAgIyBTdHViIG91dCB0aGUgdW5rbm93biBjb21tYW5kIHNvIHBhY2thZ2UgY2FuIGNhbGwKCSAgICAjIGludG8gZWFjaCBvdGhlciBkdXJpbmcgdGhlaXIgaW5pdGlhbGlsemF0aW9uLgoKCSAgICBwcm9jIHVua25vd24ge2FyZ3N9IHt9CgoJICAgICMgU3R1YiBvdXQgdGhlIGF1dG9faW1wb3J0IG1lY2hhbmlzbQoKCSAgICBwcm9jIGF1dG9faW1wb3J0IHthcmdzfSB7fQoKCSAgICAjIHJlc2VydmUgdGhlIDo6dGNsIG5hbWVzcGFjZSBmb3Igc3VwcG9ydCBwcm9jcwoJICAgICMgYW5kIHRlbXBvcmFyeSB2YXJpYWJsZXMuICBUaGlzIG1pZ2h0IG1ha2UgaXQgYXdrd2FyZAoJICAgICMgdG8gZ2VuZXJhdGUgYSBwa2dJbmRleC50Y2wgZmlsZSBmb3IgdGhlIDo6dGNsIG5hbWVzcGFjZS4KCgkgICAgbmFtZXNwYWNlIGV2YWwgOjp0Y2wgewoJCXZhcmlhYmxlIGZpbGUJCTsjIEN1cnJlbnQgZmlsZSBiZWluZyBwcm9jZXNzZWQKCQl2YXJpYWJsZSBkaXJlY3QJCTsjIC1kaXJlY3QgZmxhZyB2YWx1ZQoJCXZhcmlhYmxlIHgJCTsjIExvb3AgdmFyaWFibGUKCQl2YXJpYWJsZSBkZWJ1ZwkJOyMgRm9yIGRlYnVnZ2luZwoJCXZhcmlhYmxlIHR5cGUJCTsjICJsb2FkIiBvciAic291cmNlIiwgZm9yIC1kaXJlY3QKCQl2YXJpYWJsZSBuYW1lc3BhY2VzCTsjIEV4aXN0aW5nIG5hbWVzcGFjZXMgKGUuZy4sIDo6dGNsKQoJCXZhcmlhYmxlIHBhY2thZ2VzCTsjIEV4aXN0aW5nIHBhY2thZ2VzIChlLmcuLCBUY2wpCgkJdmFyaWFibGUgb3JpZ0NtZHMJOyMgRXhpc3RpbmcgY29tbWFuZHMKCQl2YXJpYWJsZSBuZXdDbWRzCTsjIE5ld2x5IGNyZWF0ZWQgY29tbWFuZHMKCQl2YXJpYWJsZSBuZXdQa2dzIHt9CTsjIE5ld2x5IGNyZWF0ZWQgcGFja2FnZXMKCSAgICB9Cgl9CgoJJGMgZXZhbCBbbGlzdCBzZXQgOjp0Y2w6OmZpbGUgJGZpbGVdCgkkYyBldmFsIFtsaXN0IHNldCA6OnRjbDo6ZGlyZWN0ICRkaXJlY3RdCgoJIyBEb3dubG9hZCBuZWVkZWQgcHJvY2VkdXJlcyBpbnRvIHRoZSBzbGF2ZSBiZWNhdXNlIHdlJ3ZlCgkjIGp1c3QgZGVsZXRlZCB0aGUgdW5rbm93biBwcm9jZWR1cmUuICBUaGlzIGRvZXNuJ3QgaGFuZGxlCgkjIHByb2NlZHVyZXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCglmb3JlYWNoIHAge3BrZ19jb21wYXJlRXh0ZW5zaW9ufSB7CgkgICAgJGMgZXZhbCBbbGlzdCBwcm9jICRwIFtpbmZvIGFyZ3MgJHBdIFtpbmZvIGJvZHkgJHBdXQoJfQoKCWlmIHtbY2F0Y2ggewoJICAgICRjIGV2YWwgewoJCXNldCA6OnRjbDo6ZGVidWcgImxvYWRpbmcgb3Igc291cmNpbmciCgoJCSMgd2UgbmVlZCB0byB0cmFjayBjb21tYW5kIGRlZmluZWQgYnkgZWFjaCBwYWNrYWdlIGV2ZW4gaW4KCQkjIHRoZSAtZGlyZWN0IGNhc2UsIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGludGVybmFsbHkgYnkKCQkjIHRoZSAicGFydGlhbCBwa2dJbmRleC50Y2wiIHN0ZXAgYWJvdmUuCgoJCXByb2MgOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXMge3tyb290IDo6fX0gewoJCSAgICBzZXQgbGlzdCAkcm9vdAoJCSAgICBmb3JlYWNoIG5zIFtuYW1lc3BhY2UgY2hpbGRyZW4gJHJvb3RdIHsKCQkJZXZhbCBsYXBwZW5kIGxpc3QgWzo6dGNsOjpHZXRBbGxOYW1lc3BhY2VzICRuc10KCQkgICAgfQoJCSAgICByZXR1cm4gJGxpc3QKCQl9CgoJCSMgaW5pdCB0aGUgbGlzdCBvZiBleGlzdGluZyBuYW1lc3BhY2VzLCBwYWNrYWdlcywgY29tbWFuZHMKCgkJZm9yZWFjaCA6OnRjbDo6eCBbOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXNdIHsKCQkgICAgc2V0IDo6dGNsOjpuYW1lc3BhY2VzKCQ6OnRjbDo6eCkgMQoJCX0KCQlmb3JlYWNoIDo6dGNsOjp4IFtwYWNrYWdlIG5hbWVzXSB7CgkJICAgIHNldCA6OnRjbDo6cGFja2FnZXMoJDo6dGNsOjp4KSAxCgkJfQoJCXNldCA6OnRjbDo6b3JpZ0NtZHMgW2luZm8gY29tbWFuZHNdCgoJCSMgVHJ5IHRvIGxvYWQgdGhlIGZpbGUgaWYgaXQgaGFzIHRoZSBzaGFyZWQgbGlicmFyeQoJCSMgZXh0ZW5zaW9uLCBvdGhlcndpc2Ugc291cmNlIGl0LiAgSXQncyBpbXBvcnRhbnQgbm90IHRvCgkJIyB0cnkgdG8gbG9hZCBmaWxlcyB0aGF0IGFyZW4ndCBzaGFyZWQgbGlicmFyaWVzLCBiZWNhdXNlCgkJIyBvbiBzb21lIHN5c3RlbXMgKGxpa2UgU3VuT1MpIHRoZSBsb2FkZXIgd2lsbCBhYm9ydCB0aGUKCQkjIHdob2xlIGFwcGxpY2F0aW9uIHdoZW4gaXQgZ2V0cyBhbiBlcnJvci4KCgkJaWYge1twa2dfY29tcGFyZUV4dGVuc2lvbiAkOjp0Y2w6OmZpbGUgW2luZm8gc2hhcmVkbGliZXh0ZW5zaW9uXV19IHsKCQkgICAgIyBUaGUgImZpbGUgam9pbiAuIiBjb21tYW5kIGJlbG93IGlzIG5lY2Vzc2FyeS4KCQkgICAgIyBXaXRob3V0IGl0LCBpZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBcJ3MgYW5kIHdlJ3JlCgkJICAgICMgb24gVU5JWCwgdGhlIGxvYWQgY29tbWFuZCB3aWxsIGludm9rZSB0aGUKCQkgICAgIyBMRF9MSUJSQVJZX1BBVEggc2VhcmNoIG1lY2hhbmlzbSwgd2hpY2ggY291bGQgY2F1c2UKCQkgICAgIyB0aGUgd3JvbmcgZmlsZSB0byBiZSB1c2VkLgoKCQkgICAgc2V0IDo6dGNsOjpkZWJ1ZyBsb2FkaW5nCgkJICAgIGxvYWQgW2ZpbGUgam9pbiAuICQ6OnRjbDo6ZmlsZV0KCQkgICAgc2V0IDo6dGNsOjp0eXBlIGxvYWQKCQl9IGVsc2UgewoJCSAgICBzZXQgOjp0Y2w6OmRlYnVnIHNvdXJjaW5nCgkJICAgIHNvdXJjZSAkOjp0Y2w6OmZpbGUKCQkgICAgc2V0IDo6dGNsOjp0eXBlIHNvdXJjZQoJCX0KCgkJIyBBcyBhIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiwgaWYgd2UgYXJlIGNyZWF0aW5nIAoJCSMgZGlyZWN0IGxvYWQgcGFja2FnZXMsIGRvbid0IGJvdGhlciBmaWd1cmluZyBvdXQgdGhlIAoJCSMgc2V0IG9mIGNvbW1hbmRzIGNyZWF0ZWQgYnkgdGhlIG5ldyBwYWNrYWdlcy4gIFdlIAoJCSMgb25seSBuZWVkIHRoYXQgbGlzdCBmb3Igc2V0dGluZyB1cCB0aGUgYXV0b2xvYWRpbmcgCgkJIyB1c2VkIGluIHRoZSBub24tZGlyZWN0IGNhc2UuCgkJaWYgeyAhJDo6dGNsOjpkaXJlY3QgfSB7CgkJICAgICMgU2VlIHdoYXQgbmV3IG5hbWVzcGFjZXMgYXBwZWFyZWQsIGFuZCBpbXBvcnQgY29tbWFuZHMKCQkgICAgIyBmcm9tIHRoZW0uICBPbmx5IGV4cG9ydGVkIGNvbW1hbmRzIGdvIGludG8gdGhlIGluZGV4LgoJCSAgICAKCQkgICAgZm9yZWFjaCA6OnRjbDo6eCBbOjp0Y2w6OkdldEFsbE5hbWVzcGFjZXNdIHsKCQkJaWYgeyEgW2luZm8gZXhpc3RzIDo6dGNsOjpuYW1lc3BhY2VzKCQ6OnRjbDo6eCldfSB7CgkJCSAgICBuYW1lc3BhY2UgaW1wb3J0IC1mb3JjZSAkezo6dGNsOjp4fTo6KgoJCQl9CgoJCQkjIEZpZ3VyZSBvdXQgd2hhdCBjb21tYW5kcyBhcHBlYXJlZAoJCQkKCQkJZm9yZWFjaCA6OnRjbDo6eCBbaW5mbyBjb21tYW5kc10gewoJCQkgICAgc2V0IDo6dGNsOjpuZXdDbWRzKCQ6OnRjbDo6eCkgMQoJCQl9CgkJCWZvcmVhY2ggOjp0Y2w6OnggJDo6dGNsOjpvcmlnQ21kcyB7CgkJCSAgICBjYXRjaCB7dW5zZXQgOjp0Y2w6Om5ld0NtZHMoJDo6dGNsOjp4KX0KCQkJfQoJCQlmb3JlYWNoIDo6dGNsOjp4IFthcnJheSBuYW1lcyA6OnRjbDo6bmV3Q21kc10gewoJCQkgICAgIyBkZXRlcm1pbmUgd2hpY2ggbmFtZXNwYWNlIGEgY29tbWFuZCBjb21lcyBmcm9tCgkJCSAgICAKCQkJICAgIHNldCA6OnRjbDo6YWJzIFtuYW1lc3BhY2Ugb3JpZ2luICQ6OnRjbDo6eF0KCQkJICAgIAoJCQkgICAgIyBzcGVjaWFsIGNhc2Ugc28gdGhhdCBnbG9iYWwgbmFtZXMgaGF2ZSBubyBsZWFkaW5nCgkJCSAgICAjIDo6LCB0aGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSB1bmtub3duIGNvbW1hbmQKCQkJICAgIAoJCQkgICAgc2V0IDo6dGNsOjphYnMgXAoJCQkJICAgIFtsaW5kZXggW2F1dG9fcXVhbGlmeSAkOjp0Y2w6OmFicyA6Ol0gMF0KCQkJICAgIAoJCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSAkOjp0Y2w6OnggJDo6dGNsOjphYnNdfSB7CgkJCQkjIE5hbWUgY2hhbmdlZCBkdXJpbmcgcXVhbGlmaWNhdGlvbgoJCQkJCgkJCQlzZXQgOjp0Y2w6Om5ld0NtZHMoJDo6dGNsOjphYnMpIDEKCQkJCXVuc2V0IDo6dGNsOjpuZXdDbWRzKCQ6OnRjbDo6eCkKCQkJICAgIH0KCQkJfQoJCSAgICB9CgkJfQoKCQkjIExvb2sgdGhyb3VnaCB0aGUgcGFja2FnZXMgdGhhdCBhcHBlYXJlZCwgYW5kIGlmIHRoZXJlIGlzCgkJIyBhIHZlcnNpb24gcHJvdmlkZWQsIHRoZW4gcmVjb3JkIGl0CgoJCWZvcmVhY2ggOjp0Y2w6OnggW3BhY2thZ2UgbmFtZXNdIHsKCQkgICAgaWYge1tzdHJpbmcgY29tcGFyZSBbcGFja2FnZSBwcm92aWRlICQ6OnRjbDo6eF0gIiJdIFwKCQkJICAgICYmICFbaW5mbyBleGlzdHMgOjp0Y2w6OnBhY2thZ2VzKCQ6OnRjbDo6eCldfSB7CgkJCWxhcHBlbmQgOjp0Y2w6Om5ld1BrZ3MgXAoJCQkgICAgW2xpc3QgJDo6dGNsOjp4IFtwYWNrYWdlIHByb3ZpZGUgJDo6dGNsOjp4XV0KCQkgICAgfQoJCX0KCSAgICB9Cgl9IG1zZ10gPT0gMX0gewoJICAgIHNldCB3aGF0IFskYyBldmFsIHNldCA6OnRjbDo6ZGVidWddCgkgICAgaWYgeyRkb1ZlcmJvc2V9IHsKCQl0Y2xMb2cgIndhcm5pbmc6IGVycm9yIHdoaWxlICR3aGF0ICRmaWxlOiAkbXNnIgoJICAgIH0KCX0gZWxzZSB7CgkgICAgc2V0IHR5cGUgWyRjIGV2YWwgc2V0IDo6dGNsOjp0eXBlXQoJICAgIHNldCBjbWRzIFtsc29ydCBbJGMgZXZhbCBhcnJheSBuYW1lcyA6OnRjbDo6bmV3Q21kc11dCgkgICAgc2V0IHBrZ3MgWyRjIGV2YWwgc2V0IDo6dGNsOjpuZXdQa2dzXQoJICAgIGlmIHtbbGxlbmd0aCAkcGtnc10gPiAxfSB7CgkJdGNsTG9nICJ3YXJuaW5nOiBcIiRmaWxlXCIgcHJvdmlkZXMgbW9yZSB0aGFuIG9uZSBwYWNrYWdlICgkcGtncykiCgkgICAgfQoJICAgIGZvcmVhY2ggcGtnICRwa2dzIHsKCQkjIGNtZHMgaXMgZW1wdHkvbm90IHVzZWQgaW4gdGhlIGRpcmVjdCBjYXNlCgkJbGFwcGVuZCBmaWxlcygkcGtnKSBbbGlzdCAkZmlsZSAkdHlwZSAkY21kc10KCSAgICB9CgoJICAgIGlmIHskZG9WZXJib3NlfSB7CgkJdGNsTG9nICJwcm9jZXNzZWQgJGZpbGUiCgkgICAgfQoJICAgIGludGVycCBkZWxldGUgJGMKCX0KICAgIH0KCiAgICBhcHBlbmQgaW5kZXggIiMgVGNsIHBhY2thZ2UgaW5kZXggZmlsZSwgdmVyc2lvbiAxLjFcbiIKICAgIGFwcGVuZCBpbmRleCAiIyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBcInBrZ19ta0luZGV4JG1vcmVcIiBjb21tYW5kXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgYW5kIHNvdXJjZWQgZWl0aGVyIHdoZW4gYW4gYXBwbGljYXRpb24gc3RhcnRzIHVwIG9yXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgYnkgYSBcInBhY2thZ2UgdW5rbm93blwiIHNjcmlwdC4gIEl0IGludm9rZXMgdGhlXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgXCJwYWNrYWdlIGlmbmVlZGVkXCIgY29tbWFuZCB0byBzZXQgdXAgcGFja2FnZS1yZWxhdGVkXG4iCiAgICBhcHBlbmQgaW5kZXggIiMgaW5mb3JtYXRpb24gc28gdGhhdCBwYWNrYWdlcyB3aWxsIGJlIGxvYWRlZCBhdXRvbWF0aWNhbGx5XG4iCiAgICBhcHBlbmQgaW5kZXggIiMgaW4gcmVzcG9uc2UgdG8gXCJwYWNrYWdlIHJlcXVpcmVcIiBjb21tYW5kcy4gIFdoZW4gdGhpc1xuIgogICAgYXBwZW5kIGluZGV4ICIjIHNjcmlwdCBpcyBzb3VyY2VkLCB0aGUgdmFyaWFibGUgXCRkaXIgbXVzdCBjb250YWluIHRoZVxuIgogICAgYXBwZW5kIGluZGV4ICIjIGZ1bGwgcGF0aCBuYW1lIG9mIHRoaXMgZmlsZSdzIGRpcmVjdG9yeS5cbiIKCiAgICBmb3JlYWNoIHBrZyBbbHNvcnQgW2FycmF5IG5hbWVzIGZpbGVzXV0gewoJc2V0IGNtZCB7fQoJZm9yZWFjaCB7bmFtZSB2ZXJzaW9ufSAkcGtnIHsKCSAgICBicmVhawoJfQoJbGFwcGVuZCBjbWQgOjpwa2c6OmNyZWF0ZSAtbmFtZSAkbmFtZSAtdmVyc2lvbiAkdmVyc2lvbgoJZm9yZWFjaCBzcGVjICRmaWxlcygkcGtnKSB7CgkgICAgZm9yZWFjaCB7ZmlsZSB0eXBlIHByb2NzfSAkc3BlYyB7CgkJaWYgeyAkZGlyZWN0IH0gewoJCSAgICBzZXQgcHJvY3Mge30KCQl9CgkJbGFwcGVuZCBjbWQgIi0kdHlwZSIgW2xpc3QgJGZpbGUgJHByb2NzXQoJICAgIH0KCX0KCWFwcGVuZCBpbmRleCAiXG5bZXZhbCAkY21kXSIKICAgIH0KCiAgICBzZXQgZiBbb3BlbiBwa2dJbmRleC50Y2wgd10KICAgIHB1dHMgJGYgJGluZGV4CiAgICBjbG9zZSAkZgogICAgY2QgJG9sZERpcgp9CgojIHRjbFBrZ1NldHVwIC0tCiMgVGhpcyBpcyBhIHV0aWxpdHkgcHJvY2VkdXJlIHVzZSBieSBwa2dJbmRleC50Y2wgZmlsZXMuICBJdCBpcyBpbnZva2VkCiMgYXMgcGFydCBvZiBhICJwYWNrYWdlIGlmbmVlZGVkIiBzY3JpcHQuICBJdCBjYWxscyAicGFja2FnZSBwcm92aWRlIgojIHRvIGluZGljYXRlIHRoYXQgYSBwYWNrYWdlIGlzIGF2YWlsYWJsZSwgdGhlbiBzZXRzIGVudHJpZXMgaW4gdGhlCiMgYXV0b19pbmRleCBhcnJheSBzbyB0aGF0IHRoZSBwYWNrYWdlJ3MgZmlsZXMgd2lsbCBiZSBhdXRvLWxvYWRlZCB3aGVuCiMgdGhlIGNvbW1hbmRzIGFyZSB1c2VkLgojCiMgQXJndW1lbnRzOgojIGRpciAtCQkJRGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIHRoZSBmaWxlcyBmb3IgdGhpcyBwYWNrYWdlLgojIHBrZyAtCQkJTmFtZSBvZiB0aGUgcGFja2FnZSAobm8gdmVyc2lvbiBudW1iZXIpLgojIHZlcnNpb24gLQkJVmVyc2lvbiBudW1iZXIgZm9yIHRoZSBwYWNrYWdlLCBzdWNoIGFzIDIuMS4zLgojIGZpbGVzIC0JCUxpc3Qgb2YgZmlsZXMgdGhhdCBjb25zdGl0dXRlIHRoZSBwYWNrYWdlLiAgRWFjaAojCQkJZWxlbWVudCBpcyBhIHN1Yi1saXN0IHdpdGggdGhyZWUgZWxlbWVudHMuICBUaGUgZmlyc3QKIwkJCWlzIHRoZSBuYW1lIG9mIGEgZmlsZSByZWxhdGl2ZSB0byAkZGlyLCB0aGUgc2Vjb25kIGlzCiMJCQkibG9hZCIgb3IgInNvdXJjZSIsIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmlsZSBpcyBhCiMJCQlsb2FkYWJsZSBiaW5hcnkgb3IgYSBzY3JpcHQgdG8gc291cmNlLCBhbmQgdGhlIHRoaXJkCiMJCQlpcyBhIGxpc3Qgb2YgY29tbWFuZHMgZGVmaW5lZCBieSB0aGlzIGZpbGUuCgpwcm9jIHRjbFBrZ1NldHVwIHtkaXIgcGtnIHZlcnNpb24gZmlsZXN9IHsKICAgIGdsb2JhbCBhdXRvX2luZGV4CgogICAgcGFja2FnZSBwcm92aWRlICRwa2cgJHZlcnNpb24KICAgIGZvcmVhY2ggZmlsZUluZm8gJGZpbGVzIHsKCXNldCBmIFtsaW5kZXggJGZpbGVJbmZvIDBdCglzZXQgdHlwZSBbbGluZGV4ICRmaWxlSW5mbyAxXQoJZm9yZWFjaCBjbWQgW2xpbmRleCAkZmlsZUluZm8gMl0gewoJICAgIGlmIHtbc3RyaW5nIGVxdWFsICR0eXBlICJsb2FkIl19IHsKCQlzZXQgYXV0b19pbmRleCgkY21kKSBbbGlzdCBsb2FkIFtmaWxlIGpvaW4gJGRpciAkZl0gJHBrZ10KCSAgICB9IGVsc2UgewoJCXNldCBhdXRvX2luZGV4KCRjbWQpIFtsaXN0IHNvdXJjZSBbZmlsZSBqb2luICRkaXIgJGZdXQoJICAgIH0gCgl9CiAgICB9Cn0KCiMgdGNsTWFjUGtnU2VhcmNoIC0tCiMgVGhlIHByb2NlZHVyZSBpcyB1c2VkIG9uIHRoZSBNYWNpbnRvc2ggdG8gc2VhcmNoIGEgZ2l2ZW4gZGlyZWN0b3J5IGZvciBmaWxlcwojIHdpdGggYSBURVhUIHJlc291cmNlIG5hbWVkICJwa2dJbmRleCIuICBJZiBpdCBleGlzdHMgaXQgaXMgc291cmNlZCBpbiB0byB0aGUKIyBpbnRlcnByZXRlciB0byBzZXR1cCB0aGUgcGFja2FnZSBkYXRhYmFzZS4KCnByb2MgdGNsTWFjUGtnU2VhcmNoIHtkaXJ9IHsKICAgIGZvcmVhY2ggeCBbZ2xvYiAtbm9jb21wbGFpbiBbZmlsZSBqb2luICRkaXIgKi5zaGxiXV0gewoJaWYge1tmaWxlIGlzZmlsZSAkeF19IHsKCSAgICBzZXQgcmVzIFtyZXNvdXJjZSBvcGVuICR4XQoJICAgIGZvcmVhY2ggeSBbcmVzb3VyY2UgbGlzdCBURVhUICRyZXNdIHsKCQlpZiB7W3N0cmluZyBlcXVhbCAkeSAicGtnSW5kZXgiXX0ge3NvdXJjZSAtcnNyYyBwa2dJbmRleH0KCSAgICB9CgkgICAgY2F0Y2gge3Jlc291cmNlIGNsb3NlICRyZXN9Cgl9CiAgICB9Cn0KCiMgdGNsUGtnVW5rbm93biAtLQojIFRoaXMgcHJvY2VkdXJlIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGZvciB0aGUgInBhY2thZ2UgdW5rbm93biIgZnVuY3Rpb24uCiMgSXQgaXMgaW52b2tlZCB3aGVuIGEgcGFja2FnZSB0aGF0J3MgbmVlZGVkIGNhbid0IGJlIGZvdW5kLiAgSXQgc2NhbnMKIyB0aGUgYXV0b19wYXRoIGRpcmVjdG9yaWVzIGFuZCB0aGVpciBpbW1lZGlhdGUgY2hpbGRyZW4gbG9va2luZyBmb3IKIyBwa2dJbmRleC50Y2wgZmlsZXMgYW5kIHNvdXJjZXMgYW55IHN1Y2ggZmlsZXMgdGhhdCBhcmUgZm91bmQgdG8gc2V0dXAKIyB0aGUgcGFja2FnZSBkYXRhYmFzZS4gIChPbiB0aGUgTWFjaW50b3NoIHdlIGFsc28gc2VhcmNoIGZvciBwa2dJbmRleAojIFRFWFQgcmVzb3VyY2VzIGluIGFsbCBmaWxlcy4pCiMKIyBBcmd1bWVudHM6CiMgbmFtZSAtCQlOYW1lIG9mIGRlc2lyZWQgcGFja2FnZS4gIE5vdCB1c2VkLgojIHZlcnNpb24gLQkJVmVyc2lvbiBvZiBkZXNpcmVkIHBhY2thZ2UuICBOb3QgdXNlZC4KIyBleGFjdCAtCQlFaXRoZXIgIi1leGFjdCIgb3Igb21pdHRlZC4gIE5vdCB1c2VkLgoKcHJvYyB0Y2xQa2dVbmtub3duIHtuYW1lIHZlcnNpb24ge2V4YWN0IHt9fX0gewogICAgZ2xvYmFsIGF1dG9fcGF0aCB0Y2xfcGxhdGZvcm0gZW52CgogICAgaWYgeyFbaW5mbyBleGlzdHMgYXV0b19wYXRoXX0gewoJcmV0dXJuCiAgICB9CiAgICBmb3Ige3NldCBpIFtleHByIHtbbGxlbmd0aCAkYXV0b19wYXRoXSAtIDF9XX0geyRpID49IDB9IHtpbmNyIGkgLTF9IHsKCSMgd2UgY2FuJ3QgdXNlIGdsb2IgaW4gc2FmZSBpbnRlcnBzLCBzbyBlbmNsb3NlIHRoZSBmb2xsb3dpbmcKCSMgaW4gYSBjYXRjaCBzdGF0ZW1lbnQKCWNhdGNoIHsKCSAgICBmb3JlYWNoIGZpbGUgW2dsb2IgLW5vY29tcGxhaW4gW2ZpbGUgam9pbiBbbGluZGV4ICRhdXRvX3BhdGggJGldIFwKCQkgICAgKiBwa2dJbmRleC50Y2xdXSB7CgkJc2V0IGRpciBbZmlsZSBkaXJuYW1lICRmaWxlXQoJCWlmIHtbZmlsZSByZWFkYWJsZSAkZmlsZV19IHsKCQkgICAgaWYge1tjYXRjaCB7c291cmNlICRmaWxlfSBtc2ddfSB7CgkJCXRjbExvZyAiZXJyb3IgcmVhZGluZyBwYWNrYWdlIGluZGV4IGZpbGUgJGZpbGU6ICRtc2ciCgkJICAgIH0KCQl9CgkgICAgfQoJfQoJc2V0IGRpciBbbGluZGV4ICRhdXRvX3BhdGggJGldCglzZXQgZmlsZSBbZmlsZSBqb2luICRkaXIgcGtnSW5kZXgudGNsXQoJIyBzYWZlIGludGVycHMgdXN1YWxseSBkb24ndCBoYXZlICJmaWxlIHJlYWRhYmxlIiwgbm9yIHN0ZGVyciBjaGFubmVsCglpZiB7W2ludGVycCBpc3NhZmVdIHx8IFtmaWxlIHJlYWRhYmxlICRmaWxlXX0gewoJICAgIGlmIHtbY2F0Y2gge3NvdXJjZSAkZmlsZX0gbXNnXSAmJiAhW2ludGVycCBpc3NhZmVdfSAgewoJCXRjbExvZyAiZXJyb3IgcmVhZGluZyBwYWNrYWdlIGluZGV4IGZpbGUgJGZpbGU6ICRtc2ciCgkgICAgfQoJfQoJIyBPbiB0aGUgTWFjaW50b3NoIHdlIGFsc28gbG9vayBpbiB0aGUgcmVzb3VyY2UgZm9yayAKCSMgb2Ygc2hhcmVkIGxpYnJhcmllcwoJIyBXZSBjYW4ndCB1c2UgdGNsTWFjUGtnU2VhcmNoIGluIHNhZmUgaW50ZXJwcyBiZWNhdXNlIGl0IHVzZXMgZ2xvYgoJaWYgeyghW2ludGVycCBpc3NhZmVdKSAmJiBcCgkJW3N0cmluZyBlcXVhbCAkdGNsX3BsYXRmb3JtKHBsYXRmb3JtKSAibWFjaW50b3NoIl19IHsKCSAgICBzZXQgZGlyIFtsaW5kZXggJGF1dG9fcGF0aCAkaV0KCSAgICB0Y2xNYWNQa2dTZWFyY2ggJGRpcgoJICAgIGZvcmVhY2ggeCBbZ2xvYiAtbm9jb21wbGFpbiBbZmlsZSBqb2luICRkaXIgKl1dIHsKCQlpZiB7W2ZpbGUgaXNkaXJlY3RvcnkgJHhdfSB7CgkJICAgIHNldCBkaXIgJHgKCQkgICAgdGNsTWFjUGtnU2VhcmNoICRkaXIKCQl9CgkgICAgfQoJfQogICAgfQp9CgojIDo6cGtnOjpjcmVhdGUgLS0KIwojCUdpdmVuIGEgcGFja2FnZSBzcGVjaWZpY2F0aW9uIGdlbmVyYXRlIGEgInBhY2thZ2UgaWZuZWVkZWQiIHN0YXRlbWVudAojCWZvciB0aGUgcGFja2FnZSwgc3VpdGFibGUgZm9yIGluY2x1c2lvbiBpbiBhIHBrZ0luZGV4LnRjbCBmaWxlLgojCiMgQXJndW1lbnRzOgojCWFyZ3MJCWFyZ3VtZW50cyB1c2VkIGJ5IHRoZSBjcmVhdGUgZnVuY3Rpb246CiMJCQktbmFtZQkJcGFja2FnZU5hbWUKIwkJCS12ZXJzaW9uCXBhY2thZ2VWZXJzaW9uCiMJCQktbG9hZAkJe2ZpbGVuYW1lID97cHJvY3N9P30KIwkJCS4uLgojCQkJLXNvdXJjZQkJe2ZpbGVuYW1lID97cHJvY3N9P30KIwkJCS4uLgojCiMJCQlBbnkgbnVtYmVyIG9mIC1sb2FkIGFuZCAtc291cmNlIHBhcmFtZXRlcnMgbWF5IGJlCiMJCQlzcGVjaWZpZWQsIHNvIGxvbmcgYXMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIC1sb2FkIG9yCiMJCQktc291cmNlIHBhcmFtZXRlci4gIElmIHRoZSBwcm9jcyBjb21wb25lbnQgb2YgYSAKIwkJCW1vZHVsZSBzcGVjaWZpZXIgaXMgbGVmdCBvZmYsIHRoYXQgbW9kdWxlIHdpbGwgYmUKIwkJCXNldCB1cCBmb3IgZGlyZWN0IGxvYWRpbmc7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQojCQkJc2V0IHVwIGZvciBsYXp5IGxvYWRpbmcuICBJZiBib3RoIC1zb3VyY2UgYW5kIC1sb2FkCiMJCQlhcmUgc3BlY2lmaWVkLCB0aGUgLWxvYWQnZWQgZmlsZXMgd2lsbCBiZSBsb2FkZWQgCiMJCQlmaXJzdCwgZm9sbG93ZWQgYnkgdGhlIC1zb3VyY2UnZCBmaWxlcy4KIwojIFJlc3VsdHM6CiMJQW4gYXBwcm9wcmlhdGUgInBhY2thZ2UgaWZuZWVkZWQiIHN0YXRlbWVudCBmb3IgdGhlIHBhY2thZ2UuCgpwcm9jIDo6cGtnOjpjcmVhdGUge2FyZ3N9IHsKICAgIGFwcGVuZCBlcnIodXNhZ2UpICJbbGluZGV4IFtpbmZvIGxldmVsIDBdIDBdICIKICAgIGFwcGVuZCBlcnIodXNhZ2UpICItbmFtZSBwYWNrYWdlTmFtZSAtdmVyc2lvbiBwYWNrYWdlVmVyc2lvbiIKICAgIGFwcGVuZCBlcnIodXNhZ2UpICI/LWxvYWQge2ZpbGVuYW1lID97cHJvY3N9P30/IC4uLiAiCiAgICBhcHBlbmQgZXJyKHVzYWdlKSAiPy1zb3VyY2Uge2ZpbGVuYW1lID97cHJvY3N9P30/IC4uLiIKCiAgICBzZXQgZXJyKHdyb25nTnVtQXJncykgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiJGVycih1c2FnZSlcIiIKICAgIHNldCBlcnIodmFsdWVNaXNzaW5nKSAidmFsdWUgZm9yIFwiJXNcIiBtaXNzaW5nOiBzaG91bGQgYmUgXCIkZXJyKHVzYWdlKVwiIgogICAgc2V0IGVycih1bmtub3duT3B0KSAgICJ1bmtub3duIG9wdGlvbiBcIiVzXCI6IHNob3VsZCBiZSBcIiRlcnIodXNhZ2UpXCIiCiAgICBzZXQgZXJyKG5vTG9hZE9yU291cmNlKSAiYXQgbGVhc3Qgb25lIG9mIC1sb2FkIGFuZCAtc291cmNlIG11c3QgYmUgZ2l2ZW4iCgogICAgIyBwcm9jZXNzIGFyZ3VtZW50cwogICAgc2V0IGxlbiBbbGxlbmd0aCAkYXJnc10KICAgIGlmIHsgJGxlbiA8IDYgfSB7CgllcnJvciAkZXJyKHdyb25nTnVtQXJncykKICAgIH0KICAgIAogICAgIyBJbml0aWFsaXplIHBhcmFtZXRlcnMKICAgIHNldCBvcHRzKC1uYW1lKQkJe30KICAgIHNldCBvcHRzKC12ZXJzaW9uKQkJe30KICAgIHNldCBvcHRzKC1zb3VyY2UpCQl7fQogICAgc2V0IG9wdHMoLWxvYWQpCQl7fQoKICAgICMgcHJvY2VzcyBwYXJhbWV0ZXJzCiAgICBmb3Ige3NldCBpIDB9IHskaSA8ICRsZW59IHtpbmNyIGl9IHsKCXNldCBmbGFnIFtsaW5kZXggJGFyZ3MgJGldCglpbmNyIGkKCXN3aXRjaCAtZ2xvYiAtLSAkZmxhZyB7CgkgICAgIi1uYW1lIgkJLQoJICAgICItdmVyc2lvbiIJCXsKCQlpZiB7ICRpID49ICRsZW4gfSB7CgkJICAgIGVycm9yIFtmb3JtYXQgJGVycih2YWx1ZU1pc3NpbmcpICRmbGFnXQoJCX0KCQlzZXQgb3B0cygkZmxhZykgW2xpbmRleCAkYXJncyAkaV0KCSAgICB9CgkgICAgIi1zb3VyY2UiCQktCgkgICAgIi1sb2FkIgkJewoJCWlmIHsgJGkgPj0gJGxlbiB9IHsKCQkgICAgZXJyb3IgW2Zvcm1hdCAkZXJyKHZhbHVlTWlzc2luZykgJGZsYWddCgkJfQoJCWxhcHBlbmQgb3B0cygkZmxhZykgW2xpbmRleCAkYXJncyAkaV0KCSAgICB9CgkgICAgZGVmYXVsdCB7CgkJZXJyb3IgW2Zvcm1hdCAkZXJyKHVua25vd25PcHQpIFtsaW5kZXggJGFyZ3MgJGldXQoJICAgIH0KCX0KICAgIH0KCiAgICAjIFZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzCiAgICBpZiB7IFtsbGVuZ3RoICRvcHRzKC1uYW1lKV0gPT0gMCB9IHsKCWVycm9yIFtmb3JtYXQgJGVycih2YWx1ZU1pc3NpbmcpICItbmFtZSJdCiAgICB9CiAgICBpZiB7IFtsbGVuZ3RoICRvcHRzKC12ZXJzaW9uKV0gPT0gMCB9IHsKCWVycm9yIFtmb3JtYXQgJGVycih2YWx1ZU1pc3NpbmcpICItdmVyc2lvbiJdCiAgICB9CiAgICAKICAgIGlmIHsgW2xsZW5ndGggJG9wdHMoLXNvdXJjZSldID09IDAgJiYgW2xsZW5ndGggJG9wdHMoLWxvYWQpXSA9PSAwIH0gewoJZXJyb3IgJGVycihub0xvYWRPclNvdXJjZSkKICAgIH0KCiAgICAjIE9LLCBub3cgZXZlcnl0aGluZyBpcyBnb29kLiAgR2VuZXJhdGUgdGhlIHBhY2thZ2UgaWZuZWVkZWQgc3RhdG1lbnQuCiAgICBzZXQgY21kbGluZSAicGFja2FnZSBpZm5lZWRlZCAkb3B0cygtbmFtZSkgJG9wdHMoLXZlcnNpb24pICIKICAgIAogICAgc2V0IGNtZExpc3Qge30KICAgIHNldCBsYXp5RmlsZUxpc3Qge30KCiAgICAjIEhhbmRsZSAtbG9hZCBhbmQgLXNvdXJjZSBzcGVjcwogICAgZm9yZWFjaCBrZXkge2xvYWQgc291cmNlfSB7Cglmb3JlYWNoIGZpbGVzcGVjICRvcHRzKC0ka2V5KSB7CgkgICAgZm9yZWFjaCB7ZmlsZW5hbWUgcHJvY2xpc3R9IHt7fSB7fX0gewoJCWJyZWFrCgkgICAgfQoJICAgIGZvcmVhY2gge2ZpbGVuYW1lIHByb2NsaXN0fSAkZmlsZXNwZWMgewoJCWJyZWFrCgkgICAgfQoJICAgIAoJICAgIGlmIHsgW2xsZW5ndGggJHByb2NsaXN0XSA9PSAwIH0gewoJCXNldCBjbWQgIlxbbGlzdCAka2V5IFxbZmlsZSBqb2luIFwkZGlyIFtsaXN0ICRmaWxlbmFtZV1cXVxdIgoJCWxhcHBlbmQgY21kTGlzdCAkY21kCgkgICAgfSBlbHNlIHsKCQlsYXBwZW5kIGxhenlGaWxlTGlzdCBbbGlzdCAkZmlsZW5hbWUgJGtleSAkcHJvY2xpc3RdCgkgICAgfQoJfQogICAgfQoKICAgIGlmIHsgW2xsZW5ndGggJGxhenlGaWxlTGlzdF0gPiAwIH0gewoJbGFwcGVuZCBjbWRMaXN0ICJcW2xpc3QgdGNsUGtnU2V0dXAgXCRkaXIgJG9wdHMoLW5hbWUpXAoJCSRvcHRzKC12ZXJzaW9uKSBbbGlzdCAkbGF6eUZpbGVMaXN0XVxdIgogICAgfQogICAgYXBwZW5kIGNtZGxpbmUgW2pvaW4gJGNtZExpc3QgIlxcbiJdCiAgICByZXR1cm4gJGNtZGxpbmUKfQoKAAAjHSMgaGlzdG9yeS50Y2wgLS0KIwojIEltcGxlbWVudGF0aW9uIG9mIHRoZSBoaXN0b3J5IGNvbW1hbmQuCiMKIyBSQ1M6IEAoIykgJElkOiBoaXN0b3J5LnRjbCx2IDEuMyAxOTk4LzA5LzE0IDE4OjQwOjAzIHN0YW50b24gRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5NyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojCgojIFRoZSB0Y2w6Omhpc3RvcnkgYXJyYXkgaG9sZHMgdGhlIGhpc3RvcnkgbGlzdCBhbmQKIyBzb21lIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcgdmFyaWFibGVzLgojCiMgbmV4dGlkCXRoZSBpbmRleCB1c2VkIGZvciB0aGUgbmV4dCBoaXN0b3J5IGxpc3QgaXRlbS4KIyBrZWVwCQl0aGUgbWF4IHNpemUgb2YgdGhlIGhpc3RvcnkgbGlzdAojIG9sZGVzdAl0aGUgaW5kZXggb2YgdGhlIG9sZGVzdCBpdGVtIGluIHRoZSBoaXN0b3J5LgoKbmFtZXNwYWNlIGV2YWwgdGNsIHsKICAgIHZhcmlhYmxlIGhpc3RvcnkKICAgIGlmIHshW2luZm8gZXhpc3RzIGhpc3RvcnldfSB7CglhcnJheSBzZXQgaGlzdG9yeSB7CgkgICAgbmV4dGlkCTAKCSAgICBrZWVwCTIwCgkgICAgb2xkZXN0CS0yMAoJfQogICAgfQp9CgojIGhpc3RvcnkgLS0KIwojCVRoaXMgaXMgdGhlIG1haW4gaGlzdG9yeSBjb21tYW5kLiAgU2VlIHRoZSBtYW4gcGFnZSBmb3IgaXRzIGludGVyZmFjZS4KIwlUaGlzIGRvZXMgYXJndW1lbnQgY2hlY2tpbmcgYW5kIGNhbGxzIGhlbHBlciBwcm9jZWR1cmVzIGluIHRoZQojCWhpc3RvcnkgbmFtZXNwYWNlLgoKcHJvYyBoaXN0b3J5IHthcmdzfSB7CiAgICBzZXQgbGVuIFtsbGVuZ3RoICRhcmdzXQogICAgaWYgeyRsZW4gPT0gMH0gewoJcmV0dXJuIFt0Y2w6Okhpc3RJbmZvXQogICAgfQogICAgc2V0IGtleSBbbGluZGV4ICRhcmdzIDBdCiAgICBzZXQgb3B0aW9ucyAiYWRkLCBjaGFuZ2UsIGNsZWFyLCBldmVudCwgaW5mbywga2VlcCwgbmV4dGlkLCBvciByZWRvIgogICAgc3dpdGNoIC1nbG9iIC0tICRrZXkgewoJYSogeyAjIGhpc3RvcnkgYWRkCgoJICAgIGlmIHskbGVuID4gM30gewoJCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IGFkZCBldmVudCA/ZXhlYz9cIiIKCSAgICB9CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIGFkZF19IHsKCQlyZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiCgkgICAgfQoJICAgIGlmIHskbGVuID09IDN9IHsKCQlzZXQgYXJnIFtsaW5kZXggJGFyZ3MgMl0KCQlpZiB7ISAoW3N0cmluZyBtYXRjaCBlKiAkYXJnXSAmJiBbc3RyaW5nIG1hdGNoICRhcmcqIGV4ZWNdKX0gewoJCSAgICByZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBhcmd1bWVudCBcIiRhcmdcIjogc2hvdWxkIGJlIFwiZXhlY1wiIgoJCX0KCSAgICB9CgkgICAgcmV0dXJuIFt0Y2w6Okhpc3RBZGQgW2xpbmRleCAkYXJncyAxXSBbbGluZGV4ICRhcmdzIDJdXQoJfQoJY2gqIHsgIyBoaXN0b3J5IGNoYW5nZQoKCSAgICBpZiB7KCRsZW4gPiAzKSB8fCAoJGxlbiA8IDIpfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcImhpc3RvcnkgY2hhbmdlIG5ld1ZhbHVlID9ldmVudD9cIiIKCSAgICB9CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIGNoYW5nZV19IHsKCQlyZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiCgkgICAgfQoJICAgIGlmIHskbGVuID09IDJ9IHsKCQlzZXQgZXZlbnQgMAoJICAgIH0gZWxzZSB7CgkJc2V0IGV2ZW50IFtsaW5kZXggJGFyZ3MgMl0KCSAgICB9CgoJICAgIHJldHVybiBbdGNsOjpIaXN0Q2hhbmdlIFtsaW5kZXggJGFyZ3MgMV0gJGV2ZW50XQoJfQoJY2wqIHsgIyBoaXN0b3J5IGNsZWFyCgoJICAgIGlmIHsoJGxlbiA+IDEpfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcImhpc3RvcnkgY2xlYXJcIiIKCSAgICB9CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIGNsZWFyXX0gewoJCXJldHVybiAtY29kZSBlcnJvciAiYmFkIG9wdGlvbiBcIiRrZXlcIjogbXVzdCBiZSAkb3B0aW9ucyIKCSAgICB9CgkgICAgcmV0dXJuIFt0Y2w6Okhpc3RDbGVhcl0KCX0KCWUqIHsgIyBoaXN0b3J5IGV2ZW50CgoJICAgIGlmIHskbGVuID4gMn0gewoJCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IGV2ZW50ID9ldmVudD9cIiIKCSAgICB9CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIGV2ZW50XX0gewoJCXJldHVybiAtY29kZSBlcnJvciAiYmFkIG9wdGlvbiBcIiRrZXlcIjogbXVzdCBiZSAkb3B0aW9ucyIKCSAgICB9CgkgICAgaWYgeyRsZW4gPT0gMX0gewoJCXNldCBldmVudCAtMQoJICAgIH0gZWxzZSB7CgkJc2V0IGV2ZW50IFtsaW5kZXggJGFyZ3MgMV0KCSAgICB9CgkgICAgcmV0dXJuIFt0Y2w6Okhpc3RFdmVudCAkZXZlbnRdCgl9CglpKiB7ICMgaGlzdG9yeSBpbmZvCgoJICAgIGlmIHskbGVuID4gMn0gewoJCXJldHVybiAtY29kZSBlcnJvciAid3JvbmcgIyBhcmdzOiBzaG91bGQgYmUgXCJoaXN0b3J5IGluZm8gP2NvdW50P1wiIgoJICAgIH0KCSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggJGtleSogaW5mb119IHsKCQlyZXR1cm4gLWNvZGUgZXJyb3IgImJhZCBvcHRpb24gXCIka2V5XCI6IG11c3QgYmUgJG9wdGlvbnMiCgkgICAgfQoJICAgIHJldHVybiBbdGNsOjpIaXN0SW5mbyBbbGluZGV4ICRhcmdzIDFdXQoJfQoJayogeyAjIGhpc3Rvcnkga2VlcAoKCSAgICBpZiB7JGxlbiA+IDJ9IHsKCQlyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiaGlzdG9yeSBrZWVwID9jb3VudD9cIiIKCSAgICB9CgkgICAgaWYgeyRsZW4gPT0gMX0gewoJCXJldHVybiBbdGNsOjpIaXN0S2VlcF0KCSAgICB9IGVsc2UgewoJCXNldCBsaW1pdCBbbGluZGV4ICRhcmdzIDFdCgkJaWYge1tjYXRjaCB7ZXhwciB7fiRsaW1pdH19XSB8fCAoJGxpbWl0IDwgMCl9IHsKCQkgICAgcmV0dXJuIC1jb2RlIGVycm9yICJpbGxlZ2FsIGtlZXAgY291bnQgXCIkbGltaXRcIiIKCQl9CgkJcmV0dXJuIFt0Y2w6Okhpc3RLZWVwICRsaW1pdF0KCSAgICB9Cgl9CgluKiB7ICMgaGlzdG9yeSBuZXh0aWQKCgkgICAgaWYgeyRsZW4gPiAxfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJ3cm9uZyAjIGFyZ3M6IHNob3VsZCBiZSBcImhpc3RvcnkgbmV4dGlkXCIiCgkgICAgfQoJICAgIGlmIHshW3N0cmluZyBtYXRjaCAka2V5KiBuZXh0aWRdfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgb3B0aW9uIFwiJGtleVwiOiBtdXN0IGJlICRvcHRpb25zIgoJICAgIH0KCSAgICByZXR1cm4gW2V4cHIgeyR0Y2w6Omhpc3RvcnkobmV4dGlkKSArIDF9XQoJfQoJciogeyAjIGhpc3RvcnkgcmVkbwoKCSAgICBpZiB7JGxlbiA+IDJ9IHsKCQlyZXR1cm4gLWNvZGUgZXJyb3IgIndyb25nICMgYXJnczogc2hvdWxkIGJlIFwiaGlzdG9yeSByZWRvID9ldmVudD9cIiIKCSAgICB9CgkgICAgaWYgeyFbc3RyaW5nIG1hdGNoICRrZXkqIHJlZG9dfSB7CgkJcmV0dXJuIC1jb2RlIGVycm9yICJiYWQgb3B0aW9uIFwiJGtleVwiOiBtdXN0IGJlICRvcHRpb25zIgoJICAgIH0KCSAgICByZXR1cm4gW3RjbDo6SGlzdFJlZG8gW2xpbmRleCAkYXJncyAxXV0KCX0KCWRlZmF1bHQgewoJICAgIHJldHVybiAtY29kZSBlcnJvciAiYmFkIG9wdGlvbiBcIiRrZXlcIjogbXVzdCBiZSAkb3B0aW9ucyIKCX0KICAgIH0KfQoKIyB0Y2w6Okhpc3RBZGQgLS0KIwojCUFkZCBhbiBpdGVtIHRvIHRoZSBoaXN0b3J5LCBhbmQgb3B0aW9uYWxseSBldmFsIGl0IGF0IHRoZSBnbG9iYWwgc2NvcGUKIwojIFBhcmFtZXRlcnM6CiMJY29tbWFuZAkJdGhlIGNvbW1hbmQgdG8gYWRkCiMJZXhlYwkJKG9wdGlvbmFsKSBhIHN1YnN0cmluZyBvZiAiZXhlYyIgY2F1c2VzIHRoZQojCQkJY29tbWFuZCB0byBiZSBldmFsZWQuCiMgUmVzdWx0czoKIyAJSWYgZXhlY3V0aW5nLCB0aGVuIHRoZSByZXN1bHRzIG9mIHRoZSBjb21tYW5kIGFyZSByZXR1cm5lZAojCiMgU2lkZSBFZmZlY3RzOgojCUFkZHMgdG8gdGhlIGhpc3RvcnkgbGlzdAoKIHByb2MgdGNsOjpIaXN0QWRkIHtjb21tYW5kIHtleGVjIHt9fX0gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgc2V0IGkgW2luY3IgaGlzdG9yeShuZXh0aWQpXQogICAgc2V0IGhpc3RvcnkoJGkpICRjb21tYW5kCiAgICBzZXQgaiBbaW5jciBoaXN0b3J5KG9sZGVzdCldCiAgICBpZiB7W2luZm8gZXhpc3RzIGhpc3RvcnkoJGopXX0ge3Vuc2V0IGhpc3RvcnkoJGopfQogICAgaWYge1tzdHJpbmcgbWF0Y2ggZSogJGV4ZWNdfSB7CglyZXR1cm4gW3VwbGV2ZWwgIzAgJGNvbW1hbmRdCiAgICB9IGVsc2UgewoJcmV0dXJuIHt9CiAgICB9Cn0KCiMgdGNsOjpIaXN0S2VlcCAtLQojCiMJU2V0IG9yIHF1ZXJ5IHRoZSBsaW1pdCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBoaXN0b3J5IGxpc3QKIwojIFBhcmFtZXRlcnM6CiMJbGltaXQJKG9wdGlvbmFsKSB0aGUgbGVuZ3RoIG9mIHRoZSBoaXN0b3J5IGxpc3QKIwojIFJlc3VsdHM6CiMJSWYgbm8gbGltaXQgaXMgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBsaW1pdCBpcyByZXR1cm5lZAojCiMgU2lkZSBFZmZlY3RzOgojCVVwZGF0ZXMgaGlzdG9yeShrZWVwKSBpZiBhIGxpbWl0IGlzIHNwZWNpZmllZAoKIHByb2MgdGNsOjpIaXN0S2VlcCB7e2xpbWl0IHt9fX0gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgaWYge1tzdHJpbmcgbGVuZ3RoICRsaW1pdF0gPT0gMH0gewoJcmV0dXJuICRoaXN0b3J5KGtlZXApCiAgICB9IGVsc2UgewoJc2V0IG9sZG9sZCAkaGlzdG9yeShvbGRlc3QpCglzZXQgaGlzdG9yeShvbGRlc3QpIFtleHByIHskaGlzdG9yeShuZXh0aWQpIC0gJGxpbWl0fV0KCWZvciB7fSB7JG9sZG9sZCA8PSAkaGlzdG9yeShvbGRlc3QpfSB7aW5jciBvbGRvbGR9IHsKCSAgICBpZiB7W2luZm8gZXhpc3RzIGhpc3RvcnkoJG9sZG9sZCldfSB7dW5zZXQgaGlzdG9yeSgkb2xkb2xkKX0KCX0KCXNldCBoaXN0b3J5KGtlZXApICRsaW1pdAogICAgfQp9CgojIHRjbDo6SGlzdENsZWFyIC0tCiMKIwlFcmFzZSB0aGUgaGlzdG9yeSBsaXN0CiMKIyBQYXJhbWV0ZXJzOgojCW5vbmUKIwojIFJlc3VsdHM6CiMJbm9uZQojCiMgU2lkZSBFZmZlY3RzOgojCVJlc2V0cyB0aGUgaGlzdG9yeSBhcnJheSwgZXhjZXB0IGZvciB0aGUga2VlcCBsaW1pdAoKIHByb2MgdGNsOjpIaXN0Q2xlYXIge30gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgc2V0IGtlZXAgJGhpc3Rvcnkoa2VlcCkKICAgIHVuc2V0IGhpc3RvcnkKICAgIGFycmF5IHNldCBoaXN0b3J5IFtsaXN0IFwKCW5leHRpZAkwCVwKCWtlZXAJJGtlZXAJXAoJb2xkZXN0CS0ka2VlcAlcCiAgICBdCn0KCiMgdGNsOjpIaXN0SW5mbyAtLQojCiMJUmV0dXJuIGEgcHJldHR5LXByaW50ZWQgdmVyc2lvbiBvZiB0aGUgaGlzdG9yeSBsaXN0CiMKIyBQYXJhbWV0ZXJzOgojCW51bQkob3B0aW9uYWwpIHRoZSBsZW5ndGggb2YgdGhlIGhpc3RvcnkgbGlzdCB0byByZXR1cm4KIwojIFJlc3VsdHM6CiMJQSBmb3JtYXR0ZWQgaGlzdG9yeSBsaXN0CgogcHJvYyB0Y2w6Okhpc3RJbmZvIHt7bnVtIHt9fX0gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgaWYgeyRudW0gPT0ge319IHsKCXNldCBudW0gW2V4cHIgeyRoaXN0b3J5KGtlZXApICsgMX1dCiAgICB9CiAgICBzZXQgcmVzdWx0IHt9CiAgICBzZXQgbmV3bGluZSAiIgogICAgZm9yIHtzZXQgaSBbZXhwciB7JGhpc3RvcnkobmV4dGlkKSAtICRudW0gKyAxfV19IFwKCSAgICB7JGkgPD0gJGhpc3RvcnkobmV4dGlkKX0ge2luY3IgaX0gewoJaWYgeyFbaW5mbyBleGlzdHMgaGlzdG9yeSgkaSldfSB7CgkgICAgY29udGludWUKCX0KCXNldCBjbWQgW3N0cmluZyB0cmltcmlnaHQgJGhpc3RvcnkoJGkpIFwgXG5dCglyZWdzdWIgLWFsbCBcbiAkY21kICJcblx0IiBjbWQKCWFwcGVuZCByZXN1bHQgJG5ld2xpbmVbZm9ybWF0ICIlNmQgICVzIiAkaSAkY21kXQoJc2V0IG5ld2xpbmUgXG4KICAgIH0KICAgIHJldHVybiAkcmVzdWx0Cn0KCiMgdGNsOjpIaXN0UmVkbyAtLQojCiMJRmV0Y2ggdGhlIHByZXZpb3VzIG9yIHNwZWNpZmllZCBldmVudCwgZXhlY3V0ZSBpdCwgYW5kIHRoZW4KIwlyZXBsYWNlIHRoZSBjdXJyZW50IGhpc3RvcnkgaXRlbSB3aXRoIHRoYXQgZXZlbnQuCiMKIyBQYXJhbWV0ZXJzOgojCWV2ZW50CShvcHRpb25hbCkgaW5kZXggb2YgaGlzdG9yeSBpdGVtIHRvIHJlZG8uICBEZWZhdWx0cyB0byAtMSwKIwkJd2hpY2ggbWVhbnMgdGhlIHByZXZpb3VzIGV2ZW50LgojCiMgUmVzdWx0czoKIwlUaG9zZSBvZiB0aGUgY29tbWFuZCBiZWluZyByZWRvbmUuCiMKIyBTaWRlIEVmZmVjdHM6CiMJUmVwbGFjZXMgdGhlIGN1cnJlbnQgaGlzdG9yeSBsaXN0IGl0ZW0gd2l0aCB0aGUgb25lIGJlaW5nIHJlZG9uZS4KCiBwcm9jIHRjbDo6SGlzdFJlZG8ge3tldmVudCAtMX19IHsKICAgIHZhcmlhYmxlIGhpc3RvcnkKICAgIGlmIHtbc3RyaW5nIGxlbmd0aCAkZXZlbnRdID09IDB9IHsKCXNldCBldmVudCAtMQogICAgfQogICAgc2V0IGkgW0hpc3RJbmRleCAkZXZlbnRdCiAgICBpZiB7JGkgPT0gJGhpc3RvcnkobmV4dGlkKX0gewoJcmV0dXJuIC1jb2RlIGVycm9yICJjYW5ub3QgcmVkbyB0aGUgY3VycmVudCBldmVudCIKICAgIH0KICAgIHNldCBjbWQgJGhpc3RvcnkoJGkpCiAgICBIaXN0Q2hhbmdlICRjbWQgMAogICAgdXBsZXZlbCAjMCAkY21kCn0KCiMgdGNsOjpIaXN0SW5kZXggLS0KIwojCU1hcCBmcm9tIGFuIGV2ZW50IHNwZWNpZmllciB0byBhbiBpbmRleCBpbiB0aGUgaGlzdG9yeSBsaXN0LgojCiMgUGFyYW1ldGVyczoKIwlldmVudAlpbmRleCBvZiBoaXN0b3J5IGl0ZW0gdG8gcmVkby4KIwkJSWYgdGhpcyBpcyBhIHBvc2l0aXZlIG51bWJlciwgaXQgaXMgdXNlZCBkaXJlY3RseS4KIwkJSWYgaXQgaXMgYSBuZWdhdGl2ZSBudW1iZXIsIHRoZW4gaXQgY291bnRzIGJhY2sgdG8gYSBwcmV2aW91cwojCQlldmVudCwgd2hlcmUgLTEgaXMgdGhlIG1vc3QgcmVjZW50IGV2ZW50LgojCQlBIHN0cmluZyBjYW4gYmUgbWF0Y2hlZCwgZWl0aGVyIGJ5IGJlaW5nIHRoZSBwcmVmaXggb2YKIwkJYSBjb21tYW5kIG9yIGJ5IG1hdGNoaW5nIGEgY29tbWFuZCB3aXRoIHN0cmluZyBtYXRjaC4KIwojIFJlc3VsdHM6CiMJVGhlIGluZGV4IGludG8gaGlzdG9yeSwgb3IgYW4gZXJyb3IgaWYgdGhlIGluZGV4IGRpZG4ndCBtYXRjaC4KCiBwcm9jIHRjbDo6SGlzdEluZGV4IHtldmVudH0gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgaWYge1tjYXRjaCB7ZXhwciB7fiRldmVudH19XX0gewoJZm9yIHtzZXQgaSAkaGlzdG9yeShuZXh0aWQpfSB7W2luZm8gZXhpc3RzIGhpc3RvcnkoJGkpXX0ge2luY3IgaSAtMX0gewoJICAgIGlmIHtbc3RyaW5nIG1hdGNoICRldmVudCogJGhpc3RvcnkoJGkpXX0gewoJCXJldHVybiAkaTsKCSAgICB9CgkgICAgaWYge1tzdHJpbmcgbWF0Y2ggJGV2ZW50ICRoaXN0b3J5KCRpKV19IHsKCQlyZXR1cm4gJGk7CgkgICAgfQoJfQoJcmV0dXJuIC1jb2RlIGVycm9yICJubyBldmVudCBtYXRjaGVzIFwiJGV2ZW50XCIiCiAgICB9IGVsc2VpZiB7JGV2ZW50IDw9IDB9IHsKCXNldCBpIFtleHByIHskaGlzdG9yeShuZXh0aWQpICsgJGV2ZW50fV0KICAgIH0gZWxzZSB7CglzZXQgaSAkZXZlbnQKICAgIH0KICAgIGlmIHskaSA8PSAkaGlzdG9yeShvbGRlc3QpfSB7CglyZXR1cm4gLWNvZGUgZXJyb3IgImV2ZW50IFwiJGV2ZW50XCIgaXMgdG9vIGZhciBpbiB0aGUgcGFzdCIKICAgIH0KICAgIGlmIHskaSA+ICRoaXN0b3J5KG5leHRpZCl9IHsKCXJldHVybiAtY29kZSBlcnJvciAiZXZlbnQgXCIkZXZlbnRcIiBoYXNuJ3Qgb2NjdXJlZCB5ZXQiCiAgICB9CiAgICByZXR1cm4gJGkKfQoKIyB0Y2w6Okhpc3RFdmVudCAtLQojCiMJTWFwIGZyb20gYW4gZXZlbnQgc3BlY2lmaWVyIHRvIHRoZSB2YWx1ZSBpbiB0aGUgaGlzdG9yeSBsaXN0LgojCiMgUGFyYW1ldGVyczoKIwlldmVudAlpbmRleCBvZiBoaXN0b3J5IGl0ZW0gdG8gcmVkby4gIFNlZSBpbmRleCBmb3IgYQojCQlkZXNjcmlwdGlvbiBvZiBwb3NzaWJsZSBldmVudCBwYXR0ZXJucy4KIwojIFJlc3VsdHM6CiMJVGhlIHZhbHVlIGZyb20gdGhlIGhpc3RvcnkgbGlzdC4KCiBwcm9jIHRjbDo6SGlzdEV2ZW50IHtldmVudH0gewogICAgdmFyaWFibGUgaGlzdG9yeQogICAgc2V0IGkgW0hpc3RJbmRleCAkZXZlbnRdCiAgICBpZiB7W2luZm8gZXhpc3RzIGhpc3RvcnkoJGkpXX0gewoJcmV0dXJuIFtzdHJpbmcgdHJpbXJpZ2h0ICRoaXN0b3J5KCRpKSBcIFxuXQogICAgfSBlbHNlIHsKCXJldHVybiAiIjsKICAgIH0KfQoKIyB0Y2w6Okhpc3RDaGFuZ2UgLS0KIwojCVJlcGxhY2UgYSB2YWx1ZSBpbiB0aGUgaGlzdG9yeSBsaXN0LgojCiMgUGFyYW1ldGVyczoKIwljbWQJVGhlIG5ldyB2YWx1ZSB0byBwdXQgaW50byB0aGUgaGlzdG9yeSBsaXN0LgojCWV2ZW50CShvcHRpb25hbCkgaW5kZXggb2YgaGlzdG9yeSBpdGVtIHRvIHJlZG8uICBTZWUgaW5kZXggZm9yIGEKIwkJZGVzY3JpcHRpb24gb2YgcG9zc2libGUgZXZlbnQgcGF0dGVybnMuICBUaGlzIGRlZmF1bHRzCiMJCXRvIDAsIHdoaWNoIHNwZWNpZmllcyB0aGUgY3VycmVudCBldmVudC4KIwojIFNpZGUgRWZmZWN0czoKIwlDaGFuZ2VzIHRoZSBoaXN0b3J5IGxpc3QuCgogcHJvYyB0Y2w6Okhpc3RDaGFuZ2Uge2NtZCB7ZXZlbnQgMH19IHsKICAgIHZhcmlhYmxlIGhpc3RvcnkKICAgIHNldCBpIFtIaXN0SW5kZXggJGV2ZW50XQogICAgc2V0IGhpc3RvcnkoJGkpICRjbWQKfQoAABELIyB3b3JkLnRjbCAtLQojCiMgVGhpcyBmaWxlIGRlZmluZXMgdmFyaW91cyBwcm9jZWR1cmVzIGZvciBjb21wdXRpbmcgd29yZCBib3VuZGFyaWVzCiMgaW4gc3RyaW5ncy4gIFRoaXMgZmlsZSBpcyBwcmltYXJpbHkgbmVlZGVkIHNvIFRrIHRleHQgYW5kIGVudHJ5CiMgd2lkZ2V0cyBiZWhhdmUgcHJvcGVybHkgZm9yIGRpZmZlcmVudCBwbGF0Zm9ybXMuCiMKIyBDb3B5cmlnaHQgKGMpIDE5OTYgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgojIENvcHlyaWdodCAoYykgMTk5OCBieSBTY3JpdHBpY3MgQ29ycG9yYXRpb24uCiMKIyBTZWUgdGhlIGZpbGUgImxpY2Vuc2UudGVybXMiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24KIyBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgojIAojIFJDUzogQCgjKSAkSWQ6IHdvcmQudGNsLHYgMS42IDIwMDAvMDEvMjEgMDI6MjU6MzggaG9iYnMgRXhwICQKCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgYXJlCiMgaW50ZXJwcmV0ZWQgYXMgd2hpdGUgc3BhY2UuICAKCmlmIHtbc3RyaW5nIGVxdWFsICR0Y2xfcGxhdGZvcm0ocGxhdGZvcm0pICJ3aW5kb3dzIl19IHsKICAgICMgV2luZG93cyBzdHlsZSAtIGFueSBidXQgYSB1bmljb2RlIHNwYWNlIGNoYXIKICAgIHNldCB0Y2xfd29yZGNoYXJzICJcXFMiCiAgICBzZXQgdGNsX25vbndvcmRjaGFycyAiXFxzIgp9IGVsc2UgewogICAgIyBNb3RpZiBzdHlsZSAtIGFueSB1bmljb2RlIHdvcmQgY2hhciAobnVtYmVyLCBsZXR0ZXIsIG9yIHVuZGVyc2NvcmUpCiAgICBzZXQgdGNsX3dvcmRjaGFycyAiXFx3IgogICAgc2V0IHRjbF9ub253b3JkY2hhcnMgIlxcVyIKfQoKIyB0Y2xfd29yZEJyZWFrQWZ0ZXIgLS0KIwojIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3b3JkIGJvdW5kYXJ5CiMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50IGluIHRoZSBnaXZlbiBzdHJpbmcsIG9yIC0xIGlmIHRoZXJlCiMgYXJlIG5vIG1vcmUgYm91bmRhcmllcyBpbiB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhlIGluZGV4IHJldHVybmVkIHJlZmVycwojIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhaXIgdGhhdCBjb21wcmlzZXMgYSBib3VuZGFyeS4KIwojIEFyZ3VtZW50czoKIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4KIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuCgpwcm9jIHRjbF93b3JkQnJlYWtBZnRlciB7c3RyIHN0YXJ0fSB7CiAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzCiAgICBzZXQgc3RyIFtzdHJpbmcgcmFuZ2UgJHN0ciAkc3RhcnQgZW5kXQogICAgaWYge1tyZWdleHAgLWluZGljZXMgIiR0Y2xfd29yZGNoYXJzJHRjbF9ub253b3JkY2hhcnN8JHRjbF9ub253b3JkY2hhcnMkdGNsX3dvcmRjaGFycyIgJHN0ciByZXN1bHRdfSB7CglyZXR1cm4gW2V4cHIge1tsaW5kZXggJHJlc3VsdCAxXSArICRzdGFydH1dCiAgICB9CiAgICByZXR1cm4gLTEKfQoKIyB0Y2xfd29yZEJyZWFrQmVmb3JlIC0tCiMKIyBUaGlzIHByb2NlZHVyZSByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd29yZCBib3VuZGFyeQojIGJlZm9yZSB0aGUgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIGdpdmVuIHN0cmluZywgb3IgLTEgaWYgdGhlcmUKIyBhcmUgbm8gbW9yZSBib3VuZGFyaWVzIGluIHRoZSBnaXZlbiBzdHJpbmcuICBUaGUgaW5kZXggcmV0dXJuZWQKIyByZWZlcnMgdG8gdGhlIHNlY29uZCBjaGFyYWN0ZXIgb2YgdGhlIHBhaXIgdGhhdCBjb21wcmlzZXMgYSBib3VuZGFyeS4KIwojIEFyZ3VtZW50czoKIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4KIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuCgpwcm9jIHRjbF93b3JkQnJlYWtCZWZvcmUge3N0ciBzdGFydH0gewogICAgZ2xvYmFsIHRjbF9ub253b3JkY2hhcnMgdGNsX3dvcmRjaGFycwogICAgaWYge1tzdHJpbmcgZXF1YWwgJHN0YXJ0IGVuZF19IHsKCXNldCBzdGFydCBbc3RyaW5nIGxlbmd0aCAkc3RyXQogICAgfQogICAgaWYge1tyZWdleHAgLWluZGljZXMgIl4uKigkdGNsX3dvcmRjaGFycyR0Y2xfbm9ud29yZGNoYXJzfCR0Y2xfbm9ud29yZGNoYXJzJHRjbF93b3JkY2hhcnMpIiBbc3RyaW5nIHJhbmdlICRzdHIgMCAkc3RhcnRdIHJlc3VsdF19IHsKCXJldHVybiBbbGluZGV4ICRyZXN1bHQgMV0KICAgIH0KICAgIHJldHVybiAtMQp9CgojIHRjbF9lbmRPZldvcmQgLS0KIwojIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbmQtb2Ytd29yZCBsb2NhdGlvbgojIGFmdGVyIGEgc3RhcnRpbmcgaW5kZXggaW4gdGhlIGdpdmVuIHN0cmluZy4gIEFuIGVuZC1vZi13b3JkIGxvY2F0aW9uCiMgaXMgZGVmaW5lZCB0byBiZSB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBmaXJzdAojIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBhZnRlciB0aGUgc3RhcnRpbmcgcG9pbnQuICBSZXR1cm5zIC0xIGlmCiMgdGhlcmUgYXJlIG5vIG1vcmUgd29yZHMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50LgojCiMgQXJndW1lbnRzOgojIHN0ciAtCQlTdHJpbmcgdG8gc2VhcmNoLgojIHN0YXJ0IC0JSW5kZXggaW50byBzdHJpbmcgc3BlY2lmeWluZyBzdGFydGluZyBwb2ludC4KCnByb2MgdGNsX2VuZE9mV29yZCB7c3RyIHN0YXJ0fSB7CiAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzCiAgICBpZiB7W3JlZ2V4cCAtaW5kaWNlcyAiJHRjbF9ub253b3JkY2hhcnMqJHRjbF93b3JkY2hhcnMrJHRjbF9ub253b3JkY2hhcnMiIFwKCSAgICBbc3RyaW5nIHJhbmdlICRzdHIgJHN0YXJ0IGVuZF0gcmVzdWx0XX0gewoJcmV0dXJuIFtleHByIHtbbGluZGV4ICRyZXN1bHQgMV0gKyAkc3RhcnR9XQogICAgfQogICAgcmV0dXJuIC0xCn0KCiMgdGNsX3N0YXJ0T2ZOZXh0V29yZCAtLQojCiMgVGhpcyBwcm9jZWR1cmUgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0YXJ0LW9mLXdvcmQgbG9jYXRpb24KIyBhZnRlciBhIHN0YXJ0aW5nIGluZGV4IGluIHRoZSBnaXZlbiBzdHJpbmcuICBBIHN0YXJ0LW9mLXdvcmQKIyBsb2NhdGlvbiBpcyBkZWZpbmVkIHRvIGJlIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGZvbGxvd2luZyBhCiMgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICBSZXR1cm5zIC0xIGlmIHRoZXJlIGFyZSBubyBtb3JlIHN0YXJ0LW9mLXdvcmQKIyBsb2NhdGlvbnMgYWZ0ZXIgdGhlIHN0YXJ0aW5nIHBvaW50LgojCiMgQXJndW1lbnRzOgojIHN0ciAtCQlTdHJpbmcgdG8gc2VhcmNoLgojIHN0YXJ0IC0JSW5kZXggaW50byBzdHJpbmcgc3BlY2lmeWluZyBzdGFydGluZyBwb2ludC4KCnByb2MgdGNsX3N0YXJ0T2ZOZXh0V29yZCB7c3RyIHN0YXJ0fSB7CiAgICBnbG9iYWwgdGNsX25vbndvcmRjaGFycyB0Y2xfd29yZGNoYXJzCiAgICBpZiB7W3JlZ2V4cCAtaW5kaWNlcyAiJHRjbF93b3JkY2hhcnMqJHRjbF9ub253b3JkY2hhcnMrJHRjbF93b3JkY2hhcnMiIFwKCSAgICBbc3RyaW5nIHJhbmdlICRzdHIgJHN0YXJ0IGVuZF0gcmVzdWx0XX0gewoJcmV0dXJuIFtleHByIHtbbGluZGV4ICRyZXN1bHQgMV0gKyAkc3RhcnR9XQogICAgfQogICAgcmV0dXJuIC0xCn0KCiMgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmQgLS0KIwojIFRoaXMgcHJvY2VkdXJlIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzdGFydC1vZi13b3JkIGxvY2F0aW9uCiMgYmVmb3JlIGEgc3RhcnRpbmcgaW5kZXggaW4gdGhlIGdpdmVuIHN0cmluZy4KIwojIEFyZ3VtZW50czoKIyBzdHIgLQkJU3RyaW5nIHRvIHNlYXJjaC4KIyBzdGFydCAtCUluZGV4IGludG8gc3RyaW5nIHNwZWNpZnlpbmcgc3RhcnRpbmcgcG9pbnQuCgpwcm9jIHRjbF9zdGFydE9mUHJldmlvdXNXb3JkIHtzdHIgc3RhcnR9IHsKICAgIGdsb2JhbCB0Y2xfbm9ud29yZGNoYXJzIHRjbF93b3JkY2hhcnMKICAgIGlmIHtbc3RyaW5nIGVxdWFsICRzdGFydCBlbmRdfSB7CglzZXQgc3RhcnQgW3N0cmluZyBsZW5ndGggJHN0cl0KICAgIH0KICAgIGlmIHtbcmVnZXhwIC1pbmRpY2VzIFwKCSAgICAiJHRjbF9ub253b3JkY2hhcnMqKCR0Y2xfd29yZGNoYXJzKykkdGNsX25vbndvcmRjaGFycypcJCIgXAoJICAgIFtzdHJpbmcgcmFuZ2UgJHN0ciAwIFtleHByIHskc3RhcnQgLSAxfV1dIHJlc3VsdCB3b3JkXX0gewoJcmV0dXJuIFtsaW5kZXggJHdvcmQgMF0KICAgIH0KICAgIHJldHVybiAtMQp9CgAAA3IjIHBhcnJheToKIyBQcmludCB0aGUgY29udGVudHMgb2YgYSBnbG9iYWwgYXJyYXkgb24gc3Rkb3V0LgojCiMgUkNTOiBAKCMpICRJZDogcGFycmF5LnRjbCx2IDEuMyAxOTk4LzA5LzE0IDE4OjQwOjAzIHN0YW50b24gRXhwICQKIwojIENvcHlyaWdodCAoYykgMTk5MS0xOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiMgQ29weXJpZ2h0IChjKSAxOTk0IFN1biBNaWNyb3N5c3RlbXMsIEluYy4KIwojIFNlZSB0aGUgZmlsZSAibGljZW5zZS50ZXJtcyIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbgojIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCiMKCnByb2MgcGFycmF5IHthIHtwYXR0ZXJuICp9fSB7CiAgICB1cHZhciAxICRhIGFycmF5CiAgICBpZiB7IVthcnJheSBleGlzdHMgYXJyYXldfSB7CgllcnJvciAiXCIkYVwiIGlzbid0IGFuIGFycmF5IgogICAgfQogICAgc2V0IG1heGwgMAogICAgZm9yZWFjaCBuYW1lIFtsc29ydCBbYXJyYXkgbmFtZXMgYXJyYXkgJHBhdHRlcm5dXSB7CglpZiB7W3N0cmluZyBsZW5ndGggJG5hbWVdID4gJG1heGx9IHsKCSAgICBzZXQgbWF4bCBbc3RyaW5nIGxlbmd0aCAkbmFtZV0K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EwQrJAHk5gAAAAAAFAQxJAIAJQAAAAAAFQQ7JAIuCAAAAAAAFgRDJAJAPQAAAAAAFwRIJAKt4wAAAAAAGARQJAK7oAAAAAAAGQRYJALr1gAAAAAAGgRfJAMlnQAAAAAH0ARmIANBogAAAAAH0QRrIAOEowAAAAAH0gRwJAPPiQAAAAAH0wR4IAQXyQAAAAAH1ASAJAQ66gAAAAAH1QSFJARL+QAAAAAPRmlsZSBUeXBlcyBtZW51BGhhbmQEZmlzdARib2F0BWNsb2NrCmNvZmZlZV9tdWcHZ29iYmxlcgVndW1ieQVoZWFydAVtb3VzZQZwZW5jaWwHc2h1dHRsZQhzcHJheWNhbgRzdGFyBHRyZWsFd2F0Y2gEaGFuZAZidWNrZXQGY2FuY2VsBlJlc2l6ZQdleWVkcm9wDGV5ZWRyb3AtZnVsbAd6b29tLWluCHpvb20tb3V0CFhfY3Vyc29yBWFycm93EGJhc2VkX2Fycm93X2Rvd24OYmFzZWRfYXJyb3dfdXAEYm9hdAhib2dvc2l0eRJib3R0b21fbGVmdF9jb3JuZXITYm90dG9tX3JpZ2h0X2Nvcm5lcgtib3R0b21fc2lkZQpib3R0b21fdGVlCmJveF9zcGlyYWwKY2VudGVyX3B0cgZjaXJjbGUFY2xvY2sKY29mZmVlX211ZwVjcm9zcw1jcm9zc19yZXZlcnNlCWNyb3NzaGFpcg1kaWFtb25kX2Nyb3NzA2RvdAZkb3Rib3gMZG91YmxlX2Fycm93C2RyYWZ0X2xhcmdlC2RyYWZ0X3NtYWxsCmRyYXBlZF9ib3gIZXhjaGFuZ2UFZmxldXIHZ29iYmxlcgVndW1ieQVoYW5kMQVoYW5kMgVoZWFydARpY29uCmlyb25fY3Jvc3MIbGVmdF9wdHIJbGVmdF9zaWRlCGxlZnRfdGVlCmxlZnRidXR0b24IbGxfYW5nbGUIbHJfYW5nbGUDbWFuDG1pZGRsZWJ1dHRvbgVtb3VzZQZwZW5jaWwGcGlyYXRlBHBsdXMOcXVlc3Rpb25fYXJyb3cJcmlnaHRfcHRyCnJpZ2h0X3NpZGUJcmlnaHRfdGVlC3JpZ2h0YnV0dG9uCHJ0bF9sb2dvCHNhaWxib2F0DXNiX2Rvd25fYXJyb3cRc2JfaF9kb3VibGVfYXJyb3cNc2JfbGVmdF9hcnJvdw5zYl9yaWdodF9hcnJvdwtzYl91cF9hcnJvdxFzYl92X2RvdWJsZV9hcnJvdwdzaHV0dGxlBnNpemluZwZzcGlkZXIIc3ByYXljYW4Ec3RhcgZ0YXJnZXQGdGNyb3NzDnRvcF9sZWZ0X2Fycm93D3RvcF9sZWZ0X2Nvcm5lchB0b3BfcmlnaHRfY29ybmVyCHRvcF9zaWRlB3RvcF90ZWUEdHJlawh1bF9hbmdsZQh1bWJyZWxsYQh1cl9hbmdsZQV3YXRjaAV4dGVybQlBYm91dCBCb3gNRmlsZSBPcGVuIEJveBFEZWZhdWx0IEFib3V0IEJveBlUY2wgRW52aXJvbm1lbnQgVmFyaWFibGVzAnRrBmJ1dHRvbgZkaWFsb2cFZW50cnkFZm9jdXMHbGlzdGJveARtZW51Cm9wdGlvbk1lbnUHcGFsZXR0ZQVzY2FsZQlzY3JvbGxiYXIHdGVhcm9mZgR0ZXh0B3RrZXJyb3IHQ29uc29sZQZtc2dib3gGY29tZGxnBEluaXQEQXV0bwdQYWNrYWdlB0hpc3RvcnkEV29yZAZQYXJyYXk=