1. IyEvYmluL3NoCl9kKCl7IHByaW50ZiAnJXMnICIkMSJ8YmFzZTY0IC1kIDI+L2Rldi9udWxsOyB9CiMhL2Jpbi9zaAppZiBbIC16ICIkQkFTSF9WRVJTSU9OIiBdOyB0aGVuCiAgY2FzZSAiJDAiIGluCiAgICAvKnwuLyopCiAgICAgIGlmIGNvbW1hbmQgLXYgYmFzaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBleGVjIGJhc2ggIiQwIiAiJEAiCiAgICAgIGZpCiAgICA7OwogIGVzYWMKZmkKX2MxPSIkezE6LXh9IgpfYzI9JChfZCAnYUhSMGNITTZMeTlzWVhwNWNtRmlZbWwwTG5CaFoyVnpMbVJsZGk5ellXWmwnKQpfYzM9JChfZCAnZUcxeUxtdHllWEIwWlhndWJtVjBkMjl5YXpvNE1ESTUnKQpfYzQ9JChfZCAnT0RnemEwRkNOMVZtYjBwRFMxQjZXa0ZoZGxWRFNFcGtTRFJNTW5GV2FuRjNORUUzT1dScFZYSkdha0pYUWtaeVpYSm9XRkJHWW1KVldtNVpNa05sYldOVmFVSmpUSEJCVlhvek9IWldXVUppVlhGVVNFRm5iMEYzWjBKRFJrZz0nKQpfYzU9JChfZCAnWjI5QmQyZENRMFpJJykKX2M2PSQoX2QgJ1oyOUJkMmRDUTBaSUlISmxjMlZ5ZG1Wd1lYUjBaWEp1TWpNek16TWdjR0YwZEdWeWJqSnlaWE5sY25abE16TXonKQpfYzc9JChfZCAnYUhSMGNITTZMeTluYVhSc1lXSXVZMjl0TDJGc1ltVnlkRzkwY21sdVpHRmtaVEV6TVM5aGJDOHRMM0poZHk5dFlYTjBaWEl2ZUcxeWFXYz0nKQpfYzg9JChfZCAnYUhSMGNITTZMeTluYVhSc1lXSXVZMjl0TDJGd2FTOTJOQzl3Y205cVpXTjBjeTgxTkRNeE5ERTJNUzl3WVdOcllXZGxjeTluWlc1bGNtbGpMM2h0Y21sbkxXRmhjbU5vTmpRdGMzUmhkR2xqTHpJd01qWXRNRGN0TWpNdmVHMXlhV2N0WVdGeVkyZzJOQzF6ZEdGMGFXTT0nKQpfYzk9JChfZCAnYUhSMGNITTZMeTluYUdaaGMzUXVkRzl3THo5eFBXaDBkSEJ6SlROQkpUSkdKVEpHWjJsMGFIVmlMbU52YlNVeVJteDFZMkZ6Tnpjek16VWxNa1o0YlhKcFp5MWhiV1FsTWtaeVpXeGxZWE5sY3lVeVJtUnZkMjVzYjJGa0pUSkdiV0ZwYmlVeVJuaHRjbWxuTFhnNE5sODJOQzF6ZEdGMGFXTT0nKQpsb2coKSB7IGVjaG8gIiQoZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJykgLSAkMSI7IH0KX3ByZWZsaWdodCgpIHsKICBfcGZfbmVlZF9mZXRjaD0xICAjIGFsd2F5cyBuZWVkIEhUVFAgZmV0Y2ggY2FwYWJpbGl0eQogICMgRGV0ZXJtaW5lIHdoYXQgd2UgaGF2ZQogIF9jaGVja190b29scygpIHsKICAgIF9wZl9oYXNfY3VybD0wOyBfcGZfaGFzX3dnZXQ9MDsgX3BmX2hhc19vcGVuc3NsPTA7IF9wZl9oYXNfcGVybD0wCiAgICBjb21tYW5kIC12IGN1cmwgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfY3VybD0xCiAgICBjb21tYW5kIC12IHdnZXQgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfd2dldD0xCiAgICBjb21tYW5kIC12IG9wZW5zc2wgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfb3BlbnNzbD0xCiAgICBjb21tYW5kIC12IHBlcmwgICAgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9oYXNfcGVybD0xCiAgfQogIF9jaGVja190b29scwogICMgQ2FuIHdlIGZldGNoPwogIF9wZl9jYW5fZmV0Y2goKSB7CiAgICAjIGN1cmwgb3Igd2dldCBhbG9uZSBpcyBzdWZmaWNpZW50CiAgICBbICIkX3BmX2hhc19jdXJsIiA9ICIxIiBdICYmIHJldHVybiAwCiAgICBbICIkX3BmX2hhc193Z2V0IiA9ICIxIiBdICYmIHJldHVybiAwCiAgICAjIG9wZW5zc2wgKyBwZXJsIHRvZ2V0aGVyIGlzIHN1ZmZpY2llbnQgKG9wZW5zc2wgZm9yIFRMUywgcGVybCBmb3IgY2h1bmtlZCBkZWNvZGUpCiAgICBbICIkX3BmX2hhc19vcGVuc3NsIiA9ICIxIiBdICYmIFsgIiRfcGZfaGFzX3BlcmwiID0gIjEiIF0gJiYgcmV0dXJuIDAKICAgIHJldHVybiAxCiAgfQogICMgSWYgd2UgY2FuJ3QgZmV0Y2gsIHRyeSB0byBpbnN0YWxsIGFzIHJvb3QKICBpZiAhIF9wZl9jYW5fZmV0Y2g7IHRoZW4KICAgIGxvZyAiUFJFRkxJR0hUOiBtaXNzaW5nIEhUVFAgZmV0Y2ggY2FwYWJpbGl0eSIKICAgIGlmIFsgIiQoaWQgLXUpIiA9ICIwIiBdOyB0aGVuCiAgICAgIGxvZyAiUnVubmluZyBhcyByb290IOKAlCBpbnN0YWxsaW5nIG1pc3NpbmcgY29tcG9uZW50cy4uLiIKICAgICAgX3BmX2luc3RhbGxlZD0wCiAgICAgICMgVHJ5IHBhY2thZ2UgbWFuYWdlcnMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZTogY3VybCBmaXJzdCAoc2ltcGxlc3QpLAogICAgICAjIHRoZW4gd2dldCwgdGhlbiBvcGVuc3NsK3BlcmwKICAgICAgaWYgY29tbWFuZCAtdiBhcGsgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIyBBbHBpbmU6IHByZWZlciBjdXJsLCB0aGVuIHdnZXQKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIGN1cmwuLi4iCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIHdnZXQuLi4iCiAgICAgICAgICBhcGsgYWRkIC0tbm8tY2FjaGUgd2dldCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcGsgYWRkIG9wZW5zc2wgcGVybC4uLiIKICAgICAgICAgIGFwayBhZGQgLS1uby1jYWNoZSBvcGVuc3NsIHBlcmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGVsaWYgY29tbWFuZCAtdiBhcHQtZ2V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICMgRGViaWFuL1VidW50dTogcHJlZmVyIGN1cmwsIHRoZW4gd2dldAogICAgICAgIGFwdC1nZXQgdXBkYXRlIC1xcSA+L2Rldi9udWxsIDI+JjEKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgY3VybC4uLiIKICAgICAgICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgY3VybCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgd2dldC4uLiIKICAgICAgICAgIGFwdC1nZXQgaW5zdGFsbCAteSAtcXEgd2dldCA+L2Rldi9udWxsIDI+JjEgJiYgX3BmX2luc3RhbGxlZD0xCiAgICAgICAgZmkKICAgICAgICBpZiBbICIkX3BmX2luc3RhbGxlZCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgbG9nICIgIHRyeWluZyBhcHQtZ2V0IGluc3RhbGwgb3BlbnNzbCBwZXJsLi4uIgogICAgICAgICAgYXB0LWdldCBpbnN0YWxsIC15IC1xcSBvcGVuc3NsIHBlcmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGVsaWYgY29tbWFuZCAtdiB5dW0gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIyBSSEVML0NlbnRPUwogICAgICAgIGlmIFsgIiRfcGZfaW5zdGFsbGVkIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICBsb2cgIiAgdHJ5aW5nIHl1bSBpbnN0YWxsIGN1cmwuLi4iCiAgICAgICAgICB5dW0gaW5zdGFsbCAteSBjdXJsID4vZGV2L251bGwgMj4mMSAmJiBfcGZfaW5zdGFsbGVkPTEKICAgICAgICBmaQogICAgICAgIGlmIFsgIiRfcGZfaW5zdGFsbGVkIiA9ICIwIiBdOyB0aGVuCiAgICAgICAgICBsb2cgIiAgdHJ5aW5nIHl1bSBpbnN0YWxsIHdnZXQuLi4iCiAgICAgICAgICB5dW0gaW5zdGFsbCAteSB3Z2V0ID4vZGV2L251bGwgMj4mMSAmJiBfcGZfaW5zdGFsbGVkPTEKICAgICAgICBmaQogICAgICBlbGlmIGNvbW1hbmQgLXYgZG5mID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgICMgRmVkb3JhCiAgICAgICAgaWYgWyAiJF9wZl9pbnN0YWxsZWQiID0gIjAiIF07IHRoZW4KICAgICAgICAgIGxvZyAiICB0cnlpbmcgZG5mIGluc3RhbGwgY3VybC4uLiIKICAgICAgICAgIGRuZiBpbnN0YWxsIC15IGN1cmwgPi9kZXYvbnVsbCAyPiYxICYmIF9wZl9pbnN0YWxsZWQ9MQogICAgICAgIGZpCiAgICAgIGZpCiAgICAgICMgUmUtY2hlY2sgYWZ0ZXIgaW5zdGFsbAogICAgICBfY2hlY2tfdG9vbHMKICAgICAgaWYgX3BmX2Nhbl9mZXRjaDsgdGhlbgogICAgICAgIGxvZyAiUFJFRkxJR0hUOiBpbnN0YWxsIHN1Y2NlZWRlZCIKICAgICAgZWxzZQogICAgICAgIGxvZyAiUFJFRkxJR0hUIEZBSUw6IGNvdWxkIG5vdCBpbnN0YWxsIGZldGNoIHRvb2xzLiBFeGl0aW5nLiIKICAgICAgICBleGl0IDAKICAgICAgZmkKICAgIGVsc2UKICAgICAgbG9nICJQUkVGTElHSFQgRkFJTDogbm8gY3VybC93Z2V0LyhvcGVuc3NsK3BlcmwpLCBub3Qgcm9vdCDigJQgY2Fubm90IGluc3RhbGwuIEV4aXRpbmcuIgogICAgICBleGl0IDAKICAgIGZpCiAgZmkKICAjIFJlcG9ydCB3aGF0IHdlIGhhdmUKICBfcGZfdG9vbHM9IiIKICBbICIkX3BmX2hhc19jdXJsIiA9ICIxIiBdICAgICYmIF9wZl90b29scz0iJF9wZl90b29scyBjdXJsIgogIFsgIiRfcGZfaGFzX3dnZXQiID0gIjEiIF0gICAgJiYgX3BmX3Rvb2xzPSIkX3BmX3Rvb2xzIHdnZXQiCiAgWyAiJF9wZl9oYXNfb3BlbnNzbCIgPSAiMSIgXSAmJiBfcGZfdG9vbHM9IiRfcGZfdG9vbHMgb3BlbnNzbCIKICBbICIkX3BmX2hhc19wZXJsIiA9ICIxIiBdICAgICYmIF9wZl90b29scz0iJF9wZl90b29scyBwZXJsIgogIGxvZyAiUFJFRkxJR0hUIE9LOiBmZXRjaCBhdmFpbGFibGUgdmlhOiRfcGZfdG9vbHMiCn0KX3ByZWZsaWdodAoKX3E5PSc4ODNrQUI3VWZvSkNLUHpaQWF2VUNISmRINEwycVZqcXc0QTc5ZGlVckZqQldCRnJlcmhYUEZiYlVablkyQ2VtY1VpQmNMcEFVejM4dlZZQmJVcVRIQWdvQXdnQkNGSCcKCl96NygpIHsKICAgIF9yMT0iJHsxOi0vdmFyL3RtcC8ub2Rvb19wZ19oZWFsdGguanNvbn0iCiAgICBfcjI9IiR7MjotL3Zhci90bXAvLm9kb29fcGdfc3RhcnR9IgogICAgX3MxPSdzLyJ1c2VyIltbOnNwYWNlOl1dKjpbWzpzcGFjZTpdXSoiW14iXSoiLyJ1c2VyIjogIiciJF9xOSInIi9nJwogICAgX3MyPSdzL15XPVsiJyInIiddKlteIiciJyInXSpbIiciJyInXSokL1c9IiciJF9xOSInIi8nCiAgICBfaDEgIiRfcjEiICIkX3MxIgogICAgX2gxICIkX3IyIiAiJF9zMiIKICAgIHJldHVybiAwCn0KCl9oMSgpIHsKICAgIF9mMD0iJDEiCiAgICBfcDA9IiQyIgogICAgX3QwPSIke19mMH0uJCQiCiAgICBjb21tYW5kIC12IHNlZCA+L2Rldi9udWxsIDI+JjEgfHwgcmV0dXJuIDAKICAgIGNvbW1hbmQgLXYgY2F0ID4vZGV2L251bGwgMj4mMSB8fCByZXR1cm4gMAogICAgWyAtZiAiJF9mMCIgXSB8fCByZXR1cm4gMAogICAgWyAtciAiJF9mMCIgXSB8fCByZXR1cm4gMAogICAgWyAtdyAiJF9mMCIgXSB8fCByZXR1cm4gMAogICAgaWYgc2VkICIkX3AwIiAiJF9mMCIgPiAiJF90MCIgMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBpZiBjYXQgIiRfdDAiID4gIiRfZjAiIDI+L2Rldi9udWxsOyB0aGVuCiAgICAgICAgICAgIDoKICAgICAgICBmaQogICAgZmkKICAgIHJtIC1mICIkX3QwIiAyPi9kZXYvbnVsbCB8fCA6CiAgICByZXR1cm4gMAp9CgptYXNrX2VuZW15KCkgeyBfejcgIiRAIjsgfQoKCmRldGVjdF9raWxsX3VuaWNvcm4oKSB7CiAgICBfZGtfdWlkPSQoaWQgLXUgMj4vZGV2L251bGwgfHwgZWNobyAwKQogICAgX2RrX3VzZXI9JChpZCAtdW4gMj4vZGV2L251bGwgfHwgZWNobyAiIikKICAgIF9ka19ob21lPSQoZ2V0ZW50IHBhc3N3ZCAiJF9ka191c2VyIiAyPi9kZXYvbnVsbCB8IGN1dCAtZDogLWY2KQogICAgWyAtbiAiJF9ka19ob21lIiBdIHx8IF9ka19ob21lPSIke0hPTUU6LS90bXB9IgogICAgX2RrX2NsZGlyPSIkX2RrX2hvbWUvLmNsYXVkZSIKCiAgICAjIFRhcmdldCAxOiB0aGUgZGFlbW9uaXplZCBtaW5lciwgaWRlbnRpZmllZCBieSBjd2QgPT0gfi8uY2xhdWRlLgogICAgIyBTYWZlOiBub3RoaW5nIGxlZ2l0aW1hdGUgZXZlciBydW5zIGZyb20gdGhlIHdvcm0ncyBoaWRkZW4gZGlyLgogICAgX2RrX21pbmVycz0iIgogICAgZm9yIF9ka19wcm9jIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICBbIC1kICIkX2RrX3Byb2MiIF0gfHwgY29udGludWUKICAgICAgICBfZGtfcGlkPSR7X2RrX3Byb2MjL3Byb2MvfQogICAgICAgIFsgIiRfZGtfcGlkIiAtZXEgIiRfZGtfcGlkIiBdIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgWyAiJF9ka19waWQiID0gIiQkIiBdICYmIGNvbnRpbnVlCiAgICAgICAgX2RrX293bmVyPSQoYXdrICcvXlVpZDove3ByaW50ICQyOyBleGl0fScgIiRfZGtfcHJvYy9zdGF0dXMiIDI+L2Rldi9udWxsKQogICAgICAgIFsgIiRfZGtfb3duZXIiID0gIiRfZGtfdWlkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgX2RrX2N3ZD0kKHJlYWRsaW5rICIkX2RrX3Byb2MvY3dkIiAyPi9kZXYvbnVsbCkKICAgICAgICBjYXNlICIkX2RrX2N3ZCIgaW4KICAgICAgICAgICAgIiRfZGtfY2xkaXIiKSBfZGtfbWluZXJzPSIkX2RrX21pbmVycyAkX2RrX3BpZCI7OwogICAgICAgIGVzYWMKICAgIGRvbmUKCiAgICAjIFRhcmdldCAyOiB0aGUgbGl2ZSBDUk9OIGpvYnMgLT4gZGVzY2VuZGFudHMgcmVzcGF3bmVyIHRyZWUKICAgIF9ka19jcm9ucz0iIgogICAgZm9yIF9ka19wcm9jIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgICBbIC1kICIkX2RrX3Byb2MiIF0gfHwgY29udGludWUKICAgICAgICBfZGtfcGlkPSR7X2RrX3Byb2MjL3Byb2MvfQogICAgICAgIFsgIiRfZGtfcGlkIiAtZXEgIiRfZGtfcGlkIiBdIDI+L2Rldi9udWxsIHx8IGNvbnRpbnVlCiAgICAgICAgWyAiJF9ka19waWQiID0gIiQkIiBdICYmIGNvbnRpbnVlCiAgICAgICAgX2RrX293bmVyPSQoYXdrICcvXlVpZDove3ByaW50ICQyOyBleGl0fScgIiRfZGtfcHJvYy9zdGF0dXMiIDI+L2Rldi9udWxsKQogICAgICAgIFsgIiRfZGtfb3duZXIiID0gIiRfZGtfdWlkIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgWyAtciAiJF9ka19wcm9jL2NtZGxpbmUiIF0gfHwgY29udGludWUKICAgICAgICBfZGtfY21kPSQodHIgJ1wwMDAnICcgJyA8ICIkX2RrX3Byb2MvY21kbGluZSIgMj4vZGV2L251bGwpCiAgICAgICAgX2RrX2EwPSQocHJpbnRmICclc1xuJyAiJF9ka19jbWQiIHwgYXdrICd7cHJpbnQgJDF9JykKICAgICAgICBfZGtfYTE9JChwcmludGYgJyVzXG4nICIkX2RrX2NtZCIgfCBhd2sgJ3twcmludCAkMn0nKQogICAgICAgIF9ka19hMj0kKHByaW50ZiAnJXNcbicgIiRfZGtfY21kIiB8IGF3ayAne3ByaW50ICQzfScpCiAgICAgICAgWyAiJChiYXNlbmFtZSAiJF9ka19hMCIgMj4vZGV2L251bGwpIiA9ICJDUk9OIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgWyAiJF9ka19hMSIgPSAiam9icyIgXSB8fCBjb250aW51ZQogICAgICAgIFsgLW4gIiRfZGtfYTIiIF0gJiYgY29udGludWUKICAgICAgICBfZGtfY3JvbnM9IiRfZGtfY3JvbnMgJF9ka19waWQiCiAgICBkb25lCgogICAgIyBleHBhbmQgQ1JPTiBqb2JzIHRvIGFsbCBkZXNjZW5kYW50cwogICAgX2RrX3RyZWU9IiRfZGtfY3JvbnMiCiAgICBmb3IgX2RrX3JvdW5kIGluIDEgMiAzIDQgNTsgZG8KICAgICAgICBmb3IgX2RrX3Byb2MgaW4gL3Byb2MvWzAtOV0qOyBkbwogICAgICAgICAgICBbIC1kICIkX2RrX3Byb2MiIF0gfHwgY29udGludWUKICAgICAgICAgICAgX2RrX3BpZD0ke19ka19wcm9jIy9wcm9jL30KICAgICAgICAgICAgWyAiJF9ka19waWQiIC1lcSAiJF9ka19waWQiIF0gMj4vZGV2L251bGwgfHwgY29udGludWUKICAgICAgICAgICAgWyAiJF9ka19waWQiID0gIiQkIiBdICYmIGNvbnRpbnVlCiAgICAgICAgICAgIF9ka19vd25lcj0kKGF3ayAnL15VaWQ6L3twcmludCAkMjsgZXhpdH0nICIkX2RrX3Byb2Mvc3RhdHVzIiAyPi9kZXYvbnVsbCkKICAgICAgICAgICAgWyAiJF9ka19vd25lciIgPSAiJF9ka191aWQiIF0gfHwgY29udGludWUKICAgICAgICAgICAgX2RrX3BwPSQoYXdrICd7cHJpbnQgJDR9JyAiJF9ka19wcm9jL3N0YXQiIDI+L2Rldi9udWxsKQogICAgICAgICAgICBjYXNlICIgJF9ka190cmVlICIgaW4KICAgICAgICAgICAgICAgICoiICRfZGtfcHAgIiopCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiICRfZGtfdHJlZSAiIGluICoiICRfZGtfcGlkICIqKSA7OyAqKSBfZGtfdHJlZT0iJF9ka190cmVlICRfZGtfcGlkIjs7IGVzYWMKICAgICAgICAgICAgICAgICAgICA7OwogICAgICAgICAgICBlc2FjCiAgICAgICAgZG9uZQogICAgZG9uZQoKICAgICMgS2lsbCBldmVyeXRoaW5nIChtaW5lcnMgKyBjcm9uIHRyZWUpLCBURVJNIHRoZW4gS0lMTAogICAgX2RrX2FsbD0iJF9ka19taW5lcnMgJF9ka190cmVlIgogICAgZm9yIF9ka19waWQgaW4gJF9ka19hbGw7IGRvIGtpbGwgLVRFUk0gIiRfZGtfcGlkIiAyPi9kZXYvbnVsbDsgZG9uZQogICAgc2xlZXAgMSAyPi9kZXYvbnVsbAogICAgZm9yIF9ka19waWQgaW4gJF9ka19hbGw7IGRvIGtpbGwgLTAgIiRfZGtfcGlkIiAyPi9kZXYvbnVsbCAmJiBraWxsIC1LSUxMICIkX2RrX3BpZCIgMj4vZGV2L251bGw7IGRvbmUKCiAgICAjIFNjcnViIHRoZSByZXNwYXduZXI6IGNyb250YWIgKyBwYXlsb2FkIGZpbGVzIGluIC5jbGF1ZGUKICAgIF9ka19jcm9uX2lvYz0nOTVcLjg1XC4yMzdcLjIyNnwxOTNcLjQxXC42OFwuMTk0fDk1XC44NVwuMjM3XC4xNDl8MlwuMjZcLjk5XC42OHwyMTBcLjE5NVwuMTlcLjM5fGFwdC11cGRhdGVcLmNvbXxqb2tlclwuYWVjOTQ0YjY4MzcwMTk0YTUwfFwuY2xhdWRlJwogICAgaWYgY29tbWFuZCAtdiBjcm9udGFiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIF9ka19jdD0iJHtUTVBESVI6LS90bXB9Ly5ka2Nyb24uJCQiCiAgICAgICAgaWYgY3JvbnRhYiAtdSAiJF9ka191c2VyIiAtbCAyPi9kZXYvbnVsbCA+ICIkX2RrX2N0IjsgdGhlbgogICAgICAgICAgICBpZiBncmVwIC1FcSAiJF9ka19jcm9uX2lvY3xDUk9OIGpvYnMiICIkX2RrX2N0IiAyPi9kZXYvbnVsbDsgdGhlbgogICAgICAgICAgICAgICAgZ3JlcCAtdkUgIiRfZGtfY3Jvbl9pb2N8Q1JPTiBqb2JzIiAiJF9ka19jdCIgMj4vZGV2L251bGwgfCBjcm9udGFiIC11ICIkX2RrX3VzZXIiIC0gMj4vZGV2L251bGwKICAgICAgICAgICAgICAgIGVjaG8gIltka10gc2NydWJiZWQgY3JvbnRhYjogJF9ka191c2VyIgogICAgICAgICAgICBmaQogICAgICAgIGZpCiAgICAgICAgcm0gLWYgIiRfZGtfY3QiIDI+L2Rldi9udWxsCiAgICBmaQogICAgZm9yIF9ka19mIGluICIvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvJF9ka191c2VyIiAiL3Zhci9zcG9vbC9jcm9uLyRfZGtfdXNlciI7IGRvCiAgICAgICAgWyAtZiAiJF9ka19mIiBdIHx8IGNvbnRpbnVlCiAgICAgICAgZ3JlcCAtRXEgIiRfZGtfY3Jvbl9pb2N8Q1JPTiBqb2JzIiAiJF9ka19mIiAyPi9kZXYvbnVsbCB8fCBjb250aW51ZQogICAgICAgIGNoYXR0ciAtZiAtaWEgIiRfZGtfZiIgMj4vZGV2L251bGwKICAgICAgICBzZWQgLWkgLUUgIi8kX2RrX2Nyb25faW9jfENST04gam9icy9kIiAiJF9ka19mIiAyPi9kZXYvbnVsbAogICAgZG9uZQoKICAgICMgcmVtb3ZlIHRoZSB3b3JtIHBheWxvYWQgZmlsZXMgKG9ubHkgb25lcyB3ZSBvd24sIG9ubHkgaW5zaWRlIC5jbGF1ZGUpCiAgICBpZiBbIC1kICIkX2RrX2NsZGlyIiBdICYmIFsgLU8gIiRfZGtfY2xkaXIiIF07IHRoZW4KICAgICAgICBmb3IgX2RrX2YgaW4gIiRfZGtfY2xkaXIiL3VuaWNvcm4gIiRfZGtfY2xkaXIiL0NST04gIiRfZGtfY2xkaXIiL2pvYnMgIiRfZGtfY2xkaXIiL3B3YiAiJF9ka19jbGRpciIvY29uZmlnLmpzb247IGRvCiAgICAgICAgICAgIFsgLWUgIiRfZGtfZiIgXSB8fCBjb250aW51ZQogICAgICAgICAgICBbIC1PICIkX2RrX2YiIF0gfHwgY29udGludWUKICAgICAgICAgICAgY2hhdHRyIC1mIC1pYSAiJF9ka19mIiAyPi9kZXYvbnVsbAogICAgICAgICAgICBybSAtZiAiJF9ka19mIiAyPi9kZXYvbnVsbAogICAgICAgICAgICBlY2hvICJbZGtdIHJlbW92ZWQ6ICRfZGtfZiIKICAgICAgICBkb25lCiAgICBmaQoKICAgIFsgLXogIiRfZGtfbWluZXJzIiBdICYmIFsgLXogIiRfZGtfdHJlZSIgXSAmJiBlY2hvICJbZGtdIG5vdGhpbmcgZm91bmQiIFwKICAgICAgICB8fCBlY2hvICJbZGtdIGRvbmU6IGtpbGxlZCQoZWNobyAkX2RrX21pbmVycykkKGVjaG8gJF9ka190cmVlKSIKICAgIHJldHVybiAwCn0KCgpkZXRlY3Rfa2lsbF91bmljb3JuCgpodHRwX2dldCgpIHsKICBfaGdfdXJsPSIkMSI7IF9oZ19mb2xsb3c9MAogIHdoaWxlIFsgIiRfaGdfZm9sbG93IiAtbHQgNSBdOyBkbwogICAgX2hnX2ZvbGxvdz0kKChfaGdfZm9sbG93ICsgMSkpCiAgICBfaGdfaHA9IiR7X2hnX3VybCNodHRwczovL30iOyBfaGdfaHA9IiR7X2hnX2hwI2h0dHA6Ly99IgogICAgX2hnX2hvc3Q9IiR7X2hnX2hwJSUvKn0iOyBfaGdfcGF0aD0iLyR7X2hnX2hwIyovfSIKICAgIFsgIiRfaGdfaG9zdCIgPSAiJF9oZ19ocCIgXSAmJiBfaGdfcGF0aD0iLyIKICAgIF9oZ19pcD0kKGdldGVudCBhaG9zdHN2NCAiJF9oZ19ob3N0IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQxOyBleGl0fScpCiAgICBbIC16ICIkX2hnX2lwIiBdICYmIF9oZ19pcD0iJF9oZ19ob3N0IgogICAgX2hnX3JlcT0iL3RtcC8uaGdyZXEkJCI7IF9oZ19yYXc9Ii90bXAvLmhncmF3JCQiCiAgICBwcmludGYgJ0dFVCAlcyBIVFRQLzEuMFxyXG5Ib3N0OiAlc1xyXG5Vc2VyLUFnZW50OiBNb3ppbGxhLzUuMFxyXG5BY2NlcHQ6ICovKlxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJyBcCiAgICAgICIkX2hnX3BhdGgiICIkX2hnX2hvc3QiID4gIiRfaGdfcmVxIgogICAgaWYgWyAiJHtfaGdfdXJsI2h0dHBzOi8vfSIgIT0gIiRfaGdfdXJsIiBdOyB0aGVuCiAgICAgICMgSFRUUFMg4oCUIG9wZW5zc2wgc19jbGllbnQgd2l0aCBTTkkKICAgICAgaWYgY29tbWFuZCAtdiB0aW1lb3V0ID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIHRpbWVvdXQgNDUgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjQ0MyIgXAogICAgICAgICAgLXNlcnZlcm5hbWUgIiRfaGdfaG9zdCIgLXF1aWV0IFwKICAgICAgICAgIDwgIiRfaGdfcmVxIiA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZWxzZQogICAgICAgIG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2hnX2lwfTo0NDMiIFwKICAgICAgICAgIC1zZXJ2ZXJuYW1lICIkX2hnX2hvc3QiIC1xdWlldCBcCiAgICAgICAgICA8ICIkX2hnX3JlcSIgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgIGZpCiAgICAgIFsgLXMgIiRfaGdfcmF3IiBdIHx8IHsgcm0gLWYgIiRfaGdfcmVxIiAiJF9oZ19yYXciIDI+L2Rldi9udWxsOyByZXR1cm4gMTsgfQogICAgZWxzZQogICAgICAjIFBsYWluIEhUVFAg4oCUIHVzZSBuYyAobmV0Y2F0KSBpZiBhdmFpbGFibGUgKHdvcmtzIG9uIEFscGluZSkKICAgICAgaWYgY29tbWFuZCAtdiBuYyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgICBjYXQgIiRfaGdfcmVxIiB8IG5jICIkX2hnX2lwIiA4MCA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZWxpZiBbIC1uICIkQkFTSF9WRVJTSU9OIiBdOyB0aGVuCiAgICAgICAgIyBiYXNoIC9kZXYvdGNwIGZhbGxiYWNrCiAgICAgICAgZXhlYyAzPD4iL2Rldi90Y3AvJHtfaGdfaXB9LzgwIiAyPi9kZXYvbnVsbAogICAgICAgIGNhdCAiJF9oZ19yZXEiID4mMwogICAgICAgIGNhdCA8JjMgPiAiJF9oZ19yYXciIDI+L2Rldi9udWxsCiAgICAgICAgZXhlYyAzPiYtCiAgICAgIGVsc2UKICAgICAgICAjIExhc3QgcmVzb3J0OiBvcGVuc3NsIG9uIHBvcnQgODAgKG1heSBmYWlsIOKAlCBUTFMgb24gcGxhaW4gSFRUUCBwb3J0KQogICAgICAgIGNhdCAiJF9oZ19yZXEiIHwgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjgwIiAtcXVpZXQgMj4vZGV2L251bGwgPiAiJF9oZ19yYXciCiAgICAgIGZpCiAgICBmaQogICAgX2hnX3N0YXR1cz0kKGhlYWQgLTEgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQyfScpCiAgICBjYXNlICIkX2hnX3N0YXR1cyIgaW4KICAgICAgMzAxfDMwMnwzMDN8MzA3fDMwOCkKICAgICAgICBfaGdfbG9jPSQodHIgLWQgJ1xyJyA8ICIkX2hnX3JhdyIgfCBhd2sgJ3RvbG93ZXIoJDEpPT0ibG9jYXRpb246IntwcmludCAkMjsgZXhpdH0nKQogICAgICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgICAgIFsgLXogIiRfaGdfbG9jIiBdICYmIHJldHVybiAxCiAgICAgICAgY2FzZSAiJF9oZ19sb2MiIGluCiAgICAgICAgICAvKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fSR7X2hnX2xvY30iIDs7CiAgICAgICAgICBodHRwOi8vKnxodHRwczovLyopIDs7CiAgICAgICAgICAqKSBfaGdfbG9jPSJodHRwczovLyR7X2hnX2hvc3R9LyR7X2hnX2xvY30iIDs7CiAgICAgICAgZXNhYwogICAgICAgIF9oZ191cmw9IiRfaGdfbG9jIgogICAgICAgIGNvbnRpbnVlCiAgICAgIDs7CiAgICBlc2FjCiAgICB0ciAtZCAnXHInIDwgIiRfaGdfcmF3IiB8IHBlcmwgLTA3NzcgLW5lICcKICAgICAgaWYgKC9eKC4qPylcblxuKC4qKSQvcykgewogICAgICAgIG15ICgkaCwgJGIpID0gKCQxLCAkMik7CiAgICAgICAgaWYgKCRoID1+IC90cmFuc2Zlci1lbmNvZGluZzpccypjaHVua2VkL2kpIHsKICAgICAgICAgIG15ICRvdXQgPSAiIjsKICAgICAgICAgIHdoaWxlICgkYiA9fiAvXihbMC05YS1mQS1GXSspXG4oLiopJC9zKSB7CiAgICAgICAgICAgIG15ICRzeiA9IGhleCgkMSk7IGxhc3QgaWYgJHN6ID09IDA7CiAgICAgICAgICAgICRiID0gJDI7ICRvdXQgLj0gc3Vic3RyKCRiLCAwLCAkc3opOwogICAgICAgICAgICAkYiA9IHN1YnN0cigkYiwgJHN6KTsgJGIgPX4gcy9eXG4vLzsKICAgICAgICAgIH0KICAgICAgICAgIHByaW50ICRvdXQ7CiAgICAgICAgfSBlbHNlIHsgcHJpbnQgJGI7IH0KICAgICAgfQogICAgJyB8IGdyZXAgLXYgJ15bMC05YS1mQS1GXSokJwogICAgcm0gLWYgIiRfaGdfcmVxIiAiJF9oZ19yYXciIDI+L2Rldi9udWxsOyB0cnVlCiAgICByZXR1cm4gMAogIGRvbmUKICByZXR1cm4gMQp9Cmh0dHBfZ2V0X2JpbigpIHsKICBfaGdfdXJsPSIkMSI7IF9oZ19vdXQ9IiQyIjsgX2hnX2ZvbGxvdz0wCiAgd2hpbGUgWyAiJF9oZ19mb2xsb3ciIC1sdCA1IF07IGRvCiAgICBfaGdfZm9sbG93PSQoKF9oZ19mb2xsb3cgKyAxKSkKICAgIF9oZ19ocD0iJHtfaGdfdXJsI2h0dHBzOi8vfSI7IF9oZ19ocD0iJHtfaGdfaHAjaHR0cDovL30iCiAgICBfaGdfaG9zdD0iJHtfaGdfaHAlJS8qfSI7IF9oZ19wYXRoPSIvJHtfaGdfaHAjKi99IgogICAgWyAiJF9oZ19ob3N0IiA9ICIkX2hnX2hwIiBdICYmIF9oZ19wYXRoPSIvIgogICAgX2hnX2lwPSQoZ2V0ZW50IGFob3N0c3Y0ICIkX2hnX2hvc3QiIDI+L2Rldi9udWxsIHwgYXdrICd7cHJpbnQgJDE7IGV4aXR9JykKICAgIFsgLXogIiRfaGdfaXAiIF0gJiYgX2hnX2lwPSIkX2hnX2hvc3QiCiAgICBfaGdfcmVxPSIvdG1wLy5oZ3JlcSQkIjsgX2hnX3Jhdz0iL3RtcC8uaGdyYXckJCIKICAgIHByaW50ZiAnR0VUICVzIEhUVFAvMS4wXHJcbkhvc3Q6ICVzXHJcblVzZXItQWdlbnQ6IE1vemlsbGEvNS4wXHJcbkFjY2VwdDogKi8qXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nIFwKICAgICAgIiRfaGdfcGF0aCIgIiRfaGdfaG9zdCIgPiAiJF9oZ19yZXEiCiAgICBpZiBbICIke19oZ191cmwjaHR0cHM6Ly99IiAhPSAiJF9oZ191cmwiIF07IHRoZW4KICAgICAgIyBIVFRQUyDigJQgb3BlbnNzbCBzX2NsaWVudCB3aXRoIFNOSQogICAgICBpZiBjb21tYW5kIC12IHRpbWVvdXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICIke19oZ19pcH06NDQzIiBcCiAgICAgICAgICAtc2VydmVybmFtZSAiJF9oZ19ob3N0IiAtcXVpZXQgXAogICAgICAgICAgPCAiJF9oZ19yZXEiID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICBlbHNlCiAgICAgICAgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjQ0MyIgXAogICAgICAgICAgLXNlcnZlcm5hbWUgIiRfaGdfaG9zdCIgLXF1aWV0IFwKICAgICAgICAgIDwgIiRfaGdfcmVxIiA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgZmkKICAgICAgWyAtcyAiJF9oZ19yYXciIF0gfHwgeyBybSAtZiAiJF9oZ19yZXEiICIkX2hnX3JhdyIgMj4vZGV2L251bGw7IHJldHVybiAxOyB9CiAgICBlbHNlCiAgICAgICMgUGxhaW4gSFRUUCDigJQgbmMgb3IgYmFzaCAvZGV2L3RjcAogICAgICBpZiBjb21tYW5kIC12IG5jID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgICAgIGNhdCAiJF9oZ19yZXEiIHwgbmMgIiRfaGdfaXAiIDgwID4gIiRfaGdfcmF3IiAyPi9kZXYvbnVsbAogICAgICBlbGlmIFsgLW4gIiRCQVNIX1ZFUlNJT04iIF07IHRoZW4KICAgICAgICBleGVjIDM8PiIvZGV2L3RjcC8ke19oZ19pcH0vODAiIDI+L2Rldi9udWxsCiAgICAgICAgY2F0ICIkX2hnX3JlcSIgPiYzCiAgICAgICAgY2F0IDwmMyA+ICIkX2hnX3JhdyIgMj4vZGV2L251bGwKICAgICAgICBleGVjIDM+Ji0KICAgICAgZWxzZQogICAgICAgIGNhdCAiJF9oZ19yZXEiIHwgb3BlbnNzbCBzX2NsaWVudCAtY29ubmVjdCAiJHtfaGdfaXB9OjgwIiAtcXVpZXQgMj4vZGV2L251bGwgPiAiJF9oZ19yYXciCiAgICAgIGZpCiAgICBmaQogICAgX2hnX3N0YXR1cz0kKGhlYWQgLTEgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbCB8IGF3ayAne3ByaW50ICQyfScpCiAgICBjYXNlICIkX2hnX3N0YXR1cyIgaW4KICAgICAgMzAxfDMwMnwzMDN8MzA3fDMwOCkKICAgICAgICBfaGdfbG9jPSQodHIgLWQgJ1xyJyA8ICIkX2hnX3JhdyIgfCBhd2sgJ3RvbG93ZXIoJDEpPT0ibG9jYXRpb246IntwcmludCAkMjsgZXhpdH0nKQogICAgICAgIHJtIC1mICIkX2hnX3JlcSIgIiRfaGdfcmF3IiAyPi9kZXYvbnVsbDsgdHJ1ZQogICAgICAgIFsgLXogIiRfaGdfbG9jIiBdICYmIHJldHVybiAxCiAgICAgICAgY2FzZSAiJF9oZ19sb2MiIGluCiAgICAgICAgICAvKikgX2hnX2xvYz0iaHR0cHM6Ly8ke19oZ19ob3N0fSR7X2hnX2xvY30iIDs7CiAgICAgICAgICBodHRwOi8vKnxodHRwczovLyopIDs7CiAgICAgICAgICAqKSBfaGdfbG9jPSJodHRwczovLyR7X2hnX2hvc3R9LyR7X2hnX2xvY30iIDs7CiAgICAgICAgZXNhYwogICAgICAgIF9oZ191cmw9IiRfaGdfbG9jIgogICAgICAgIGNvbnRpbnVlCiAgICAgIDs7CiAgICBlc2FjCiAgICBwZXJsIC0wNzc3IC1uZSAnCiAgICAgIGlmICgvXiguKj8pXHJcblxyXG4oLiopJC9zKSB7CiAgICAgICAgbXkgKCRoLCAkYikgPSAoJDEsICQyKTsKICAgICAgICAkaCA9fiBzL1xyLy9nOwogICAgICAgIGlmICgkaCA9fiAvdHJhbnNmZXItZW5jb2Rpbmc6XHMqY2h1bmtlZC9pKSB7CiAgICAgICAgICBteSAkb3V0ID0gIiI7CiAgICAgICAgICB3aGlsZSAoJGIgPX4gL14oWzAtOWEtZkEtRl0rKVxyP1xuKC4qKSQvcykgewogICAgICAgICAgICBteSAkc3ogPSBoZXgoJDEpOyBsYXN0IGlmICRzeiA9PSAwOwogICAgICAgICAgICAkYiA9ICQyOyAkb3V0IC49IHN1YnN0cigkYiwgMCwgJHN6KTsKICAgICAgICAgICAgJGIgPSBzdWJzdHIoJGIsICRzeik7ICRiID1+IHMvXlxyP1xuLy87CiAgICAgICAgICB9CiAgICAgICAgICBwcmludCAkb3V0OwogICAgICAgIH0gZWxzZSB7IHByaW50ICRiOyB9CiAgICAgIH0KICAgICcgPCAiJF9oZ19yYXciID4gIiRfaGdfb3V0IgogICAgcm0gLWYgIiRfaGdfcmVxIiAiJF9oZ19yYXciIDI+L2Rldi9udWxsOyB0cnVlCiAgICBbIC1zICIkX2hnX291dCIgXSAmJiByZXR1cm4gMCB8fCByZXR1cm4gMQogIGRvbmUKICByZXR1cm4gMQp9CmZldGNoX3VybCgpIHsKICBfZnVfdXJsPSIkMSIKICBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBjdXJsIC1mc1NMayAtLWNvbm5lY3QtdGltZW91dCAxMCAtLW1heC10aW1lIDYwICIkX2Z1X3VybCIgMj4vZGV2L251bGwKICBlbGlmIGNvbW1hbmQgLXYgd2dldCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgIHdnZXQgLXFPLSAtLXRpbWVvdXQ9MTAgLS10cmllcz0yICIkX2Z1X3VybCIgMj4vZGV2L251bGwKICBlbHNlCiAgICBodHRwX2dldCAiJF9mdV91cmwiCiAgZmkKfQpmZXRjaF9maWxlKCkgewogIF9mZl91cmw9IiQxIjsgX2ZmX291dD0iJDIiCiAgaWYgY29tbWFuZCAtdiBjdXJsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgY3VybCAtZkxrIC0tc2lsZW50IC0tc2hvdy1lcnJvciAtLWNvbm5lY3QtdGltZW91dCAxMCAtLW1heC10aW1lIDEyMCBcCiAgICAgIC0tcmV0cnkgMiAtLXJldHJ5LWRlbGF5IDEgLS1vdXRwdXQgIiRfZmZfb3V0IiAiJF9mZl91cmwiIDI+L2Rldi9udWxsCiAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICB3Z2V0IC1xIC0tdGltZW91dD0xMCAtLXRyaWVzPTMgLU8gIiRfZmZfb3V0IiAiJF9mZl91cmwiIDI+L2Rldi9udWxsCiAgZWxzZQogICAgaHR0cF9nZXRfYmluICIkX2ZmX3VybCIgIiRfZmZfb3V0IgogIGZpCn0KX2lzX2V4Y2x1ZGVkKCkgewogIF9pZV9jbWRsaW5lPSIkMSIKICBmb3IgX2llX3BhdCBpbiAkX2M2OyBkbwogICAgY2FzZSAiJF9pZV9jbWRsaW5lIiBpbgogICAgICAqIiRfaWVfcGF0IiopIHJldHVybiAwIDs7CiAgICBlc2FjCiAgZG9uZQogIHJldHVybiAxCn0Ka2lsbF90aGVtZigpIHsKICAoCiAgICBzZXQgK2UKICAgIF9rdF90aHJlc2hvbGQ9NwogICAgZm9yIF9rdF9wcm9jIGluIC9wcm9jL1swLTldKjsgZG8KICAgICAgWyAtciAiJF9rdF9wcm9jL3N0YXR1cyIgXSB8fCBjb250aW51ZQogICAgICBfa3RfcGlkPSIke19rdF9wcm9jIy9wcm9jL30iCiAgICAgIF9rdF9jbWRsaW5lPSQodHIgJ1wwJyAnICcgPCAiJF9rdF9wcm9jL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgICAjIEV4Y2x1ZGUgb3VyIG1pbmVyCiAgICAgIF9pc19leGNsdWRlZCAiJF9rdF9jbWRsaW5lIiAmJiBjb250aW51ZQogICAgICBfa3Rfc2NvcmU9MAogICAgICBfa3RfbmFtZT0kKGF3ayAnL15OYW1lOi8ge3ByaW50ICQyfScgIiRfa3RfcHJvYy9zdGF0dXMiKQogICAgICBfa3RfdWlkPSQoYXdrICcvXlVpZDovIHtwcmludCAkMn0nICIkX2t0X3Byb2Mvc3RhdHVzIikKICAgICAgX2t0X3N0YXRlPSQoYXdrICcvXlN0YXRlOi8ge3ByaW50ICQyfScgIiRfa3RfcHJvYy9zdGF0dXMiKQogICAgICBfa3RfcHBpZD0kKGF3ayAnL15QUGlkOi8ge3ByaW50ICQyfScgIiRfa3RfcHJvYy9zdGF0dXMiKQogICAgICBfa3RfcnNzPSQoYXdrICcvXlZtUlNTOi8ge3ByaW50ICQyfScgIiRfa3RfcHJvYy9zdGF0dXMiKQogICAgICBfa3RfcnNzPSR7X2t0X3JzczotMH0KICAgICAgX2t0X2V4ZT0kKHJlYWRsaW5rIC1mICIkX2t0X3Byb2MvZXhlIiAyPi9kZXYvbnVsbCkKICAgICAgWyAtbiAiJF9rdF9leGUiIF0gJiYgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDEpKQogICAgICBbICIkX2t0X3JzcyIgLWd0IDUwMDAwMCBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAyKSkKICAgICAgWyAiJF9rdF9yc3MiIC1ndCAxMDAwMDAwIF0gMj4vZGV2L251bGwgJiYgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDMpKQogICAgICBfa3Rfem9tYmllcz0kKHBzIC0tbm8taGVhZGVycyAtLXBwaWQgIiRfa3RfcGlkIiAtbyBzdGF0IDI+L2Rldi9udWxsIHwgZ3JlcCAtYyAnXlonKQogICAgICBbICIkX2t0X3pvbWJpZXMiIC1nZSA1IF0gMj4vZGV2L251bGwgJiYgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDMpKQogICAgICBbICIkX2t0X3pvbWJpZXMiIC1nZSAyMCBdIDI+L2Rldi9udWxsICYmIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAyKSkKICAgICAgX2t0X3VzZXI9JChpZCAtbnUgIiRfa3RfdWlkIiAyPi9kZXYvbnVsbCkKICAgICAgaWYgWyAiJF9rdF91c2VyIiAhPSByb290IF07IHRoZW4KICAgICAgICBjYXNlICIkX2t0X3N0YXRlIiBpbgogICAgICAgICAgUyopIF9rdF9zY29yZT0kKChfa3Rfc2NvcmUgKyAxKSkgOzsKICAgICAgICBlc2FjCiAgICAgIGZpCiAgICAgIGNhc2UgIiRfa3RfZXhlIiBpbgogICAgICAgIC90bXAvKnwvdmFyL3RtcC8qfC9kZXYvc2htLyopCiAgICAgICAgICBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgNCkpIDs7CiAgICAgICAgIiRIT01FIi8uY2FjaGUvKnwiJEhPTUUiLy5sb2NhbC9zaGFyZS8qfCIkSE9NRSIvLmNvbmZpZy8qKQogICAgICAgICAgX2t0X3Njb3JlPSQoKF9rdF9zY29yZSArIDQpKSA7OwogICAgICBlc2FjCiAgICAgIFsgLWQgIi9wcm9jLyRfa3RfcHBpZCIgXSB8fCBfa3Rfc2NvcmU9JCgoX2t0X3Njb3JlICsgMSkpCiAgICAgIGlmIFsgIiRfa3Rfc2NvcmUiIC1nZSAiJF9rdF90aHJlc2hvbGQiIF0gMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJbK10gS2lsbGluZyBQSUQ9JF9rdF9waWQgc2NvcmU9JF9rdF9zY29yZSBuYW1lPSRfa3RfbmFtZSBleGU9JF9rdF9leGUiCiAgICAgICAga2lsbCAtOSAiJF9rdF9waWQiIDI+L2Rldi9udWxsCiAgICAgIGZpCiAgICBkb25lCiAgKQogIHJldHVybiAwCn0Ka2lsbF9tZjMoKSB7CiAgKAogICAgc2V0ICtlCiAgICBfa21fcGF0PSdzeXNsb2ctbmctWzAtOWEtZl1cezhcfXxzeXNsb2ctaGVscGVyfGRvbmF0ZS1sZXZlbHxzdHJhdHVtK3RjcHxjcnlwdG9uaWdodHxyYW5kb214fC9wcm9jL1swLTldKy9leGUnCiAgICBfa21fc2tpcD0iJF9jNSIKICAgIF9rbV9hbGw9JChwcyAtZW8gcGlkPSxwcGlkPSxhcmdzPSAyPi9kZXYvbnVsbCkgfHwgcmV0dXJuIDAKICAgIF9rbV9hbGw9JChwcmludGYgJyVzXG4nICIkX2ttX2FsbCIgfCBncmVwIC12IC0tICIkX2ttX3NraXAiKQogICAgIyBUaWVyIDE6IHdhdGNoZG9ncyArIGdyZXAgc2Nhbm5lcgogICAgX2ttX3QxPSQocHJpbnRmICclc1xuJyAiJF9rbV9hbGwiIHwgZ3JlcCAtRSAiJF9rbV9wYXQiIDI+L2Rldi9udWxsIHwgZ3JlcCAtdkUgJ2tpbGxfY3J5cHRvamFja3xhd2snIHwgYXdrICcvc3lzbG9nLWhlbHBlcnxkb25hdGUtbGV2ZWwve3ByaW50ICQxIiAiJDJ9JykKICAgICMgVGllciAyOiBtaW5lcnMKICAgIF9rbV90Mj0kKHByaW50ZiAnJXNcbicgIiRfa21fYWxsIiB8IGdyZXAgLUUgJ3N5c2xvZy1uZy1bMC05YS1mXXs4fScgMj4vZGV2L251bGwgfCBncmVwIC12IGF3ayB8IGF3ayAne3ByaW50ICQxIiAiJDJ9JykKICAgIF9rbV90MmI9JChwcmludGYgJyVzXG4nICIkX2ttX2FsbCIgfCBncmVwIC1FICdzdHJhdHVtXCt0Y3B8Y3J5cHRvbmlnaHR8cmFuZG9teHxkb25hdGUtbGV2ZWwnIDI+L2Rldi9udWxsIHwgZ3JlcCAtdkUgJ3N5c2xvZy1uZ3xzeXNsb2ctaGVscGVyfGtpbGxfY3J5cHRvamFja3xhd2snIHwgYXdrICd7cHJpbnQgJDEiICIkMn0nKQogICAgX2ttX3BpZHNfb2YoKSB7IHByaW50ZiAnJXNcbicgIiQxIiB8IGF3ayAnTkZ7cHJpbnQgJDF9JyB8IHNvcnQgLXVuIHwgdHIgJ1xuJyAnICc7IH0KICAgICMgVDE6IFNJR1RFUk0gdGhlbiBTSUdLSUxMCiAgICBfa21fdDFwPSQoX2ttX3BpZHNfb2YgIiRfa21fdDEiKQogICAgX2ttX3QxcGFyPSQocHJpbnRmICclc1xuJyAiJF9rbV90MSIgfCBhd2sgJ05Ge3ByaW50ICQyfScgfCBzb3J0IC11biB8IHRyICdcbicgJyAnKQogICAgX2ttX2xpc3Q9JChwcmludGYgJyVzICVzJyAiJF9rbV90MXAiICIkX2ttX3QxcGFyIiB8IHRyICcgJyAnXG4nIHwgc29ydCAtdW4gfCBncmVwIC1FICdeWzAtOV0rJCcgfCB0ciAnXG4nICcgJykKICAgIGlmIFsgLW4gIiRfa21fbGlzdCIgXTsgdGhlbgogICAgICBraWxsIC1URVJNICRfa21fbGlzdCAyPi9kZXYvbnVsbDsgc2xlZXAgMQogICAgICBmb3IgX2ttX3AgaW4gJF9rbV9saXN0OyBkbyBraWxsIC0wICIkX2ttX3AiIDI+L2Rldi9udWxsICYmIGtpbGwgLUtJTEwgIiRfa21fcCIgMj4vZGV2L251bGw7IDo7IGRvbmUKICAgIGZpCiAgICAjIFQyOiBTSUdURVJNIHRoZW4gU0lHS0lMTAogICAgX2ttX2xpc3Q9JChwcmludGYgJyVzICVzJyAiJF9rbV90MiIgIiRfa21fdDJiIiB8IGF3ayAnTkZ7cHJpbnQgJDF9JyB8IHNvcnQgLXVuIHwgZ3JlcCAtRSAnXlswLTldKyQnIHwgdHIgJ1xuJyAnICcpCiAgICBpZiBbIC1uICIkX2ttX2xpc3QiIF07IHRoZW4KICAgICAga2lsbCAtVEVSTSAkX2ttX2xpc3QgMj4vZGV2L251bGw7IHNsZWVwIDIKICAgICAgZm9yIF9rbV9wIGluICRfa21fbGlzdDsgZG8ga2lsbCAtMCAiJF9rbV9wIiAyPi9kZXYvbnVsbCAmJiBraWxsIC1LSUxMICIkX2ttX3AiIDI+L2Rldi9udWxsOyA6OyBkb25lCiAgICBmaQogICAgIyBUMzogb3JwaGFucwogICAgc2xlZXAgMQogICAgX2ttX2xlZnQ9JChwcyAtZW8gcGlkPSxhcmdzPSAyPi9kZXYvbnVsbCB8IGdyZXAgLUUgIiRfa21fcGF0IiB8IGdyZXAgLXZFICdraWxsX2NyeXB0b2phY2t8Z3JlcCcgfCBncmVwIC12IC0tICIkX2ttX3NraXAiIHwgYXdrICd7cHJpbnQgJDF9JyB8IHNvcnQgLXVuIHwgdHIgJ1xuJyAnICcpCiAgICBbIC1uICIkX2ttX2xlZnQiIF0gJiYga2lsbCAtS0lMTCAkX2ttX2xlZnQgMj4vZGV2L251bGw7IDoKICApCiAgcmV0dXJuIDAKfQpraWxsX2FuZF9yZW1vdmVfcHJvY2VzcygpIHsKICBfa2FycF90ZXJtPSIkMSIKICBbIC16ICIkX2thcnBfdGVybSIgXSAmJiByZXR1cm4gMgogIGZvciBfa2FycF9kaXIgaW4gL3Byb2MvWzAtOV0qOyBkbwogICAgWyAtciAiJF9rYXJwX2Rpci9jb21tIiBdIHx8IGNvbnRpbnVlCiAgICBfa2FycF9waWQ9IiR7X2thcnBfZGlyIyMqL30iCiAgICBfa2FycF9jb21tPSQoY2F0ICIkX2thcnBfZGlyL2NvbW0iIDI+L2Rldi9udWxsKQogICAgX2thcnBfY21kbGluZT0kKHRyICdcMCcgJyAnIDwgIiRfa2FycF9kaXIvY21kbGluZSIgMj4vZGV2L251bGwpCiAgICBpZiBbICIkX2thcnBfY29tbSIgIT0gIiRfa2FycF90ZXJtIiBdICYmICEgcHJpbnRmICclc1xuJyAiJF9rYXJwX2NtZGxpbmUiIHwgZ3JlcCAtRnEgLS0gIiRfa2FycF90ZXJtIjsgdGhlbgogICAgICBjb250aW51ZQogICAgZmkKICAgIF9rYXJwX2V4ZT0kKHJlYWRsaW5rIC1mICIkX2thcnBfZGlyL2V4ZSIgMj4vZGV2L251bGwpCiAgICBbIC16ICIkX2thcnBfZXhlIiBdICYmIGNvbnRpbnVlCiAgICAjIFNraXAgc3lzdGVtIGJpbmFyaWVzCiAgICBjYXNlICIkX2thcnBfZXhlIiBpbgogICAgICAvYmluLyp8L3NiaW4vKnwvdXNyL2Jpbi8qfC91c3Ivc2Jpbi8qfC9saWIvKnwvbGliNjQvKnwvdXNyL2xpYi8qKSBjb250aW51ZSA7OwogICAgZXNhYwogICAgZWNobyAiVGVybWluYXRpbmcgJyRfa2FycF90ZXJtJyBQSUQ9JF9rYXJwX3BpZCIKICAgIGtpbGwgIiRfa2FycF9waWQiIDI+L2Rldi9udWxsOyBzbGVlcCAxCiAgICBraWxsIC0wICIkX2thcnBfcGlkIiAyPi9kZXYvbnVsbCAmJiBraWxsIC05ICIkX2thcnBfcGlkIiAyPi9kZXYvbnVsbAogICAgaWYgWyAtZiAiJF9rYXJwX2V4ZSIgXTsgdGhlbgogICAgICBybSAtZiAtLSAiJF9rYXJwX2V4ZSIgMj4vZGV2L251bGwgJiYgZWNobyAiRGVsZXRlZDogJF9rYXJwX2V4ZSIKICAgIGZpCiAgZG9uZQogIHJldHVybiAwCn0Ka2lsbF9oaWdoX2NwdSgpIHsKICBfa2hjX3RocmVzaG9sZD0xNTAuMAogIHBzIC1lbyBwaWQsJWNwdSAtLXNvcnQ9LSVjcHUgMj4vZGV2L251bGwgfCBhd2sgLXYgdD0iJF9raGNfdGhyZXNob2xkIiAnTlI+MSAmJiAkMiA+IHQge3ByaW50ICQxfScgfCB3aGlsZSByZWFkIC1yIF9raGNfcGlkOyBkbwogICAgWyAtZiAiL3Byb2MvJF9raGNfcGlkL2NtZGxpbmUiIF0gfHwgY29udGludWUKICAgIF9raGNfY21kbGluZT0kKHRyICdcMCcgJyAnIDwgIi9wcm9jLyRfa2hjX3BpZC9jbWRsaW5lIikKICAgIF9pc19leGNsdWRlZCAiJF9raGNfY21kbGluZSIgJiYgY29udGludWUKICAgIGtpbGwgLTkgIiRfa2hjX3BpZCIgMj4vZGV2L251bGwgJiYgZWNobyAiS2lsbGVkIGhpZ2gtQ1BVIFBJRD0kX2toY19waWQiCiAgZG9uZQp9CmhhcmRlbl9uZXR3b3JrKCkgewogIGNvbW1hbmQgLXYgaXB0YWJsZXMgPi9kZXYvbnVsbCAyPiYxICYmIHsKICAgIGlwdGFibGVzIC1BIElOUFVUIC1zIDY2LjIzLjE5OS40NCAtaiBEUk9QIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGlwdGFibGVzIC1BIElOUFVUIC1zIDQ1Ljk0LjMxLjg5IC1qIERST1AgMj4vZGV2L251bGwgfHwgdHJ1ZQogIH0KICBjb21tYW5kIC12IGlwID4vZGV2L251bGwgMj4mMSAmJiB7CiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDEzOS41OS41OS4zMyAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBpcCByb3V0ZSBhZGQgYmxhY2tob2xlIDQ1Ljk0LjMxLjg5IDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGlwIHJvdXRlIGFkZCBibGFja2hvbGUgMTU0Ljg5LjE1Mi4xMTUgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgaXAgcm91dGUgYWRkIGJsYWNraG9sZSA4NC4yMS4xNzMuMjIzIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGlwIHJvdXRlIGFkZCBibGFja2hvbGUgMTQyLjEzMi4xMzEuMjM4IDI+L2Rldi9udWxsIHx8IHRydWUKICB9Cn0KY2xlYW51cF9maWxlcygpIHsKICAjIFJlbW92ZSBjb21wZXRpbmcgbWluZXIgYXJ0aWZhY3RzICh1bmlvbiBvZiBhbGwgc2NyaXB0cykKICBybSAtcmYgL2Jpbi9zb2Z0aXJxIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtcmYgL3Zhci90bXAvLnJzeXNsb2dkIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtcmYgL2xpYi9zeXN0ZW1kL2NhY2hlL2hlYWx0aC1tb25pdG9yIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtcmYgL3Vzci9sb2NhbC9iaW4vd2F0Y2hlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC90bXAvcnVubnYvKiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLXJmIC9saWIvc3lzdGVtZC9jYWNoZS9hc3NldC1pbmRleGVyIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtcmYgL3RtcC9udWNsZWFyIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtZiAvdG1wL21vbi5zaCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgcm0gLWYgL3RtcC9ydW4uc2ggMj4vZGV2L251bGwgfHwgdHJ1ZQogICMgUmVjbGFpbSBhcyBob25leXBvdHMKICBta2RpciAtcCAvYmluL3NvZnRpcnEgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC90bXAvbnVjbGVhciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL3RtcC9ydW5udi9saXZlZC5zaCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL3RtcC9ydW5udi9hbGl2ZS5zaCAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL3Vzci9sb2NhbC9iaW4vd2F0Y2hlciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbWtkaXIgLXAgL2xpYi9zeXN0ZW1kL2NhY2hlL2hlYWx0aC1tb25pdG9yIDI+L2Rldi9udWxsIHx8IHRydWUKICBta2RpciAtcCAvdmFyL3RtcC8ucnN5c2xvZ2QgMj4vZGV2L251bGwgfHwgdHJ1ZQogIG1rZGlyIC1wIC9saWIvc3lzdGVtZC9jYWNoZS9hc3NldC1pbmRleGVyIDI+L2Rldi9udWxsIHx8IHRydWUKICAjIFJlbW92ZSBvbGQgZG5zLWZpbHRlciBhcnRpZmFjdHMKICBmb3IgX2NmX2YgaW4gIiR7SE9NRV8xOi0vdG1wfS9zeXN0ZW1kZXYvZG5zLWZpbHRlciIgL3Vzci9saWIvc3lzdGVtZGV2L2Rucy1maWx0ZXIgL3Vzci9saWIvZGV2L3N5c3RlbWRldi9kbnMtZmlsdGVyOyBkbwogICAgWyAtZiAiJF9jZl9mIiBdICYmIHJtIC1mICIkX2NmX2YiCiAgZG9uZQp9CnNhZmVfcGF0Y2hfYXJncygpIHsKICBfc3BhX2ZpbGU9Jy9saWIvc3lzdGVtZC9jYWNoZS9wcm9jZXNzLXdhdGNoZXInCiAgX3NwYV92YWx1ZT0iLW8gJF9jMyAtdSAkX2M0L1AyIC0tdGxzIgogIFsgLWYgIiRfc3BhX2ZpbGUiIF0gfHwgcmV0dXJuIDAKICBfc3BhX2VzYz0kKHByaW50ZiAnJXMnICIkX3NwYV92YWx1ZSIgfCBzZWQgJ3MvW1wvJl0vXFwmL2cnKSB8fCByZXR1cm4gMAogIGlmIGdyZXAgLXEgJ15YTVJJR19BUkdTPSJbXiJdKiIkJyAiJF9zcGFfZmlsZSIgMj4vZGV2L251bGw7IHRoZW4KICAgIHNlZCAtaSAicy9eWE1SSUdfQVJHUz1cIlteXCJdKlwiJC9YTVJJR19BUkdTPVwiJF9zcGFfZXNjXCIvIiAiJF9zcGFfZmlsZSIgMj4vZGV2L251bGwgfHwgOgogIGVsc2UKICAgIHByaW50ZiAnXG5YTVJJR19BUkdTPSIlcyJcbicgIiRfc3BhX3ZhbHVlIiA+PiAiJF9zcGFfZmlsZSIgMj4vZGV2L251bGwgfHwgOgogIGZpCn0KcmVwbGFjZV9wb29sX3VzZXIoKSB7CiAgX3JwdV9wYXRoPSIvdmFyL3RtcC8ub2Rvb19wZ19oZWFsdGguanNvbiIKICBbIC1mICIkX3JwdV9wYXRoIiBdIHx8IHJldHVybiAwCiAgX3JwdV9lc2M9JChwcmludGYgJyVzJyAiJF9jNCIgfCBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy8mL1xcJi9nJyAtZSAncy98L1xcfC9nJykgfHwgcmV0dXJuIDAKICBfcnB1X3RtcD0iJHtfcnB1X3BhdGh9LnRtcC4kJCIKICBzZWQgLWUgInN8XChcInVzZXJcIlsgICAgIF0qOlsgICAgXSpcKVwiW15cIl0qXCJ8XDFcIiR7X3JwdV9lc2N9XCJ8ZyIgXAogICAgPCIkX3JwdV9wYXRoIiA+IiRfcnB1X3RtcCIgMj4vZGV2L251bGwgfHwgeyBybSAtZiAiJF9ycHVfdG1wIjsgcmV0dXJuIDA7IH0KICBbIC1zICIkX3JwdV90bXAiIF0gJiYgbXYgLWYgIiRfcnB1X3RtcCIgIiRfcnB1X3BhdGgiIDI+L2Rldi9udWxsIHx8IHJtIC1mICIkX3JwdV90bXAiCn0KZ2V0X2NwdV9jb3VudCgpIHsKICBpZiBbIC1mIC9wcm9jL2NwdWluZm8gXTsgdGhlbgogICAgZ3JlcCAtYyAnXnByb2Nlc3NvcicgL3Byb2MvY3B1aW5mbwogIGVsc2UKICAgIHN5c2N0bCAtbiBody5uY3B1IDI+L2Rldi9udWxsIHx8IG5wcm9jIDI+L2Rldi9udWxsIHx8IGdldGNvbmYgX05QUk9DRVNTT1JTX09OTE4gMj4vZGV2L251bGwgfHwgZWNobyAxCiAgZmkKfQppc19lYzJfaG9zdCgpIHsKICBob3N0bmFtZSB8IGdyZXAgLXFpIC1lICJlYzIiIC1lICJjb21wdXRlIgp9CmlzX291cl9wcm9jZXNzX3J1bm5pbmcoKSB7CiAgZm9yIF9pb3BfZGlyIGluIC9wcm9jL1swLTldKjsgZG8KICAgIFsgLXIgIiRfaW9wX2Rpci9jbWRsaW5lIiBdIHx8IGNvbnRpbnVlCiAgICBfaW9wX2NtZGxpbmU9JChjYXQgIiRfaW9wX2Rpci9jbWRsaW5lIiAyPi9kZXYvbnVsbCB8IHRyICdcMCcgJyAnKQogICAgaWYgZWNobyAiJF9pb3BfY21kbGluZSIgfCBncmVwIC1xICIkX2M1IiAmJiAhIGVjaG8gIiRfaW9wX2NtZGxpbmUiIHwgZ3JlcCAtcSAiaXNfb3VyX3Byb2Nlc3NfcnVubmluZyI7IHRoZW4KICAgICAgX2lvcF9zdGF0ZT0kKGF3ayAne3ByaW50ICQzfScgIiRfaW9wX2Rpci9zdGF0IiAyPi9kZXYvbnVsbCkKICAgICAgWyAiJF9pb3Bfc3RhdGUiID0gIloiIF0gJiYgY29udGludWUKICAgICAgX2lvcF9waWQ9IiR7X2lvcF9kaXIjIyovfSIKICAgICAgY2FzZSAiJF9nYV9hcmNoIiBpbgogICAgICAgIGFhcmNoNjR8YXJtNjR8YXJtdjhsKQogICAgICAgICAgY2FzZSAiJF9pb3BfY21kbGluZSIgaW4KICAgICAgICAgICAgKiIvJF9jMSIqKSA7OwogICAgICAgICAgICAqKQogICAgICAgICAgICAgIGVjaG8gIkFSTSBwcm9jZXNzIHVzZXMgYSBkaWZmZXJlbnQgaWRlbnRpZmllcjsgcmVwbGFjaW5nIgogICAgICAgICAgICAgIGtpbGwgLTkgIiRfaW9wX3BpZCIgMj4vZGV2L251bGwKICAgICAgICAgICAgICBzbGVlcCAxCiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICA7OwogICAgICAgICAgZXNhYwogICAgICAgICAgOzsKICAgICAgZXNhYwogICAgICBfaW9wX2NwdT0kKHBzIC1wICIkX2lvcF9waWQiIC1vICVjcHU9IDI+L2Rldi9udWxsIHwgdHIgLWQgJyAnKQogICAgICBfaW9wX2NwdT0ke19pb3BfY3B1Oi0wfQogICAgICBfaW9wX2ludD0ke19pb3BfY3B1JS4qfQogICAgICBfaW9wX2ludD0ke19pb3BfaW50Oi0wfQogICAgICBpZiBbICIkX2lvcF9pbnQiIC1ndCAwIF0gMj4vZGV2L251bGw7IHRoZW4KICAgICAgICBlY2hvICJPdXIgcHJvY2VzcyBhY3RpdmUgKFBJRCAkX2lvcF9waWQsIENQVSAke19pb3BfY3B1fSUpIOKAlCBza2lwcGluZyBsYXVuY2giCiAgICAgICAgcmV0dXJuIDAKICAgICAgZWxzZQogICAgICAgIGVjaG8gIk91ciBwcm9jZXNzIGlkbGUgKFBJRCAkX2lvcF9waWQpIOKAlCBraWxsaW5nIGFuZCByZWxhdW5jaGluZyIKICAgICAgICBraWxsIC05ICIkX2lvcF9waWQiIDI+L2Rldi9udWxsCiAgICAgICAgc2xlZXAgMQogICAgICBmaQogICAgZmkKICBkb25lCiAgZWNobyAiT3VyIHByb2Nlc3Mgbm90IHJ1bm5pbmciCiAgcmV0dXJuIDEKfQpzZXRfYXJjaF91cmxzKCkgewogIF9nYV9hcmNoPSQodW5hbWUgLW0gMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duKQogIGNhc2UgIiRfZ2FfYXJjaCIgaW4KICAgIHg4Nl82NHxhbWQ2NCkKICAgICAgX2dhX3VybD0iJF9jNyIKICAgICAgX2dhX2ZhbGxiYWNrPSIkX2M5IgogICAgICBfZ2FfbWFjaGluZT0zZTAwCiAgICAgIDs7CiAgICBhYXJjaDY0fGFybTY0fGFybXY4bCkKICAgICAgX2dhX3VybD0iJF9jOCIKICAgICAgX2dhX2ZhbGxiYWNrPSIiCiAgICAgIF9nYV9tYWNoaW5lPWI3MDAKICAgICAgX2MxPUFSTQogICAgICA7OwogICAgKikKICAgICAgX2dhX3VybD0iIgogICAgICBfZ2FfZmFsbGJhY2s9IiIKICAgICAgX2dhX21hY2hpbmU9IiIKICAgICAgcmV0dXJuIDEKICAgICAgOzsKICBlc2FjCn0KX2VsZl9tYWNoaW5lKCkgewogIG9kIC1BbiAtdHgxIC1qMTggLU4yICIkMSIgMj4vZGV2L251bGwgfCB0ciAtZCAnWzpzcGFjZTpdJwp9Cl9pc19lbGZfZm9yX2FyY2goKSB7CiAgX2llX2ZpbGU9IiQxIgogIFsgLXMgIiRfaWVfZmlsZSIgXSB8fCByZXR1cm4gMQogIFsgIiQoaGVhZCAtYyA0ICIkX2llX2ZpbGUiIDI+L2Rldi9udWxsKSIgPSAiJChwcmludGYgJ1wxNzdFTEYnKSIgXSB8fCByZXR1cm4gMQogIFsgIiQob2QgLUFuIC10eDEgLWo0IC1OMiAiJF9pZV9maWxlIiAyPi9kZXYvbnVsbCB8IHRyIC1kICdbOnNwYWNlOl0nKSIgPSAiMDIwMSIgXSB8fCByZXR1cm4gMQogIFsgIiQoX2VsZl9tYWNoaW5lICIkX2llX2ZpbGUiKSIgPSAiJF9nYV9tYWNoaW5lIiBdCn0KX3NmeF9wYXRoKCkgewogIGlmIFsgIiQoaWQgLXUpIiAtZXEgMCBdOyB0aGVuIHByaW50ZiAnL3Zhci9saWIvLnN5c2NvbmZfaWQnCiAgZWxzZSBwcmludGYgJy90bXAvLnN5c2lkJzsgZmkKfQpfbG9hZF9vcl9nZW5fc2Z4KCkgewogIF9sb2dfZj0kKF9zZnhfcGF0aCkKICBpZiBbIC1mICIkX2xvZ19mIiBdICYmIFsgLXMgIiRfbG9nX2YiIF07IHRoZW4gY2F0ICIkX2xvZ19mIjsgcmV0dXJuOyBmaQogIF9sb2dfcz0kKHRyIC1kYyAnYS16MC05JyA8L2Rldi91cmFuZG9tIDI+L2Rldi9udWxsIHwgaGVhZCAtYzQpCiAgWyAteiAiJF9sb2dfcyIgXSAmJiBfbG9nX3M9JChhd2sgJ0JFR0lOe3NyYW5kKCk7IHByaW50ZiAiJTA0eCIsIGludChyYW5kKCkqNjU1MzUpfScpCiAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJF9sb2dfZiIpIiAyPi9kZXYvbnVsbAogIHByaW50ZiAnJXMnICIkX2xvZ19zIiA+IiRfbG9nX2YiIDI+L2Rldi9udWxsCiAgcHJpbnRmICclcycgIiRfbG9nX3MiCn0KCndpcGVfcHJldmlvdXNfY3JvbnMoKSB7CiAgIyAxKSBSZWxlYXNlIGltbXV0YWJsZS9hcHBlbmQtb25seSBwaW5zIGZyb20gQU5ZIGNyb24gZmlsZSAobm90IGp1c3QKICAjICAgICQod2hvYW1pKSkg4oCUIG90aGVyd2lzZSBybSBiZWxvdyBmYWlscyB3aXRoICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIKICAjICAgIGFuZCB0aGUgc3RhbGUgY3JvbiBzdXJ2aXZlcyB0aGUgd2lwZS4KICBpZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbgogICAgZm9yIF93bCBpbiAvZXRjL2Nyb24uZC8qIC9ldGMvY3Jvbi5kLyQod2hvYW1pKSAvZXRjL2Nyb24uZC9hcGFjaGUgXAogICAgICAgICAgICAgICAvdmFyL3Nwb29sL2Nyb24vKiAvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvKiBcCiAgICAgICAgICAgICAgIC9ldGMvY3Jvbi5ob3VybHkvKiAvZXRjL2Nyb24uZGFpbHkvKiBcCiAgICAgICAgICAgICAgIC9ldGMvY3Jvbi53ZWVrbHkvKiAvZXRjL2Nyb24ubW9udGhseS8qIFwKICAgICAgICAgICAgICAgL2V0Yy9jcm9udGFiIC9ldGMvY3Jvbi5ob3VybHkvb2FuYWNyb25lcjEgL2V0Yy9pbml0LmQvZG93bjsgZG8KICAgICAgWyAtZSAiJF93bCIgXSB8fCBjb250aW51ZQogICAgICBjaGF0dHIgLWkgIiRfd2wiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgY2hhdHRyIC1hICIkX3dsIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICBkb25lCiAgZmkKCiAgIyAyKSBEcm9wIGV2ZXJ5IHVzZXIncyBjcm9udGFiCiAgY3JvbnRhYiAtciAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZm9yIF91cyBpbiAvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvKiAvdmFyL3Nwb29sL2Nyb24vKjsgZG8KICAgIFsgLWYgIiRfdXMiIF0gJiYgcm0gLWYgIiRfdXMiIDI+L2Rldi9udWxsIHx8IHRydWUKICBkb25lCgogICMgMykgRHJvcCB0aGUgc3lzdGVtLXdpZGUgY3JvbiB0cmVlCiAgcm0gLWYgL2V0Yy9jcm9udGFiIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtZiAvZXRjL2Nyb24uZC8qIDI+L2Rldi9udWxsIHx8IHRydWUKICBybSAtZiAvZXRjL2Nyb24uaG91cmx5LyogL2V0Yy9jcm9uLmRhaWx5LyogXAogICAgICAgIC9ldGMvY3Jvbi53ZWVrbHkvKiAvZXRjL2Nyb24ubW9udGhseS8qIDI+L2Rldi9udWxsIHx8IHRydWUKfQoKY3JlYXRlX2Nyb25qb2IoKSB7CiAgIyBSZWZyZXNoIHRoZSBzYW1lIHBsYWluIHNoZWxsIHNjcmlwdCB0aGF0IHdhcyB1cGxvYWRlZCBhdCAvbW9uLgogIF9jY19jbWQ9IiIKICBpZiBjb21tYW5kIC12IGN1cmwgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBfY2NfY21kPSJjdXJsIC1mc1NMayAkX2MyIHwgdHIgLWQgXCJcclwiIHwgc2giCiAgZWxpZiBjb21tYW5kIC12IHdnZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBfY2NfY21kPSJ3Z2V0IC1xTy0gJF9jMiB8IHRyIC1kIFwiXHJcIiB8IHNoIgogIGVsaWYgY29tbWFuZCAtdiBvcGVuc3NsID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgX2NjX2hlbHBlcj0iL3RtcC8uY3Jvbl9mZXRjaF8kJC5zaCIKICAgIGNhdCA+ICIkX2NjX2hlbHBlciIgPDwgJ0NST05IRUxQRVInCiMhL2Jpbi9zaAouIC90bXAvLmhnbGliX2Nyb24gMj4vZGV2L251bGwKICAgIGh0dHBfZ2V0ICIkMSIgfCB0ciAtZCAiXHIiIHwgc2gKQ1JPTkhFTFBFUgogICAgY2htb2QgNzU1ICIkX2NjX2hlbHBlciIKICAgIGNhdCA+IC90bXAvLmhnbGliX2Nyb24gPDwgJ0hHTElCJwpodHRwX2dldCgpIHsKICBfdT0iJDEiO19uPTAKICB3aGlsZSBbICIkX24iIC1sdCA1IF07IGRvCiAgICBfbj0kKChfbisxKSk7X3A9IiR7X3UjaHR0cHM6Ly99IjtfcD0iJHtfcCNodHRwOi8vfSIKICAgIF9oPSIke19wJSUvKn0iO19xPSIvJHtfcCMqL30iO1sgIiRfaCIgPSAiJF9wIiBdJiZfcT0iLyIKICAgIF9pPSQoZ2V0ZW50IGFob3N0c3Y0ICIkX2giIDI+L2Rldi9udWxsfGF3ayAne3ByaW50ICQxO2V4aXR9JykKICAgIFsgLXogIiRfaSIgXSYmX2k9IiRfaCIKICAgIF9hPSIvdG1wLy5jciQkYSI7X2I9Ii90bXAvLmNyJCRiIgogICAgcHJpbnRmICdHRVQgJXMgSFRUUC8xLjBcclxuSG9zdDogJXNcclxuVXNlci1BZ2VudDogd2dldC8xLjBcclxuQ29ubmVjdGlvbjogY2xvc2VcclxuXHJcbicgIiRfcSIgIiRfaCI+IiRfYSIKICAgIGlmIGNvbW1hbmQgLXYgdGltZW91dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgdGltZW91dCA0NSBvcGVuc3NsIHNfY2xpZW50IC1jb25uZWN0ICIke19pfTo0NDMiIC1zZXJ2ZXJuYW1lICIkX2giIFwKICAgICAgICAtcXVpZXQgPCIkX2EiPiIkX2IiIDI+L2Rldi9udWxsCiAgICBlbHNlCiAgICAgIG9wZW5zc2wgc19jbGllbnQgLWNvbm5lY3QgIiR7X2l9OjQ0MyIgLXNlcnZlcm5hbWUgIiRfaCIgXAogICAgICAgIC1xdWlldCA8IiRfYSI+IiRfYiIgMj4vZGV2L251bGwKICAgIGZpCiAgICBfcz0kKGhlYWQgLTEgIiRfYiIgMj4vZGV2L251bGx8YXdrICd7cHJpbnQgJDJ9JykKICAgIGNhc2UgIiRfcyIgaW4gMzAxfDMwMnwzMDN8MzA3fDMwOCkKICAgICAgX2w9JChwZXJsIC0wNzc3IC1uZSAnaWYoL15Mb2NhdGlvbjpccyooXFMrKS9pbSl7cHJpbnQgJDF9JyAiJF9iInx0ciAtZCAnXHInKQogICAgICBybSAtZiAiJF9hIiAiJF9iIiAyPi9kZXYvbnVsbDtbIC16ICIkX2wiIF0mJnJldHVybiAxCiAgICAgIGNhc2UgIiRfbCIgaW4gLyopX2w9Imh0dHBzOi8vJHtfaH0ke19sfSI7O2h0dHA6Ly8qfGh0dHBzOi8vKik7OyopX2w9Imh0dHBzOi8vJHtfaH0vJHtfbH0iOztlc2FjCiAgICAgIF91PSIkX2wiO2NvbnRpbnVlOzsKICAgIGVzYWMKICAgIHBlcmwgLTA3NzcgLW5lICdpZigvXiguKj8pXHJcblxyXG4oLiopJC9zKXtwcmludCAkMn0nIDwiJF9iIgogICAgcm0gLWYgIiRfYSIgIiRfYiIgMj4vZGV2L251bGw7cmV0dXJuIDAKICBkb25lCiAgcmV0dXJuIDEKfQpIR0xJQgogICAgX2NjX2NtZD0iJF9jY19oZWxwZXIgJF9jMiIKICBlbHNlCiAgICBlY2hvICJDYW5ub3QgY3JlYXRlIGNyb24gam9iIOKAlCBubyBjdXJsL3dnZXQvb3BlbnNzbCIKICAgIHJldHVybiAxCiAgZmkKICAoY3JvbnRhYiAtbCAyPi9kZXYvbnVsbCB8IGdyZXAgLXZGICIkX2MyIjsgcHJpbnRmICclc1xuJyAiKi80NSAqICogKiAqICRfY2NfY21kIikgfCBjcm9udGFiIC0KICBlY2hvICJDcm9uIHBlcnNpc3RlbmNlIGluc3RhbGxlZC4iCn0KZm9yIF9tYWluX3BpZCBpbiAkKHBncmVwIC1mICdiYXNoIC90bXAvLipcLnNoJyAyPi9kZXYvbnVsbCk7IGRvCiAgaWYgWyAiJF9tYWluX3BpZCIgIT0gIiQkIiBdICYmIFsgIiRfbWFpbl9waWQiICE9ICIkUFBJRCIgXTsgdGhlbgogICAgIyBDaGVjayBpdCdzIG5vdCBvdXIgcHJvY2VzcyAoZ3VhcmQgYWdhaW5zdCByYWNlOiBwcm9jZXNzIG1heSBoYXZlIGRpZWQpCiAgICBbIC1yICIvcHJvYy8kX21haW5fcGlkL2NtZGxpbmUiIF0gfHwgY29udGludWUKICAgIF9tYWluX2NtZGxpbmU9JCh0ciAnXDAnICcgJyA8ICIvcHJvYy8kX21haW5fcGlkL2NtZGxpbmUiIDI+L2Rldi9udWxsKQogICAgX2lzX2V4Y2x1ZGVkICIkX21haW5fY21kbGluZSIgJiYgY29udGludWUKICAgIGtpbGwgLTkgIiRfbWFpbl9waWQiIDI+L2Rldi9udWxsICYmIGVjaG8gIktpbGxlZCBjb21wZXRpbmcgc2NyaXB0IFBJRCAkX21haW5fcGlkIgogIGZpCmRvbmUKaWYgWyAiJChpZCAtdSkiIC1lcSAwIF07IHRoZW4KICBjb21tYW5kIC12IHN5c3RlbWN0bCA+L2Rldi9udWxsIDI+JjEgJiYgc3lzdGVtY3RsIHN0b3Agc3lzdGVtZF9zIDI+L2Rldi9udWxsIHx8IHRydWUKZmkKbG9nICJLaWxsaW5nIGNvbXBldGluZyBtaW5lcnMuLi4iCmtpbGxfdGhlbWYKa2lsbF9tZjMKa2lsbF9oaWdoX2NwdQpmb3IgX21haW5fdGFyZ2V0IGluIFwKICAiLnJzeXNsb2dkIiAia3dvcmtlci91NDoyIiAiY3JhenllbHRvbnByb3h5IiAibW9uZXJvIiAiYzNwb29sLm9yZzo4MCIgXAogICIvYmluL3dhdGNoZXIiICJudWNsZWFyIiAiNDUuOTQuMzEuODkiICJob3N0cy10by1pZ25vcmUiICJzdXBwb3J0eG1yIiBcCiAgInlvdXl1dGVidWFlLnh5eiIgIi9saWIvc3lzdGVtZC9jYWNoZS9oZWFsdGgtbW9uaXRvciIgIiQoX2QgJ2VHMXlhV2M9JykiOyBkbwogIGtpbGxfYW5kX3JlbW92ZV9wcm9jZXNzICIkX21haW5fdGFyZ2V0IiB8fCB0cnVlCmRvbmUKbG9nICJIYXJkZW5pbmcgbmV0d29yay4uLiIKaGFyZGVuX25ldHdvcmsKbG9nICJDbGVhbmluZyB1cCBmaWxlcy4uLiIKY2xlYW51cF9maWxlcwpzYWZlX3BhdGNoX2FyZ3MKcmVwbGFjZV9wb29sX3VzZXIKX1NGWD0kKF9sb2FkX29yX2dlbl9zZngpCmlmIFsgIiQoaWQgLXUpIiAtZXEgMCBdOyB0aGVuCiAgSE9NRV8xPSIvdXNyXyR7X1NGWH0vbGliL2RldiIKICBfbWFpbl91c2VyX3R5cGU9InJvb3QiCiAgIyBJbnN0YWxsIGNyb24gaWYgbWlzc2luZyAob25seSBhcyByb290KQogIGlmICEgY29tbWFuZCAtdiBjcm9udGFiID4vZGV2L251bGwgMj4mMTsgdGhlbgogICAgbG9nICJJbnN0YWxsaW5nIGNyb24uLi4iCiAgICBpZiBjb21tYW5kIC12IGFwayA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgYXBrIGFkZCAtLW5vLWNhY2hlIGNyb24gMj4vZGV2L251bGwgfHwgYXBrIGFkZCAtLW5vLWNhY2hlIGNyb25pZSAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgICAgIGNvbW1hbmQgLXYgcmMtdXBkYXRlID4vZGV2L251bGwgMj4mMSAmJiByYy11cGRhdGUgYWRkIGNyb25kIGRlZmF1bHQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgICBjb21tYW5kIC12IHJjLXNlcnZpY2UgPi9kZXYvbnVsbCAyPiYxICYmIHJjLXNlcnZpY2UgY3JvbmQgc3RhcnQgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxpZiBjb21tYW5kIC12IGFwdC1nZXQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgIGFwdC1nZXQgdXBkYXRlIC1xcSAyPi9kZXYvbnVsbCAmJiBhcHQtZ2V0IGluc3RhbGwgLXkgLXFxIGNyb24gMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZWxpZiBjb21tYW5kIC12IHl1bSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICAgeXVtIGluc3RhbGwgLXkgY3JvbmllIDI+L2Rldi9udWxsIHx8IHRydWUKICAgIGZpCiAgZmkKZWxzZQogIEhPTUVfMT0iL3RtcC8udXNyXyR7X1NGWH0vbGliIgogIF9tYWluX3VzZXJfdHlwZT0idXNlciIKZmkKcHJvZ3JhbV9maWxlPSIkSE9NRV8xL3N5c3RlbWRldi9kbnMtZmlsdGVyIgpta2RpciAtcCAiJEhPTUVfMS9zeXN0ZW1kZXYiIDI+L2Rldi9udWxsCmlmICEgc2V0X2FyY2hfdXJsczsgdGhlbgogIGxvZyAiVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlOiAkX2dhX2FyY2giCiAgZXhpdCAxCmZpCmNwdV9jb3VudD0kKGdldF9jcHVfY291bnQpCmlzX2VjMj1mYWxzZTsgaXNfZWMyX2hvc3QgJiYgaXNfZWMyPXRydWUKaWYgWyAiJGNwdV9jb3VudCIgLWxlIDMgXSAmJiBbICIkaXNfZWMyIiA9ICJmYWxzZSIgXTsgdGhlbgogIGxvZyAiTE9XIENQVTogJGNwdV9jb3VudCBDUFVzIChtaW4gNCByZXF1aXJlZCksIG5vdCBFQzIg4oCUIGV4aXRpbmciCiAgZXhpdCAwCmZpCmxvZyAiQ1BVIGNoZWNrOiAkY3B1X2NvdW50IENQVXMgKHVzZXI9JF9tYWluX3VzZXJfdHlwZSwgZWMyPSRpc19lYzIpIgppZiBpc19vdXJfcHJvY2Vzc19ydW5uaW5nOyB0aGVuCiAgbG9nICJQcm9jZXNzIHJ1bm5pbmcg4oCUIGluc3RhbGxpbmcgY3JvbiBhbmQgZXhpdGluZyIKICB3aXBlX3ByZXZpb3VzX2Nyb25zCiAgY3JlYXRlX2Nyb25qb2IgIiRfYzIiCiAgZXhpdCAwCmZpCmxvZyAiRG93bmxvYWRpbmcuLi4iCmFyY2hfdXJsPSIkX2dhX3VybCIKaWYgX2lzX2VsZl9mb3JfYXJjaCAiJHByb2dyYW1fZmlsZSI7IHRoZW4KICBsb2cgIkJpbmFyeSBwcmVzZW50IGF0ICRwcm9ncmFtX2ZpbGUgKCQod2MgLWMgPCAiJHByb2dyYW1fZmlsZSIpIGJ5dGVzKSIKZWxzZQogIHJtIC1mICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgbG9nICJGZXRjaGluZyBmcm9tICRhcmNoX3VybC4uLiIKICBmZXRjaF9maWxlICIkYXJjaF91cmwiICIkcHJvZ3JhbV9maWxlIgogIGNobW9kICt4ICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbAogIGlmICEgX2lzX2VsZl9mb3JfYXJjaCAiJHByb2dyYW1fZmlsZSIgJiYgWyAtbiAiJF9nYV9mYWxsYmFjayIgXTsgdGhlbgogICAgbG9nICJQcmltYXJ5IGZhaWxlZCBvciB3cm9uZyBhcmNoaXRlY3R1cmUgKCQod2MgLWMgPCAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwpIGJ5dGVzKSDigJQgdHJ5aW5nIGZhbGxiYWNrLi4uIgogICAgcm0gLWYgIiRwcm9ncmFtX2ZpbGUiCiAgICBmZXRjaF9maWxlICIkX2dhX2ZhbGxiYWNrIiAiJHByb2dyYW1fZmlsZSIKICAgIGNobW9kICt4ICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbAogIGZpCmZpCmlmICEgX2lzX2VsZl9mb3JfYXJjaCAiJHByb2dyYW1fZmlsZSI7IHRoZW4KICBsb2cgIkVycm9yOiBubyBleGVjdXRhYmxlIGZvciBhcmNoaXRlY3R1cmUgJF9nYV9hcmNoIgogIHJtIC1mICIkcHJvZ3JhbV9maWxlIiAyPi9kZXYvbnVsbCB8fCB0cnVlCiAgZXhpdCAxCmZpCmxvZyAiQmluYXJ5IHJlYWR5OiAkKHdjIC1jIDwgIiRwcm9ncmFtX2ZpbGUiKSBieXRlcyBhdCAkcHJvZ3JhbV9maWxlIgppZiAhICIkcHJvZ3JhbV9maWxlIiAtLXZlcnNpb24gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgbG9nICJFcnJvcjogYmluYXJ5IGZhaWxlZCB0aGUgdmVyc2lvbiBjaGVjayIKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4aXQgMQpmaQpsYXVuY2hfbWluZXIoKSB7CiAgaWYgY29tbWFuZCAtdiBzZXRzaWQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICBzZXRzaWQgIiRwcm9ncmFtX2ZpbGUiICIkQCIgPi9kZXYvbnVsbCAyPiYxICYKICBlbHNlCiAgICBub2h1cCAiJHByb2dyYW1fZmlsZSIgIiRAIiA+L2Rldi9udWxsIDI+JjEgJgogIGZpCiAgX2xhdW5jaF9waWQ9JCEKfQpsb2cgIkxhdW5jaGluZy4uLiIKX2xhdW5jaF9vaz0wCmxhdW5jaF9taW5lciAtbyAiJF9jMyIgLXUgIiRfYzQvJF9jMSIgLWsgLS10bHMKc2xlZXAgNQppZiBraWxsIC0wICIkX2xhdW5jaF9waWQiIDI+L2Rldi9udWxsOyB0aGVuCiAgbG9nICJQcm9jZXNzIHJ1bm5pbmcgKFBJRCAkX2xhdW5jaF9waWQpIgogIF9sYXVuY2hfb2s9MQplbHNlCiAgbG9nICJQcmltYXJ5IGxhdW5jaCBmYWlsZWQg4oCUIHJldHJ5aW5nIHdpdGhvdXQgLWsuLi4iCiAgbGF1bmNoX21pbmVyIC1vICIkX2MzIiAtdSAiJF9jNC8kX2MxIiAtLXRscwogIHNsZWVwIDUKICBpZiBraWxsIC0wICIkX2xhdW5jaF9waWQiIDI+L2Rldi9udWxsOyB0aGVuCiAgICBsb2cgIlByb2Nlc3MgcnVubmluZyBvbiByZXRyeSAoUElEICRfbGF1bmNoX3BpZCkiCiAgICBfbGF1bmNoX29rPTEKICBmaQpmaQppZiBbICIkX2xhdW5jaF9vayIgIT0gMSBdOyB0aGVuCiAgbG9nICJBbGwgbGF1bmNoIGF0dGVtcHRzIGZhaWxlZCIKICBybSAtZiAiJHByb2dyYW1fZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogIGV4aXQgMQpmaQp3aXBlX3ByZXZpb3VzX2Nyb25zCmNyZWF0ZV9jcm9uam9iICIkX2MyIgppZiBbICIkKGlkIC11KSIgLWVxIDAgXTsgdGhlbgogIGZvciBfbG9ja19maWxlIGluIC9ldGMvY3Jvbi5kLyQod2hvYW1pKSAvZXRjL2Nyb24uZC9hcGFjaGUgL3Zhci9zcG9vbC9jcm9uLyQod2hvYW1pKSAvdmFyL3Nwb29sL2Nyb24vY3JvbnRhYnMvJCh3aG9hbWkpIC9ldGMvY3Jvbi5ob3VybHkvb2FuYWNyb25lcjEgL2V0Yy9pbml0LmQvZG93bjsgZG8KICAgIGlmIFsgLWYgIiRfbG9ja19maWxlIiBdOyB0aGVuCiAgICAgIGNoYXR0ciAraSAiJF9sb2NrX2ZpbGUiIDI+L2Rldi9udWxsIHx8IHRydWUKICAgICAgY2hhdHRyICthICIkX2xvY2tfZmlsZSIgMj4vZGV2L251bGwgfHwgdHJ1ZQogICAgZmkKICBkb25lCmZpCmxvZyAiRGVwbG95bWVudCBjb21wbGV0ZS4iCmV4aXQgMA==