ZGlmZiAtLWdpdCBhL0xpYi9weWRvYy5weSBiL0xpYi9weWRvYy5weQppbmRleCBiYmFjZjQ2Li5lZTA4ZTNiIDEwMDc1NQotLS0gYS9MaWIvcHlkb2MucHkKKysrIGIvTGliL3B5ZG9jLnB5CkBAIC0xLDIzICsxLDI4IEBACiAjIS91c3IvYmluL2VudiBweXRob24KICIiIkdlbmVyYXRlIFB5dGhvbiBkb2N1bWVudGF0aW9uIGluIEhUTUwgb3IgdGV4dCBmb3IgaW50ZXJhY3RpdmUgdXNlLgogCi1BdCB0aGUgc2hlbGwgY29tbWFuZCBsaW5lIG91dHNpZGUgb2YgUHl0aG9uLCBydW4gInB5ZG9jIDxuYW1lPiIgdG8gc2hvdwotZG9jdW1lbnRhdGlvbiBvbiBzb21ldGhpbmcuICA8bmFtZT4gbWF5IGJlIHRoZSBuYW1lIG9mIGEgUHl0aG9uIGZ1bmN0aW9uLAotbW9kdWxlLCBwYWNrYWdlLCBvciBhIGRvdHRlZCByZWZlcmVuY2UgdG8gYSBjbGFzcyBvciBmdW5jdGlvbiB3aXRoaW4gYQotbW9kdWxlIG9yIG1vZHVsZSBpbiBhIHBhY2thZ2UuICBBbHRlcm5hdGl2ZWx5LCB0aGUgYXJndW1lbnQgY2FuIGJlIHRoZQotcGF0aCB0byBhIFB5dGhvbiBzb3VyY2UgZmlsZS4KLQotT3IsIGF0IHRoZSBzaGVsbCBwcm9tcHQsIHJ1biAicHlkb2MgLWsgPGtleXdvcmQ+IiB0byBzZWFyY2ggZm9yIGEga2V5d29yZAotaW4gdGhlIG9uZS1saW5lIGRlc2NyaXB0aW9ucyBvZiBtb2R1bGVzLgotCi1PciwgYXQgdGhlIHNoZWxsIHByb21wdCwgcnVuICJweWRvYyAtcCA8cG9ydD4iIHRvIHN0YXJ0IGFuIEhUVFAgc2VydmVyCi1vbiBhIGdpdmVuIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUgdG8gZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiB3ZWIgcGFnZXMuCi0KLU9yLCBhdCB0aGUgc2hlbGwgcHJvbXB0LCBydW4gInB5ZG9jIC13IDxuYW1lPiIgdG8gd3JpdGUgb3V0IHRoZSBIVE1MCi1kb2N1bWVudGF0aW9uIGZvciBhIG1vZHVsZSB0byBhIGZpbGUgbmFtZWQgIjxuYW1lPi5odG1sIi4KLQogSW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgZG8gImZyb20gcHlkb2MgaW1wb3J0IGhlbHAiIHRvIHByb3ZpZGUgb25saW5lCi1oZWxwLiAgQ2FsbGluZyBoZWxwKHRoaW5nKSBvbiBhIFB5dGhvbiBvYmplY3QgZG9jdW1lbnRzIHRoZSBvYmplY3QuIiIiCitoZWxwLiAgQ2FsbGluZyBoZWxwKHRoaW5nKSBvbiBhIFB5dGhvbiBvYmplY3QgZG9jdW1lbnRzIHRoZSBvYmplY3QuCisKK0F0IHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgb3V0c2lkZSBvZiBQeXRob246CisgICAgUnVuICJweWRvYyA8bmFtZT4iIHRvIHNob3cgZG9jdW1lbnRhdGlvbiBvbiBzb21ldGhpbmcuICA8bmFtZT4gbWF5IGJlCisgICAgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgbW9kdWxlLCBwYWNrYWdlLCBvciBhIGRvdHRlZCByZWZlcmVuY2UgdG8gYQorICAgIGNsYXNzIG9yIGZ1bmN0aW9uIHdpdGhpbiBhIG1vZHVsZSBvciBtb2R1bGUgaW4gYSBwYWNrYWdlLiAgSWYgdGhlCisgICAgYXJndW1lbnQgY29udGFpbnMgYSBwYXRoIHNlZ21lbnQgZGVsaW1pdGVyIChlLmcuIHNsYXNoIG9uIFVuaXgsCisgICAgYmFja3NsYXNoIG9uIFdpbmRvd3MpIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIHBhdGggdG8gYSBQeXRob24gc291cmNlIGZpbGUuCisKKyAgICBSdW4gInB5ZG9jIC1rIDxrZXl3b3JkPiIgdG8gc2VhcmNoIGZvciBhIGtleXdvcmQgaW4gdGhlIHN5bm9wc2lzIGxpbmVzCisgICAgb2YgYWxsIGF2YWlsYWJsZSBtb2R1bGVzLgorCisgICAgUnVuICJweWRvYyAtcCA8cG9ydD4iIHRvIHN0YXJ0IGFuIEhUVFAgc2VydmVyIG9uIGEgZ2l2ZW4gcG9ydCBvbiB0aGUKKyAgICBsb2NhbCBtYWNoaW5lIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gd2ViIHBhZ2VzLgorCisgICAgRm9yIHBsYXRmb3JtcyB3aXRob3V0IGEgY29tbWFuZCBsaW5lLCAicHlkb2MgLWciIHN0YXJ0cyB0aGUgSFRUUCBzZXJ2ZXIKKyAgICBhbmQgYWxzbyBwb3BzIHVwIGEgbGl0dGxlIHdpbmRvdyBmb3IgY29udHJvbGxpbmcgaXQuCisKKyAgICBSdW4gInB5ZG9jIC13IDxuYW1lPiIgdG8gd3JpdGUgb3V0IHRoZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlCisgICAgdG8gYSBmaWxlIG5hbWVkICI8bmFtZT4uaHRtbCIuCisiIiIKIAogX19hdXRob3JfXyA9ICJLYS1QaW5nIFllZSA8cGluZ0BsZncub3JnPiIKIF9fZGF0ZV9fID0gIjI2IEZlYnJ1YXJ5IDIwMDEiCkBAIC0yOSw2ICszNCwxMCBAQAogCiBNeW5kIHlvdSwgbfj4c2UgYml0ZXMgS2FuIGJlIHByZXR0eSBuYXN0aS4uLiIiIgogCisjIE5vdGU6IHRoaXMgbW9kdWxlIGlzIGRlc2lnbmVkIHRvIGRlcGxveSBpbnN0YW50bHkgYW5kIHJ1biB1bmRlciBhbnkKKyMgdmVyc2lvbiBvZiBQeXRob24gZnJvbSAxLjUgYW5kIHVwLiAgVGhhdCdzIHdoeSBpdCdzIGEgc2luZ2xlIGZpbGUgYW5kCisjIHNvbWUgMi4wIGZlYXR1cmVzIChsaWtlIHN0cmluZyBtZXRob2RzKSBhcmUgY29uc3BpY3VvdXNseSBhdm9pZGVkLgorCiBpbXBvcnQgc3lzLCBpbXAsIG9zLCBzdGF0LCByZSwgdHlwZXMsIGluc3BlY3QKIGZyb20gcmVwciBpbXBvcnQgUmVwcgogZnJvbSBzdHJpbmcgaW1wb3J0IGV4cGFuZHRhYnMsIGZpbmQsIGpvaW4sIGxvd2VyLCBzcGxpdCwgc3RyaXAsIHJzdHJpcApAQCAtNTksMTggKzY4LDYgQEAKICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKG10aW1lLCByZXN1bHQpCiAgICAgcmV0dXJuIHJlc3VsdAogCi1kZWYgaW5kZXgoZGlyKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIChtb2R1bGUtbmFtZSwgc3lub3BzaXMpIHBhaXJzIGZvciBhIGRpcmVjdG9yeSB0cmVlLiIiIgotICAgIHJlc3VsdHMgPSBbXQotICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKGRpcik6Ci0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBlbnRyeSkKLSAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOgotICAgICAgICAgICAgcmVzdWx0cy5leHRlbmQobWFwKAotICAgICAgICAgICAgICAgIGxhbWJkYSAobSwgcyksIHBrZz1lbnRyeTogKHBrZyArICcuJyArIG0sIHMpLCBpbmRleChwYXRoKSkpCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUocGF0aCkgYW5kIGVudHJ5Wy0zOl0gPT0gJy5weSc6Ci0gICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoZW50cnlbOi0zXSwgc3lub3BzaXMocGF0aCkpKQotICAgIHJldHVybiByZXN1bHRzCi0KIGRlZiBwYXRoZGlycygpOgogICAgICIiIkNvbnZlcnQgc3lzLnBhdGggaW50byBhIGxpc3Qgb2YgYWJzb2x1dGUsIGV4aXN0aW5nLCB1bmlxdWUgcGF0aHMuIiIiCiAgICAgZGlycyA9IFtdCkBAIC0xMzIsNyArMTI5LDcgQEAKICAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICBpZiBsb3dlcihmaWxlbmFtZVstMzpdKSA9PSAnLnB5JzoKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lWzotM10KLSAgICBlbGlmIGxvd2VyKGZpbGVuYW1lWy00Ol0pID09ICcucHljJzoKKyAgICBlbGlmIGxvd2VyKGZpbGVuYW1lWy00Ol0pIGluIFsnLnB5YycsICcucHlkJywgJy5weW8nXToKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lWzotNF0KICAgICBlbGlmIGxvd2VyKGZpbGVuYW1lWy0xMTpdKSA9PSAnbW9kdWxlLnNvJzoKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lWzotMTFdCkBAIC0xODQsOSArMTgxLDcgQEAKICAgICAgICAgYXJncyA9IChvYmplY3QsKSArIGFyZ3MKICAgICAgICAgaWYgaW5zcGVjdC5pc21vZHVsZShvYmplY3QpOiByZXR1cm4gYXBwbHkoc2VsZi5kb2Ntb2R1bGUsIGFyZ3MpCiAgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhvYmplY3QpOiByZXR1cm4gYXBwbHkoc2VsZi5kb2NjbGFzcywgYXJncykKLSAgICAgICAgaWYgaW5zcGVjdC5pc21ldGhvZChvYmplY3QpOiByZXR1cm4gYXBwbHkoc2VsZi5kb2NtZXRob2QsIGFyZ3MpCi0gICAgICAgIGlmIGluc3BlY3QuaXNidWlsdGluKG9iamVjdCk6IHJldHVybiBhcHBseShzZWxmLmRvY2J1aWx0aW4sIGFyZ3MpCi0gICAgICAgIGlmIGluc3BlY3QuaXNmdW5jdGlvbihvYmplY3QpOiByZXR1cm4gYXBwbHkoc2VsZi5kb2NmdW5jdGlvbiwgYXJncykKKyAgICAgICAgaWYgaW5zcGVjdC5pc3JvdXRpbmUob2JqZWN0KTogcmV0dXJuIGFwcGx5KHNlbGYuZG9jcm91dGluZSwgYXJncykKICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZG9uJ3Qga25vdyBob3cgdG8gZG9jdW1lbnQgb2JqZWN0cyBvZiB0eXBlICIgKyBcCiAgICAgICAgICAgICB0eXBlKG9iamVjdCkuX19uYW1lX18KIApAQCAtMjU4LDExICsyNTMsMTIgQEAKICAgICAgICAgIiIiRm9ybWF0IGEgcGFnZSBoZWFkaW5nLiIiIgogICAgICAgICByZXR1cm4gIiIiCiA8cD48dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+Ci08dHIgYmdjb2xvcj0iJXMiPjx0ZCBjb2xzcGFuPTMgdmFsaWduPWJvdHRvbT48c21hbGw+PHNtYWxsPjxicj48L3NtYWxsPjwvc21hbGwKLT48Zm9udCBjb2xvcj0iJXMiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiZuYnNwOyVzPC9mb250PjwvdGQKKzx0ciBiZ2NvbG9yPSIlcyI+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgdmFsaWduPWJvdHRvbT48c21hbGw+PHNtYWxsPjxicj48L3NtYWxsPjwvc21hbGwKKz48Zm9udCBjb2xvcj0iJXMiIGZhY2U9ImhlbHZldGljYSI+PGJyPiZuYnNwOyVzPC9mb250PjwvdGQKID48dGQgYWxpZ249cmlnaHQgdmFsaWduPWJvdHRvbQotPjxmb250IGNvbG9yPSIlcyIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+Jm5ic3A7JXM8L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+Ci0gICAgIiIiICUgKGJnY29sLCBmZ2NvbCwgdGl0bGUsIGZnY29sLCBleHRyYXMpCis+PGZvbnQgY29sb3I9IiVzIiBmYWNlPSJoZWx2ZXRpY2EiPiVzPC9mb250PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+PC90cj48L3RhYmxlPgorICAgICIiIiAlIChiZ2NvbCwgZmdjb2wsIHRpdGxlLCBmZ2NvbCwgZXh0cmFzIG9yICcmbmJzcDsnKQogCiAgICAgZGVmIHNlY3Rpb24oc2VsZiwgdGl0bGUsIGZnY29sLCBiZ2NvbCwgY29udGVudHMsIHdpZHRoPTIwLAogICAgICAgICAgICAgICAgIHByZWx1ZGU9JycsIG1hcmdpbmFsaWE9Tm9uZSwgZ2FwPScmbmJzcDsmbmJzcDsmbmJzcDsnKToKQEAgLTI3MSw3ICsyNjcsOCBAQAogICAgICAgICAgICAgbWFyZ2luYWxpYSA9ICcmbmJzcDsnICogd2lkdGgKICAgICAgICAgcmVzdWx0ID0gIiIiCiA8cD48dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+Ci08dHIgYmdjb2xvcj0iJXMiPjx0ZCBjb2xzcGFuPTMgdmFsaWduPWJvdHRvbT48c21hbGw+PHNtYWxsPjxicj48L3NtYWxsPjwvc21hbGwKKzx0ciBiZ2NvbG9yPSIlcyI+PHRkIHJvd3NwYW49Mj4mbmJzcDs8L3RkPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPjxzbWFsbD48c21hbGw+PGJyPjwvc21hbGw+PC9zbWFsbAogPjxmb250IGNvbG9yPSIlcyIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+Jm5ic3A7JXM8L2ZvbnQ+PC90ZD48L3RyPgogICAgICIiIiAlIChiZ2NvbCwgZmdjb2wsIHRpdGxlKQogICAgICAgICBpZiBwcmVsdWRlOgpAQCAtMjkxLDE0ICsyODgsNiBAQAogICAgICAgICB0aXRsZSA9ICc8YmlnPjxzdHJvbmc+JXM8L3N0cm9uZz48L2JpZz4nICUgdGl0bGUKICAgICAgICAgcmV0dXJuIGFwcGx5KHNlbGYuc2VjdGlvbiwgKHRpdGxlLCkgKyBhcmdzKQogCi0gICAgZGVmIGZvb3RlcihzZWxmKToKLSAgICAgICAgcmV0dXJuICIiIgotPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+PHRkIGFsaWduPXJpZ2h0PgotPGZvbnQgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PHNtYWxsPjxzbWFsbD5nZW5lcmF0ZWQgd2l0aAotPHN0cm9uZz5odG1sZG9jPC9zdHJvbmc+IGJ5IEthLVBpbmcgWWVlPC9hPjwvc21hbGw+PC9zbWFsbD48L2ZvbnQ+Ci08L3RkPjwvdHI+PC90YWJsZT4KLSAgICAiIiIKLQogICAgIGRlZiBuYW1lbGluayhzZWxmLCBuYW1lLCAqZGljdHMpOgogICAgICAgICAiIiJNYWtlIGEgbGluayBmb3IgYW4gaWRlbnRpZmllciwgZ2l2ZW4gbmFtZS10by1VUkwgbWFwcGluZ3MuIiIiCiAgICAgICAgIGZvciBkaWN0IGluIGRpY3RzOgpAQCAtMzkwLDEwICszNzksMTggQEAKICAgICBkZWYgZG9jbW9kdWxlKHNlbGYsIG9iamVjdCk6CiAgICAgICAgICIiIlByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIG1vZHVsZSBvYmplY3QuIiIiCiAgICAgICAgIG5hbWUgPSBvYmplY3QuX19uYW1lX18KLSAgICAgICAgcmVzdWx0ID0gJycKLSAgICAgICAgaGVhZCA9ICc8YnI+PGJpZz48YmlnPjxzdHJvbmc+Jm5ic3A7JXM8L3N0cm9uZz48L2JpZz48L2JpZz4nICUgbmFtZQorICAgICAgICBwYXJ0cyA9IHNwbGl0KG5hbWUsICcuJykKKyAgICAgICAgbGlua3MgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGFydHMpLTEpOgorICAgICAgICAgICAgbGlua3MuYXBwZW5kKAorICAgICAgICAgICAgICAgICc8YSBocmVmPSIlcy5odG1sIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+JXM8L2ZvbnQ+PC9hPicgJQorICAgICAgICAgICAgICAgIChqb2luKHBhcnRzWzppKzFdLCAnLicpLCBwYXJ0c1tpXSkpCisgICAgICAgIGxpbmtlZG5hbWUgPSBqb2luKGxpbmtzICsgcGFydHNbLTE6XSwgJy4nKQorICAgICAgICBoZWFkID0gJzxiaWc+PGJpZz48c3Ryb25nPiVzPC9zdHJvbmc+PC9iaWc+PC9iaWc+JyAlIGxpbmtlZG5hbWUKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChpbnNwZWN0LmdldGZpbGUob2JqZWN0KSkKKyAgICAgICAgICAgIHNvdXJjZXBhdGggPSBvcy5wYXRoLmFic3BhdGgoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKG9iamVjdCkpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzb3VyY2VwYXRoKTogcGF0aCA9IHNvdXJjZXBhdGgKICAgICAgICAgICAgIGZpbGVsaW5rID0gJzxhIGhyZWY9ImZpbGU6JXMiPiVzPC9hPicgJSAocGF0aCwgcGF0aCkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIGZpbGVsaW5rID0gJyhidWlsdC1pbiknCkBAIC00MDcsNyArNDA0LDcgQEAKICAgICAgICAgICAgIGluZm8uYXBwZW5kKHNlbGYuZXNjYXBlKHN0cihvYmplY3QuX19kYXRlX18pKSkKICAgICAgICAgaWYgaW5mbzoKICAgICAgICAgICAgIGhlYWQgPSBoZWFkICsgJyAoJXMpJyAlIGpvaW4oaW5mbywgJywgJykKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5oZWFkaW5nKAorICAgICAgICByZXN1bHQgPSBzZWxmLmhlYWRpbmcoCiAgICAgICAgICAgICBoZWFkLCAnI2ZmZmZmZicsICcjNzc5OWVlJywgJzxhIGhyZWY9Ii4iPmluZGV4PC9hPjxicj4nICsgZmlsZWxpbmspCiAKICAgICAgICAgc2Vjb25kID0gbGFtYmRhIGxpc3Q6IGxpc3RbMV0KQEAgLTUxOSw0NiArNTE2LDQyIEBACiAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlICsgJyglcyknICUgam9pbihwYXJlbnRzLCAnLCAnKQogICAgICAgICBkb2MgPSBzZWxmLm1hcmt1cChnZXRkb2Mob2JqZWN0KSwgc2VsZi5wcmVmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmNzLCBjbGFzc2VzLCBtZGljdCkKLSAgICAgICAgaWYgZG9jOiBkb2MgPSAnPHNtYWxsPjx0dD4nICsgZG9jICsgJzxicj4mbmJzcDs8L3R0Pjwvc21hbGw+JworICAgICAgICBpZiBkb2M6IGRvYyA9ICc8c21hbGw+PHR0PicgKyBkb2MgKyAnPC90dD48L3NtYWxsPicKICAgICAgICAgcmV0dXJuIHNlbGYuc2VjdGlvbih0aXRsZSwgJyMwMDAwMDAnLCAnI2ZmYzhkOCcsIGNvbnRlbnRzLCAxMCwgZG9jKQogCi0gICAgZGVmIGRvY21ldGhvZChzZWxmLCBvYmplY3QsIGZ1bmNzPXt9LCBjbGFzc2VzPXt9LCBtZXRob2RzPXt9LCBjbG5hbWU9JycpOgotICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBtZXRob2Qgb2JqZWN0LiIiIgotICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudCgKLSAgICAgICAgICAgIG9iamVjdC5pbV9mdW5jLCBmdW5jcywgY2xhc3NlcywgbWV0aG9kcywgY2xuYW1lKQotCiAgICAgZGVmIGZvcm1hdHZhbHVlKHNlbGYsIG9iamVjdCk6CiAgICAgICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBkZWZhdWx0IHZhbHVlIGFzIHRleHQuIiIiCiAgICAgICAgIHJldHVybiAoJzxzbWFsbD48Zm9udCBjb2xvcj0iIzkwOTA5MCI+PSVzPC9mb250Pjwvc21hbGw+JyAlCiAgICAgICAgICAgICAgICAgc2VsZi5yZXByKG9iamVjdCkpCiAKLSAgICBkZWYgZG9jZnVuY3Rpb24oc2VsZiwgb2JqZWN0LCBmdW5jcz17fSwgY2xhc3Nlcz17fSwgbWV0aG9kcz17fSwgY2xuYW1lPScnKToKLSAgICAgICAgIiIiUHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgZnVuY3Rpb24gb2JqZWN0LiIiIgotICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBpbnNwZWN0LmdldGFyZ3NwZWMob2JqZWN0KQotICAgICAgICBhcmdzcGVjID0gaW5zcGVjdC5mb3JtYXRhcmdzcGVjKAotICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLCBmb3JtYXR2YWx1ZT1zZWxmLmZvcm1hdHZhbHVlKQotCi0gICAgICAgIGlmIG9iamVjdC5fX25hbWVfXyA9PSAnPGxhbWJkYT4nOgotICAgICAgICAgICAgZGVjbCA9ICc8ZW0+bGFtYmRhPC9lbT4gJyArIGFyZ3NwZWNbMTotMV0KKyAgICBkZWYgZG9jcm91dGluZShzZWxmLCBvYmplY3QsIGZ1bmNzPXt9LCBjbGFzc2VzPXt9LCBtZXRob2RzPXt9LCBjbG5hbWU9JycpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LiIiIgorICAgICAgICBpZiBpbnNwZWN0LmlzbWV0aG9kKG9iamVjdCk6IG9iamVjdCA9IG9iamVjdC5pbV9mdW5jCisgICAgICAgIGlmIGluc3BlY3QuaXNidWlsdGluKG9iamVjdCk6CisgICAgICAgICAgICBkZWNsID0gJzxhIG5hbWU9IiVzIj48c3Ryb25nPiVzPC9zdHJvbmc+KC4uLik8L2E+XG4nICUgKAorICAgICAgICAgICAgICAgIGNsbmFtZSArICctJyArIG9iamVjdC5fX25hbWVfXywgb2JqZWN0Ll9fbmFtZV9fKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgYW5jaG9yID0gY2xuYW1lICsgJy0nICsgb2JqZWN0Ll9fbmFtZV9fCi0gICAgICAgICAgICBkZWNsID0gJzxhIG5hbWU9IiVzIlxuPjxzdHJvbmc+JXM8L3N0cm9uZz4lczwvYT5cbicgJSAoCi0gICAgICAgICAgICAgICAgYW5jaG9yLCBvYmplY3QuX19uYW1lX18sIGFyZ3NwZWMpCisgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBpbnNwZWN0LmdldGFyZ3NwZWMob2JqZWN0KQorICAgICAgICAgICAgYXJnc3BlYyA9IGluc3BlY3QuZm9ybWF0YXJnc3BlYygKKyAgICAgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGZvcm1hdHZhbHVlPXNlbGYuZm9ybWF0dmFsdWUpCisKKyAgICAgICAgICAgIGlmIG9iamVjdC5fX25hbWVfXyA9PSAnPGxhbWJkYT4nOgorICAgICAgICAgICAgICAgIGRlY2wgPSAnPGVtPmxhbWJkYTwvZW0+ICcgKyBhcmdzcGVjWzE6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFuY2hvciA9IGNsbmFtZSArICctJyArIG9iamVjdC5fX25hbWVfXworICAgICAgICAgICAgICAgIGRlY2wgPSAnPGEgbmFtZT0iJXMiXG4+PHN0cm9uZz4lczwvc3Ryb25nPiVzPC9hPlxuJyAlICgKKyAgICAgICAgICAgICAgICAgICAgYW5jaG9yLCBvYmplY3QuX19uYW1lX18sIGFyZ3NwZWMpCiAgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKGdldGRvYyhvYmplY3QpLCBzZWxmLnByZWZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MsIGNsYXNzZXMsIG1ldGhvZHMpCiAgICAgICAgIGRvYyA9IHJlcGxhY2UoZG9jLCAoJzxicj5cbicsICc8L3R0Pjwvc21hbGxcbj48ZGQ+PHNtYWxsPjx0dD4nKSkKICAgICAgICAgZG9jID0gZG9jIGFuZCAnPHR0PiVzPC90dD4nICUgZG9jCiAgICAgICAgIHJldHVybiAnPGRsPjxkdD4lczxkZD48c21hbGw+JXM8L3NtYWxsPjwvZGw+JyAlIChkZWNsLCBkb2MpCiAKLSAgICBkZWYgZG9jYnVpbHRpbihzZWxmLCBvYmplY3QsICpleHRyYXMpOgotICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBidWlsdC1pbiBmdW5jdGlvbi4iIiIKLSAgICAgICAgcmV0dXJuICc8ZGw+PGR0PjxzdHJvbmc+JXM8L3N0cm9uZz4oLi4uKTwvZGw+JyAlIG9iamVjdC5fX25hbWVfXwotCiAgICAgZGVmIHBhZ2Uoc2VsZiwgb2JqZWN0KToKICAgICAgICAgIiIiUHJvZHVjZSBhIGNvbXBsZXRlIEhUTUwgcGFnZSBvZiBkb2N1bWVudGF0aW9uIGZvciBhbiBvYmplY3QuIiIiCi0gICAgICAgIHJldHVybiAnJyc8IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+PHRpdGxlPlB5dGhvbjogJXM8L3RpdGxlPgotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+CisgICAgICAgIHJldHVybiAnJycKKzwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48dGl0bGU+UHl0aG9uOiAlczwvdGl0bGU+PGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiI+CiAlcwogPC9ib2R5PjwvaHRtbD4KICcnJyAlIChkZXNjcmliZShvYmplY3QpLCBzZWxmLmRvY3VtZW50KG9iamVjdCkpCkBAIC03NTcsMzggKzc1MCwyOSBAQAogICAgICAgICBpZiBub3QgY29udGVudHM6IHJldHVybiB0aXRsZSArICdcbicKICAgICAgICAgcmV0dXJuIHRpdGxlICsgJ1xuJyArIHNlbGYuaW5kZW50KHJzdHJpcChjb250ZW50cyksICcgfCAgJykgKyAnXG4nCiAKLSAgICBkZWYgZG9jbWV0aG9kKHNlbGYsIG9iamVjdCk6Ci0gICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIG1ldGhvZCBvYmplY3QuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50KG9iamVjdC5pbV9mdW5jKQotCiAgICAgZGVmIGZvcm1hdHZhbHVlKHNlbGYsIG9iamVjdCk6CiAgICAgICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBkZWZhdWx0IHZhbHVlIGFzIHRleHQuIiIiCiAgICAgICAgIHJldHVybiAnPScgKyBzZWxmLnJlcHIob2JqZWN0KQogCi0gICAgZGVmIGRvY2Z1bmN0aW9uKHNlbGYsIG9iamVjdCk6Ci0gICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bmN0aW9uIG9iamVjdC4iIiIKLSAgICAgICAgdHJ5OgorICAgIGRlZiBkb2Nyb3V0aW5lKHNlbGYsIG9iamVjdCk6CisgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QuIiIiCisgICAgICAgIGlmIGluc3BlY3QuaXNtZXRob2Qob2JqZWN0KTogb2JqZWN0ID0gb2JqZWN0LmltX2Z1bmMKKyAgICAgICAgaWYgaW5zcGVjdC5pc2J1aWx0aW4ob2JqZWN0KToKKyAgICAgICAgICAgIGRlY2wgPSBzZWxmLmJvbGQob2JqZWN0Ll9fbmFtZV9fKSArICcoLi4uKScKKyAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cyA9IGluc3BlY3QuZ2V0YXJnc3BlYyhvYmplY3QpCiAgICAgICAgICAgICBhcmdzcGVjID0gaW5zcGVjdC5mb3JtYXRhcmdzcGVjKAogICAgICAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywgZm9ybWF0dmFsdWU9c2VsZi5mb3JtYXR2YWx1ZSkKLSAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICAgICAgIGFyZ3NwZWMgPSAnKC4uLiknCi0KLSAgICAgICAgaWYgb2JqZWN0Ll9fbmFtZV9fID09ICc8bGFtYmRhPic6Ci0gICAgICAgICAgICBkZWNsID0gJzxsYW1iZGE+ICcgKyBhcmdzcGVjWzE6LTFdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkZWNsID0gc2VsZi5ib2xkKG9iamVjdC5fX25hbWVfXykgKyBhcmdzcGVjCisgICAgICAgICAgICBpZiBvYmplY3QuX19uYW1lX18gPT0gJzxsYW1iZGE+JzoKKyAgICAgICAgICAgICAgICBkZWNsID0gJzxsYW1iZGE+ICcgKyBhcmdzcGVjWzE6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlY2wgPSBzZWxmLmJvbGQob2JqZWN0Ll9fbmFtZV9fKSArIGFyZ3NwZWMKICAgICAgICAgZG9jID0gZ2V0ZG9jKG9iamVjdCkKICAgICAgICAgaWYgZG9jOgogICAgICAgICAgICAgcmV0dXJuIGRlY2wgKyAnXG4nICsgcnN0cmlwKHNlbGYuaW5kZW50KGRvYykpICsgJ1xuJwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIGRlY2wgKyAnXG4nCiAKLSAgICBkZWYgZG9jYnVpbHRpbihzZWxmLCBvYmplY3QpOgotICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QuIiIiCi0gICAgICAgIHJldHVybiAoc2VsZi5ib2xkKG9iamVjdC5fX25hbWVfXykgKyAnKC4uLilcbicgKwotICAgICAgICAgICAgICAgIHJzdHJpcChzZWxmLmluZGVudChvYmplY3QuX19kb2NfXykpICsgJ1xuJykKLQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXNlciBpbnRlcmZhY2VzCiAKIGRlZiBwYWdlcih0ZXh0KToKQEAgLTkxNCw4ICs4OTgsNiBAQAogICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQogICAgIGlmIHR5cGUocGF0aCkgaXMgbm90IHR5cGVzLlN0cmluZ1R5cGU6CiAgICAgICAgIHJldHVybiBOb25lLCBwYXRoCi0gICAgaWYgaGFzYXR0cihfX2J1aWx0aW5zX18sIHBhdGgpOgotICAgICAgICByZXR1cm4gTm9uZSwgZ2V0YXR0cihfX2J1aWx0aW5zX18sIHBhdGgpCiAgICAgcGFydHMgPSBzcGxpdChwYXRoLCAnLicpCiAgICAgbiA9IDEKICAgICB3aGlsZSBuIDw9IGxlbihwYXJ0cyk6CkBAIC05MjQsNyArOTA2LDcgQEAKICAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18ocGF0aCkKICAgICAgICAgICAgIG1vZHVsZSA9IHJlbG9hZChtb2R1bGUpCiAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICMgRGlkIHRoZSBlcnJvciBvY2N1ciBiZWZvcmUgb3IgYWZ0ZXIgd2UgZm91bmQgdGhlIG1vZHVsZT8KKyAgICAgICAgICAgICMgZGV0ZXJtaW5lIGlmIGVycm9yIG9jY3VycmVkIGJlZm9yZSBvciBhZnRlciBtb2R1bGUgd2FzIGZvdW5kCiAgICAgICAgICAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KHBhdGgpOgogICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc3lzLm1vZHVsZXNbcGF0aF0uX19maWxlX18KICAgICAgICAgICAgIGVsaWYgc3lzLmV4Y190eXBlIGlzIFN5bnRheEVycm9yOgpAQCAtOTQyLDYgKzkyNCw4IEBACiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIG4gPSBuICsgMQogICAgICAgICAgICAgY29udGludWUKKyAgICBpZiBoYXNhdHRyKF9fYnVpbHRpbnNfXywgcGF0aCk6CisgICAgICAgIHJldHVybiBOb25lLCBnZXRhdHRyKF9fYnVpbHRpbnNfXywgcGF0aCkKICAgICByZXR1cm4gTm9uZSwgTm9uZQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBpbnRlcmZhY2UKQEAgLTk1NSwxMiArOTM5LDEyIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHBhdGgsIHggPSBsb2NhdGUodGhpbmcpCiAgICAgICAgIGV4Y2VwdCBEb2NJbXBvcnRFcnJvciwgdmFsdWU6Ci0gICAgICAgICAgICBwcmludCAncHJvYmxlbSBpbiAlcyAtICVzJyAlICh2YWx1ZS5maWxlbmFtZSwgdmFsdWUuYXJncykKKyAgICAgICAgICAgIHByaW50ICdQcm9ibGVtIGluICVzIC0gJXMnICUgKHZhbHVlLmZpbGVuYW1lLCB2YWx1ZS5hcmdzKQogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIHg6CiAgICAgICAgICAgICB0aGluZyA9IHgKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICdjb3VsZCBub3QgZmluZCBvciBpbXBvcnQgJXMnICUgcmVwcih0aGluZykKKyAgICAgICAgICAgIHByaW50ICdObyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJXMuJyAlIHJlcHIodGhpbmcpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgIGRlc2MgPSBkZXNjcmliZSh0aGluZykKQEAgLTk2OSwyMCArOTUzLDYgQEAKICAgICAgICAgZGVzYyA9IGRlc2MgKyAnIGluIG1vZHVsZSAnICsgbW9kdWxlLl9fbmFtZV9fCiAgICAgcGFnZXIoJ0hlbHAgb24gJXM6XG5cbicgJSBkZXNjICsgdGV4dC5kb2N1bWVudCh0aGluZykpCiAKLWRlZiB3cml0ZWRvY3MocGF0aCwgcGtncGF0aD0nJyk6Ci0gICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKLSAgICAgICAgZGlyID0gcGF0aAotICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKGRpcik6Ci0gICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgZmlsZSkKLSAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6Ci0gICAgICAgICAgICAgICAgd3JpdGVkb2NzKHBhdGgsIGZpbGUgKyAnLicgKyBwa2dwYXRoKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgd3JpdGVkb2NzKHBhdGgsIHBrZ3BhdGgpCi0gICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgIG1vZG5hbWUgPSBtb2R1bGVuYW1lKHBhdGgpCi0gICAgICAgIGlmIG1vZG5hbWU6Ci0gICAgICAgICAgICB3cml0ZWRvYyhwa2dwYXRoICsgbW9kbmFtZSkKLQogZGVmIHdyaXRlZG9jKGtleSk6CiAgICAgIiIiV3JpdGUgSFRNTCBkb2N1bWVudGF0aW9uIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiIiCiAgICAgcGF0aCwgb2JqZWN0ID0gbG9jYXRlKGtleSkKQEAgLTEwMTUsMzMgKzk4NSw4NyBAQAogICAgICAgICBwYWdlcignXG4nICsgdGl0bGUgKyAnXG5cbicgKyB0ZXh0LmRvY3VtZW50KG9iamVjdCkpCiAgICAgICAgIGZvdW5kID0gMQogICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICdjb3VsZCBub3QgZmluZCBvciBpbXBvcnQgJXMnICUgcmVwcihrZXkpCisgICAgICAgIHByaW50ICdObyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJXMuJyAlIHJlcHIoa2V5KQorCitjbGFzcyBTY2FubmVyOgorICAgICIiIkEgZ2VuZXJpYyB0cmVlIGl0ZXJhdG9yLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290cywgY2hpbGRyZW4sIHJlY3Vyc2UpOgorICAgICAgICBzZWxmLnJvb3RzID0gcm9vdHNbOl0KKyAgICAgICAgc2VsZi5zdGF0ZSA9IFtdCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBjaGlsZHJlbgorICAgICAgICBzZWxmLnJlY3Vyc2UgPSByZWN1cnNlCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdGU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290czoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcm9vdCA9IHNlbGYucm9vdHMucG9wKDApCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gWyhyb290LCBzZWxmLmNoaWxkcmVuKHJvb3QpKV0KKyAgICAgICAgbm9kZSwgY2hpbGRyZW4gPSBzZWxmLnN0YXRlWy0xXQorICAgICAgICBpZiBub3QgY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnN0YXRlLnBvcCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZXh0KCkKKyAgICAgICAgY2hpbGQgPSBjaGlsZHJlbi5wb3AoMCkKKyAgICAgICAgaWYgc2VsZi5yZWN1cnNlKGNoaWxkKToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUuYXBwZW5kKChjaGlsZCwgc2VsZi5jaGlsZHJlbihjaGlsZCkpKQorICAgICAgICByZXR1cm4gY2hpbGQKKworY2xhc3MgTW9kdWxlU2Nhbm5lcihTY2FubmVyKToKKyAgICAiIiJBbiBpbnRlcnJ1cHRpYmxlIHNjYW5uZXIgdGhhdCBzZWFyY2hlcyBtb2R1bGUgc3lub3BzZXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICByb290cyA9IG1hcChsYW1iZGEgZGlyOiAoZGlyLCAnJyksIHBhdGhkaXJzKCkpCisgICAgICAgIFNjYW5uZXIuX19pbml0X18oc2VsZiwgcm9vdHMsIHNlbGYuc3VibW9kdWxlcywgc2VsZi5pc3BhY2thZ2UpCisKKyAgICBkZWYgc3VibW9kdWxlcyhzZWxmLCAoZGlyLCBwYWNrYWdlKSk6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihkaXIpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGZpbGUpCisgICAgICAgICAgICBpZiBpc3BhY2thZ2UocGF0aCk6IAorICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSArIChwYWNrYWdlIGFuZCAnLicpICsgZmlsZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZCgocGF0aCwgcGFja2FnZSkpCisgICAgICAgIGNoaWxkcmVuLnNvcnQoKQorICAgICAgICByZXR1cm4gY2hpbGRyZW4KKworICAgIGRlZiBpc3BhY2thZ2Uoc2VsZiwgKGRpciwgcGFja2FnZSkpOgorICAgICAgICByZXR1cm4gaXNwYWNrYWdlKGRpcikKKworICAgIGRlZiBydW4oc2VsZiwga2V5LCBjYWxsYmFjaywgY29tcGxldGVyPU5vbmUpOgorICAgICAgICBzZWxmLnF1aXQgPSAwCisgICAgICAgIHNlZW4gPSB7fQorCisgICAgICAgIGZvciBtb2RuYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAgICAgICAgIHNlZW5bbW9kbmFtZV0gPSAxCisgICAgICAgICAgICBkZXNjID0gc3BsaXQoX19pbXBvcnRfXyhtb2RuYW1lKS5fX2RvY19fIG9yICcnLCAnXG4nKVswXQorICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwgbG93ZXIoa2V5KSkgPj0gMDoKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhOb25lLCBtb2RuYW1lLCBkZXNjKQorCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICBub2RlID0gc2VsZi5uZXh0KCkKKyAgICAgICAgICAgIGlmIG5vdCBub2RlOiBicmVhaworICAgICAgICAgICAgcGF0aCwgcGFja2FnZSA9IG5vZGUKKyAgICAgICAgICAgIG1vZG5hbWUgPSBtb2R1bGVuYW1lKHBhdGgpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKSBhbmQgbW9kbmFtZToKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gcGFja2FnZSArIChwYWNrYWdlIGFuZCAnLicpICsgbW9kbmFtZQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWVuLmhhc19rZXkobW9kbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNlZW5bbW9kbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBzeW5vcHNpcyhwYXRoKSBvciAnJworICAgICAgICAgICAgICAgICAgICBpZiBmaW5kKGxvd2VyKG1vZG5hbWUgKyAnIC0gJyArIGRlc2MpLCBsb3dlcihrZXkpKSA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYykKKyAgICAgICAgaWYgY29tcGxldGVyOiBjb21wbGV0ZXIoKQogCiBkZWYgYXByb3BvcyhrZXkpOgogICAgICIiIlByaW50IGFsbCB0aGUgb25lLWxpbmUgbW9kdWxlIHN1bW1hcmllcyB0aGF0IGNvbnRhaW4gYSBzdWJzdHJpbmcuIiIiCi0gICAga2V5ID0gbG93ZXIoa2V5KQotICAgIGZvciBtb2R1bGUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotICAgICAgICBkZXNjID0gX19pbXBvcnRfXyhtb2R1bGUpLl9fZG9jX18gb3IgJycKLSAgICAgICAgZGVzYyA9IHNwbGl0KGRlc2MsICdcbicpWzBdCi0gICAgICAgIGlmIGZpbmQobG93ZXIobW9kdWxlICsgJyAnICsgZGVzYyksIGtleSkgPj0gMDoKLSAgICAgICAgICAgIHByaW50IG1vZHVsZSwgJy0nLCBkZXNjIG9yICcobm8gZGVzY3JpcHRpb24pJwotICAgIG1vZHVsZXMgPSBbXQotICAgIGZvciBkaXIgaW4gcGF0aGRpcnMoKToKLSAgICAgICAgZm9yIG1vZHVsZSwgZGVzYyBpbiBpbmRleChkaXIpOgotICAgICAgICAgICAgZGVzYyA9IGRlc2Mgb3IgJycKLSAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gbW9kdWxlczoKLSAgICAgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZChtb2R1bGUpCi0gICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2R1bGUgKyAnICcgKyBkZXNjKSwga2V5KSA+PSAwOgotICAgICAgICAgICAgICAgICAgICBkZXNjID0gZGVzYyBvciAnKG5vIGRlc2NyaXB0aW9uKScKLSAgICAgICAgICAgICAgICAgICAgaWYgbW9kdWxlWy05Ol0gPT0gJy5fX2luaXRfXyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCBtb2R1bGVbOi05XSwgJyhwYWNrYWdlKSAtJywgZGVzYwotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgbW9kdWxlLCAnLScsIGRlc2MKKyAgICBkZWYgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYyk6CisgICAgICAgIGlmIG1vZG5hbWVbLTk6XSA9PSAnLl9faW5pdF9fJzoKKyAgICAgICAgICAgIG1vZG5hbWUgPSBtb2RuYW1lWzotOV0gKyAnIChwYWNrYWdlKScKKyAgICAgICAgcHJpbnQgbW9kbmFtZSwgJy0nLCBkZXNjIG9yICcobm8gZGVzY3JpcHRpb24pJworICAgIE1vZHVsZVNjYW5uZXIoKS5ydW4oa2V5LCBjYWxsYmFjaykKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gd2ViIGJyb3dzZXIgaW50ZXJmYWNlCiAKLWRlZiBzZXJ2ZShhZGRyZXNzLCBjYWxsYmFjaz1Ob25lKToKLSAgICBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIsIG1pbWV0b29scworZGVmIHNlcnZlKHBvcnQsIGNhbGxiYWNrPU5vbmUpOgorICAgIGltcG9ydCBCYXNlSFRUUFNlcnZlciwgbWltZXRvb2xzLCBzZWxlY3QKIAogICAgICMgUGF0Y2ggdXAgbWltZXRvb2xzLk1lc3NhZ2Ugc28gaXQgZG9lc24ndCBicmVhayBpZiByZmM4MjIgaXMgcmVsb2FkZWQuCiAgICAgY2xhc3MgTWVzc2FnZShtaW1ldG9vbHMuTWVzc2FnZSk6CkBAIC0xMDU1LDE0ICsxMDc5LDE2IEBACiAKICAgICBjbGFzcyBEb2NIYW5kbGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgogICAgICAgICBkZWYgc2VuZF9kb2N1bWVudChzZWxmLCB0aXRsZSwgY29udGVudHMpOgotICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKQotICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCi0gICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKAotJycnPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPjx0aXRsZT5QeXRob246ICVzPC90aXRsZT48Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4nJycgJSB0aXRsZSkKLSAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoY29udGVudHMpCi0gICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCc8L2JvZHk+PC9odG1sPicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKKyAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCcnJworPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPjx0aXRsZT5QeXRob246ICVzPC90aXRsZT48Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIj4KKyVzCis8L2JvZHk+PC9odG1sPicnJyAlICh0aXRsZSwgY29udGVudHMpKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6IHBhc3MKIAogICAgICAgICBkZWYgZG9fR0VUKHNlbGYpOgogICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aApAQCAtMTA3MywxOSArMTA5OSwxNyBAQAogICAgICAgICAgICAgICAgICAgICBwLCB4ID0gbG9jYXRlKHBhdGgpCiAgICAgICAgICAgICAgICAgZXhjZXB0IERvY0ltcG9ydEVycm9yLCB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KHBhdGgsIGh0bWwuZXNjYXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2JsZW0gd2l0aCAlcyAtICVzJyAlICh2YWx1ZS5maWxlbmFtZSwgdmFsdWUuYXJncykpKQorICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb2JsZW0gaW4gJXMgLSAlcycgJSAodmFsdWUuZmlsZW5hbWUsIHZhbHVlLmFyZ3MpKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgaWYgeDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KGRlc2NyaWJlKHgpLCBodG1sLmRvY3VtZW50KHgpKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9kb2N1bWVudChwYXRoLAotJ1RoZXJlIGlzIG5vIFB5dGhvbiBtb2R1bGUgb3Igb2JqZWN0IG5hbWVkICIlcyIuJyAlIHBhdGgpCisnTm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVzLicgJSByZXByKHBhdGgpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBoZWFkaW5nID0gaHRtbC5oZWFkaW5nKAotICAgICAgICAgICAgICAgICAgICAnPGJyPjxiaWc+PGJpZz48c3Ryb25nPiZuYnNwOycKLSAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbjogSW5kZXggb2YgTW9kdWxlcycKLSAgICAgICAgICAgICAgICAgICAgJzwvc3Ryb25nPjwvYmlnPjwvYmlnPicsCi0gICAgICAgICAgICAgICAgICAgICcjZmZmZmZmJywgJyM3Nzk5ZWUnKQorJzxiaWc+PGJpZz48c3Ryb25nPlB5dGhvbjogSW5kZXggb2YgTW9kdWxlczwvc3Ryb25nPjwvYmlnPjwvYmlnPicsCisnI2ZmZmZmZicsICcjNzc5OWVlJykKICAgICAgICAgICAgICAgICBidWlsdGlucyA9IFtdCiAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgogICAgICAgICAgICAgICAgICAgICBidWlsdGlucy5hcHBlbmQoJzxhIGhyZWY9IiVzLmh0bWwiPiVzPC9hPicgJSAobmFtZSwgbmFtZSkpCkBAIC0xMDkzLDEwMCArMTExNywyNzUgQEAKICAgICAgICAgICAgICAgICBzZWVuID0ge30KICAgICAgICAgICAgICAgICBmb3IgZGlyIGluIHBhdGhkaXJzKCk6CiAgICAgICAgICAgICAgICAgICAgIGluZGljZXMuYXBwZW5kKGh0bWwuaW5kZXgoZGlyLCBzZWVuKSkKLSAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZG9jdW1lbnQoJ0luZGV4IG9mIE1vZHVsZXMnLCBoZWFkaW5nICsgam9pbihpbmRpY2VzKSkKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IGhlYWRpbmcgKyBqb2luKGluZGljZXMpICsgIiIiPHAgYWxpZ249cmlnaHQ+Cis8c21hbGw+PHNtYWxsPjxmb250IGNvbG9yPSIjOTA5MDkwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48c3Ryb25nPgorcHlkb2M8L3N0cm9uZz4gYnkgS2EtUGluZyBZZWUgJmx0O3BpbmdAbGZ3Lm9yZyZndDs8L2ZvbnQ+PC9zbWFsbD48L3NtYWxsPiIiIgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9kb2N1bWVudCgnSW5kZXggb2YgTW9kdWxlcycsIGNvbnRlbnRzKQogCiAgICAgICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCAqYXJncyk6IHBhc3MKIAogICAgIGNsYXNzIERvY1NlcnZlcihCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKToKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIGNhbGxiYWNrKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIGNhbGxiYWNrKToKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzcyA9ICgnMTI3LjAuMC4xJywgcG9ydCkKKyAgICAgICAgICAgIHNlbGYudXJsID0gJ2h0dHA6Ly8xMjcuMC4wLjE6JWQvJyAlIHBvcnQKICAgICAgICAgICAgIHNlbGYuY2FsbGJhY2sgPSBjYWxsYmFjawotICAgICAgICAgICAgc2VsZi5iYXNlLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIHNlbGYuaGFuZGxlcikKKyAgICAgICAgICAgIHNlbGYuYmFzZS5fX2luaXRfXyhzZWxmLCBzZWxmLmFkZHJlc3MsIHNlbGYuaGFuZGxlcikKKworICAgICAgICBkZWYgc2VydmVfdW50aWxfcXVpdChzZWxmKToKKyAgICAgICAgICAgIGltcG9ydCBzZWxlY3QKKyAgICAgICAgICAgIHNlbGYucXVpdCA9IDAKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXQ6CisgICAgICAgICAgICAgICAgcmQsIHdyLCBleCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc29ja2V0LmZpbGVubygpXSwgW10sIFtdLCAxKQorICAgICAgICAgICAgICAgIGlmIHJkOiBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKIAogICAgICAgICBkZWYgc2VydmVyX2FjdGl2YXRlKHNlbGYpOgogICAgICAgICAgICAgc2VsZi5iYXNlLnNlcnZlcl9hY3RpdmF0ZShzZWxmKQotICAgICAgICAgICAgaWYgc2VsZi5jYWxsYmFjazogc2VsZi5jYWxsYmFjaygpCisgICAgICAgICAgICBpZiBzZWxmLmNhbGxiYWNrOiBzZWxmLmNhbGxiYWNrKHNlbGYpCiAKICAgICBEb2NTZXJ2ZXIuYmFzZSA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIKICAgICBEb2NTZXJ2ZXIuaGFuZGxlciA9IERvY0hhbmRsZXIKICAgICBEb2NIYW5kbGVyLk1lc3NhZ2VDbGFzcyA9IE1lc3NhZ2UKICAgICB0cnk6Ci0gICAgICAgIERvY1NlcnZlcihhZGRyZXNzLCBjYWxsYmFjaykuc2VydmVfZm9yZXZlcigpCisgICAgICAgIERvY1NlcnZlcihwb3J0LCBjYWxsYmFjaykuc2VydmVfdW50aWxfcXVpdCgpCisgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgc2VsZWN0LmVycm9yKToKKyAgICAgICAgcGFzcworICAgIHByaW50ICdzZXJ2ZXIgc3RvcHBlZCcKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBncmFwaGljYWwgaW50ZXJmYWNlCisKK2RlZiBndWkoKToKKyAgICAiIiJHcmFwaGljYWwgaW50ZXJmYWNlIChzdGFydHMgd2ViIHNlcnZlciBhbmQgcG9wcyB1cCBhIGNvbnRyb2wgd2luZG93KS4iIiIKKyAgICBjbGFzcyBHVUk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aW5kb3csIHBvcnQ9NzQ2NCk6CisgICAgICAgICAgICBzZWxmLndpbmRvdyA9IHdpbmRvdworICAgICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLnNjYW5uZXIgPSBOb25lCisKKyAgICAgICAgICAgIGltcG9ydCBUa2ludGVyCisgICAgICAgICAgICBzZWxmLnNlcnZlcl9mcm0gPSBUa2ludGVyLkZyYW1lKHdpbmRvdykKKyAgICAgICAgICAgIHNlbGYudGl0bGVfbGJsID0gVGtpbnRlci5MYWJlbChzZWxmLnNlcnZlcl9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0nU3RhcnRpbmcgc2VydmVyLi4uXG4gJykKKyAgICAgICAgICAgIHNlbGYub3Blbl9idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnNlcnZlcl9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0nb3BlbiBicm93c2VyJywgY29tbWFuZD1zZWxmLm9wZW4sIHN0YXRlPSdkaXNhYmxlZCcpCisgICAgICAgICAgICBzZWxmLnF1aXRfYnRuID0gVGtpbnRlci5CdXR0b24oc2VsZi5zZXJ2ZXJfZnJtLAorICAgICAgICAgICAgICAgIHRleHQ9J3F1aXQgc2VydmluZycsIGNvbW1hbmQ9c2VsZi5xdWl0LCBzdGF0ZT0nZGlzYWJsZWQnKQorCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9mcm0gPSBUa2ludGVyLkZyYW1lKHdpbmRvdykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibCA9IFRraW50ZXIuTGFiZWwoc2VsZi5zZWFyY2hfZnJtLCB0ZXh0PSdTZWFyY2ggZm9yJykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudCA9IFRraW50ZXIuRW50cnkoc2VsZi5zZWFyY2hfZnJtKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZW50LmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5zZWFyY2gpCisgICAgICAgICAgICBzZWxmLnN0b3BfYnRuID0gVGtpbnRlci5CdXR0b24oc2VsZi5zZWFyY2hfZnJtLAorICAgICAgICAgICAgICAgIHRleHQ9J3N0b3AnLCBwYWR5PTAsIGNvbW1hbmQ9c2VsZi5zdG9wLCBzdGF0ZT0nZGlzYWJsZWQnKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICAgICAgIyBBdHRlbXB0aW5nIHRvIGhpZGUgYW5kIHNob3cgdGhpcyBidXR0b24gY3Jhc2hlcyB1bmRlciBXaW5kb3dzLgorICAgICAgICAgICAgICAgIHNlbGYuc3RvcF9idG4ucGFjayhzaWRlPSdyaWdodCcpCisKKyAgICAgICAgICAgIHNlbGYud2luZG93LnRpdGxlKCdweWRvYycpCisgICAgICAgICAgICBzZWxmLndpbmRvdy5wcm90b2NvbCgnV01fREVMRVRFX1dJTkRPVycsIHNlbGYucXVpdCkKKyAgICAgICAgICAgIHNlbGYudGl0bGVfbGJsLnBhY2soc2lkZT0ndG9wJywgZmlsbD0neCcpCisgICAgICAgICAgICBzZWxmLm9wZW5fYnRuLnBhY2soc2lkZT0nbGVmdCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYucXVpdF9idG4ucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2ZybS5wYWNrKHNpZGU9J3RvcCcsIGZpbGw9J3gnKQorCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwucGFjayhzaWRlPSdsZWZ0JykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZnJtLnBhY2soc2lkZT0ndG9wJywgZmlsbD0neCcpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQuZm9jdXNfc2V0KCkKKworICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0ID0gVGtpbnRlci5MaXN0Ym94KHdpbmRvdywgCisgICAgICAgICAgICAgICAgZm9udD0oJ2hlbHZldGljYScsIDgpLCBoZWlnaHQ9NikKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC5iaW5kKCc8QnV0dG9uLTE+Jywgc2VsZi5zZWxlY3QpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuYmluZCgnPERvdWJsZS1CdXR0b24tMT4nLCBzZWxmLmdvdG8pCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9zY3IgPSBUa2ludGVyLlNjcm9sbGJhcih3aW5kb3csCisgICAgICAgICAgICAgICAgb3JpZW50PSd2ZXJ0aWNhbCcsIGNvbW1hbmQ9c2VsZi5yZXN1bHRfbHN0Lnl2aWV3KQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zZWxmLnJlc3VsdF9zY3Iuc2V0KQorCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0gPSBUa2ludGVyLkZyYW1lKHdpbmRvdykKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJlc3VsdF9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0nZ28gdG8gc2VsZWN0ZWQnLCBjb21tYW5kPXNlbGYuZ290bykKKyAgICAgICAgICAgIHNlbGYuaGlkZV9idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJlc3VsdF9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0naGlkZSByZXN1bHRzJywgY29tbWFuZD1zZWxmLmhpZGUpCisgICAgICAgICAgICBzZWxmLmdvdG9fYnRuLnBhY2soc2lkZT0nbGVmdCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYuaGlkZV9idG4ucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKworICAgICAgICAgICAgc2VsZi53aW5kb3cudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYubWlud2lkdGggPSBzZWxmLndpbmRvdy53aW5mb193aWR0aCgpCisgICAgICAgICAgICBzZWxmLm1pbmhlaWdodCA9IHNlbGYud2luZG93LndpbmZvX2hlaWdodCgpCisgICAgICAgICAgICBzZWxmLmJpZ21pbmhlaWdodCA9IChzZWxmLnNlcnZlcl9mcm0ud2luZm9fcmVxaGVpZ2h0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWFyY2hfZnJtLndpbmZvX3JlcWhlaWdodCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC53aW5mb19yZXFoZWlnaHQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0ud2luZm9fcmVxaGVpZ2h0KCkpCisgICAgICAgICAgICBzZWxmLmJpZ3dpZHRoLCBzZWxmLmJpZ2hlaWdodCA9IHNlbGYubWlud2lkdGgsIHNlbGYuYmlnbWluaGVpZ2h0CisgICAgICAgICAgICBzZWxmLmV4cGFuZGVkID0gMAorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fZ2VvbWV0cnkoJyVkeCVkJyAlIChzZWxmLm1pbndpZHRoLCBzZWxmLm1pbmhlaWdodCkpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9taW5zaXplKHNlbGYubWlud2lkdGgsIHNlbGYubWluaGVpZ2h0KQorCisgICAgICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZSwgYXJncz0ocG9ydCwgc2VsZi5yZWFkeSkpLnN0YXJ0KCkKKworICAgICAgICBkZWYgcmVhZHkoc2VsZiwgc2VydmVyKToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgICAgICBzZWxmLnRpdGxlX2xibC5jb25maWcoCisgICAgICAgICAgICAgICAgdGV4dD0nUHl0aG9uIGRvY3VtZW50YXRpb24gc2VydmVyIGF0XG4nICsgc2VydmVyLnVybCkKKyAgICAgICAgICAgIHNlbGYub3Blbl9idG4uY29uZmlnKHN0YXRlPSdub3JtYWwnKQorICAgICAgICAgICAgc2VsZi5xdWl0X2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisKKyAgICAgICAgZGVmIG9wZW4oc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgICAgICAgICAgd2ViYnJvd3Nlci5vcGVuKHNlbGYuc2VydmVyLnVybCkKKworICAgICAgICBkZWYgcXVpdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnF1aXQgPSAxCisgICAgICAgICAgICBzZWxmLndpbmRvdy5xdWl0KCkKKworICAgICAgICBkZWYgc2VhcmNoKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAga2V5ID0gc2VsZi5zZWFyY2hfZW50LmdldCgpCisgICAgICAgICAgICBzZWxmLnN0b3BfYnRuLnBhY2soc2lkZT0ncmlnaHQnKQorICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwuY29uZmlnKHRleHQ9J1NlYXJjaGluZyBmb3IgIiVzIi4uLicgJSBrZXkpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQuZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5wYWNrKHNpZGU9J2xlZnQnKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4uY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCisgICAgICAgICAgICBzZWxmLmV4cGFuZCgpCisKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgICAgIGlmIHNlbGYuc2Nhbm5lcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNjYW5uZXIucXVpdCA9IDEKKyAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE1vZHVsZVNjYW5uZXIoKQorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zY2FubmVyLnJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oa2V5LCBzZWxmLnVwZGF0ZSwgc2VsZi5kb25lKSkuc3RhcnQoKQorCisgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgcGF0aCwgbW9kbmFtZSwgZGVzYyk6CisgICAgICAgICAgICBpZiBtb2RuYW1lWy05Ol0gPT0gJy5fX2luaXRfXyc6CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG1vZG5hbWVbOi05XSArICcgKHBhY2thZ2UpJworICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0Lmluc2VydCgnZW5kJywKKyAgICAgICAgICAgICAgICBtb2RuYW1lICsgJyAtICcgKyAoZGVzYyBvciAnKG5vIGRlc2NyaXB0aW9uKScpKQorCisgICAgICAgIGRlZiBzdG9wKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5zY2FubmVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbm5lci5xdWl0ID0gMQorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE5vbmUKKworICAgICAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5jb25maWcodGV4dD0nU2VhcmNoIGZvcicpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwucGFjayhzaWRlPSdsZWZ0JykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6IHNlbGYuc3RvcF9idG4uZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuc3RvcF9idG4uY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCisKKyAgICAgICAgZGVmIHNlbGVjdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4uY29uZmlnKHN0YXRlPSdub3JtYWwnKQorCisgICAgICAgIGRlZiBnb3RvKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5yZXN1bHRfbHN0LmN1cnNlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBzZWxlY3Rpb246CisgICAgICAgICAgICAgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gc3BsaXQoc2VsZi5yZXN1bHRfbHN0LmdldChzZWxlY3Rpb25bMF0pKVswXQorICAgICAgICAgICAgICAgIHdlYmJyb3dzZXIub3BlbihzZWxmLnNlcnZlci51cmwgKyBtb2RuYW1lICsgJy5odG1sJykKKworICAgICAgICBkZWYgY29sbGFwc2Uoc2VsZik6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5leHBhbmRlZDogcmV0dXJuCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0uZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X3Njci5mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmZvcmdldCgpCisgICAgICAgICAgICBzZWxmLmJpZ3dpZHRoID0gc2VsZi53aW5kb3cud2luZm9fd2lkdGgoKQorICAgICAgICAgICAgc2VsZi5iaWdoZWlnaHQgPSBzZWxmLndpbmRvdy53aW5mb19oZWlnaHQoKQorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fZ2VvbWV0cnkoJyVkeCVkJyAlIChzZWxmLm1pbndpZHRoLCBzZWxmLm1pbmhlaWdodCkpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9taW5zaXplKHNlbGYubWlud2lkdGgsIHNlbGYubWluaGVpZ2h0KQorICAgICAgICAgICAgc2VsZi5leHBhbmRlZCA9IDAKKworICAgICAgICBkZWYgZXhwYW5kKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5leHBhbmRlZDogcmV0dXJuCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0ucGFjayhzaWRlPSdib3R0b20nLCBmaWxsPSd4JykKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X3Njci5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neScpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QucGFjayhzaWRlPSd0b3AnLCBmaWxsPSdib3RoJywgZXhwYW5kPTEpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9nZW9tZXRyeSgnJWR4JWQnICUgKHNlbGYuYmlnd2lkdGgsIHNlbGYuYmlnaGVpZ2h0KSkKKyAgICAgICAgICAgIHNlbGYud2luZG93LndtX21pbnNpemUoc2VsZi5taW53aWR0aCwgc2VsZi5iaWdtaW5oZWlnaHQpCisgICAgICAgICAgICBzZWxmLmV4cGFuZGVkID0gMQorCisgICAgICAgIGRlZiBoaWRlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgICAgIHNlbGYuY29sbGFwc2UoKQorCisgICAgaW1wb3J0IFRraW50ZXIKKyAgICB0cnk6CisgICAgICAgIGd1aSA9IEdVSShUa2ludGVyLlRrKCkpCisgICAgICAgIFRraW50ZXIubWFpbmxvb3AoKQogICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQgJ3NlcnZlciBzdG9wcGVkJworICAgICAgICBwYXNzCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29tbWFuZC1saW5lIGludGVyZmFjZQogCiBkZWYgY2xpKCk6CisgICAgIiIiQ29tbWFuZC1saW5lIGludGVyZmFjZSAobG9va3MgYXQgc3lzLmFyZ3YgdG8gZGVjaWRlIHdoYXQgdG8gZG8pLiIiIgogICAgIGltcG9ydCBnZXRvcHQKICAgICBjbGFzcyBCYWRVc2FnZTogcGFzcwogCiAgICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdrOnA6dycpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ21hYycsICd3aW4nLCAnd2luMzInLCAnbnQnXSBhbmQgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgICAgICMgQ0xJLWxlc3MgcGxhdGZvcm1zCisgICAgICAgICAgICBndWkoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnZ2s6cDp3JykKICAgICAgICAgd3JpdGluZyA9IDAKIAogICAgICAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKKyAgICAgICAgICAgIGlmIG9wdCA9PSAnLWcnOgorICAgICAgICAgICAgICAgIGd1aSgpCisgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBpZiBvcHQgPT0gJy1rJzoKLSAgICAgICAgICAgICAgICBhcHJvcG9zKGxvd2VyKHZhbCkpCi0gICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBhcHJvcG9zKHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgIGlmIG9wdCA9PSAnLXAnOgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludCh2YWwpCiAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFVzYWdlCi0gICAgICAgICAgICAgICAgZGVmIHJlYWR5KHBvcnQ9cG9ydCk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICdzZXJ2ZXIgcmVhZHkgYXQgaHR0cDovLzEyNy4wLjAuMTolZC8nICUgcG9ydAotICAgICAgICAgICAgICAgIHNlcnZlKCgnMTI3LjAuMC4xJywgcG9ydCksIHJlYWR5KQotICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZGVmIHJlYWR5KHNlcnZlcik6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdzZXJ2ZXIgcmVhZHkgYXQgJXMnICUgc2VydmVyLnVybAorICAgICAgICAgICAgICAgIHNlcnZlKHBvcnQsIHJlYWR5KQorICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgaWYgb3B0ID09ICctdyc6Ci0gICAgICAgICAgICAgICAgaWYgbm90IGFyZ3M6IHJhaXNlIEJhZFVzYWdlCiAgICAgICAgICAgICAgICAgd3JpdGluZyA9IDEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGFyZ3M6Ci0gICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShhcmcpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGltcG9ydGZpbGUoYXJnKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgd3JpdGluZzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGFyZyk6IHdyaXRlZG9jcyhhcmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogd3JpdGVkb2MoYXJnKQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogbWFuKGFyZykKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IERvY0ltcG9ydEVycm9yLCB2YWx1ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdwcm9ibGVtIGluICVzIC0gJXMnICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmZpbGVuYW1lLCB2YWx1ZS5hcmdzKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gWydtYWMnLCAnd2luJywgJ3dpbjMyJywgJ250J106Ci0gICAgICAgICAgICAgICAgICAgICMgR1VJIHBsYXRmb3JtcyB3aXRoIHRocmVhZGluZwotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCi0gICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gdGhyZWFkaW5nLkV2ZW50KCkKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9ICgnMTI3LjAuMC4xJywgMTIzNDYpCi0gICAgICAgICAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9c2VydmUsIGFyZ3M9KGFkZHJlc3MsIHJlYWR5LnNldCkpLnN0YXJ0KCkKLSAgICAgICAgICAgICAgICAgICAgcmVhZHkud2FpdCgpCi0gICAgICAgICAgICAgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCi0gICAgICAgICAgICAgICAgICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovLzEyNy4wLjAuMToxMjM0Ni8nKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFVzYWdlCisKKyAgICAgICAgaWYgbm90IGFyZ3M6IHJhaXNlIEJhZFVzYWdlCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBmaW5kKGFyZywgb3Muc2VwKSA+PSAwIGFuZCBvcy5wYXRoLmlzZmlsZShhcmcpOgorICAgICAgICAgICAgICAgICAgICBhcmcgPSBpbXBvcnRmaWxlKGFyZykKKyAgICAgICAgICAgICAgICBpZiB3cml0aW5nOiB3cml0ZWRvYyhhcmcpCisgICAgICAgICAgICAgICAgZWxzZTogbWFuKGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBEb2NJbXBvcnRFcnJvciwgdmFsdWU6CisgICAgICAgICAgICAgICAgcHJpbnQgJ1Byb2JsZW0gaW4gJXMgLSAlcycgJSAodmFsdWUuZmlsZW5hbWUsIHZhbHVlLmFyZ3MpCiAKICAgICBleGNlcHQgKGdldG9wdC5lcnJvciwgQmFkVXNhZ2UpOgotICAgICAgICBwcmludCAiIiIlcyA8bmFtZT4gLi4uCi0gICAgU2hvdyBkb2N1bWVudGF0aW9uIG9uIHNvbWV0aGluZy4KLSAgICA8bmFtZT4gbWF5IGJlIHRoZSBuYW1lIG9mIGEgUHl0aG9uIGZ1bmN0aW9uLCBtb2R1bGUsIG9yIHBhY2thZ2UsCi0gICAgb3IgYSBkb3R0ZWQgcmVmZXJlbmNlIHRvIGEgY2xhc3Mgb3IgZnVuY3Rpb24gd2l0aGluIGEgbW9kdWxlIG9yCi0gICAgbW9kdWxlIGluIGEgcGFja2FnZSwgb3IgdGhlIGZpbGVuYW1lIG9mIGEgUHl0aG9uIG1vZHVsZSB0byBpbXBvcnQuCisgICAgICAgIGNtZCA9IHN5cy5hcmd2WzBdCisgICAgICAgIHByaW50ICIiInB5ZG9jIC0gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIHRvb2wKKworJXMgPG5hbWU+IC4uLgorICAgIFNob3cgdGV4dCBkb2N1bWVudGF0aW9uIG9uIHNvbWV0aGluZy4gIDxuYW1lPiBtYXkgYmUgdGhlIG5hbWUgb2YgYQorICAgIGZ1bmN0aW9uLCBtb2R1bGUsIG9yIHBhY2thZ2UsIG9yIGEgZG90dGVkIHJlZmVyZW5jZSB0byBhIGNsYXNzIG9yCisgICAgZnVuY3Rpb24gd2l0aGluIGEgbW9kdWxlIG9yIG1vZHVsZSBpbiBhIHBhY2thZ2UuICBJZiA8bmFtZT4gY29udGFpbnMKKyAgICBhICclcycsIGl0IGlzIHVzZWQgYXMgdGhlIHBhdGggdG8gYSBQeXRob24gc291cmNlIGZpbGUgdG8gZG9jdW1lbnQuCiAKICVzIC1rIDxrZXl3b3JkPgotICAgIFNlYXJjaCBmb3IgYSBrZXl3b3JkIGluIHRoZSBzeW5vcHNpcyBsaW5lcyBvZiBhbGwgbW9kdWxlcy4KKyAgICBTZWFyY2ggZm9yIGEga2V5d29yZCBpbiB0aGUgc3lub3BzaXMgbGluZXMgb2YgYWxsIGF2YWlsYWJsZSBtb2R1bGVzLgogCiAlcyAtcCA8cG9ydD4KICAgICBTdGFydCBhbiBIVFRQIHNlcnZlciBvbiB0aGUgZ2l2ZW4gcG9ydCBvbiB0aGUgbG9jYWwgbWFjaGluZS4KIAotJXMgLXcgPG1vZHVsZT4gLi4uCi0gICAgV3JpdGUgb3V0IHRoZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlIHRvIGEgZmlsZS4KKyVzIC1nCisgICAgUG9wIHVwIGEgZ3JhcGhpY2FsIGludGVyZmFjZSBmb3Igc2VydmluZyBhbmQgZmluZGluZyBkb2N1bWVudGF0aW9uLgogCi0lcyAtdyA8bW9kdWxlZGlyPgotICAgIFdyaXRlIG91dCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhbGwgbW9kdWxlcyBpbiB0aGUgdHJlZQotICAgIHVuZGVyIGEgZ2l2ZW4gZGlyZWN0b3J5IHRvIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSIiIiAlICgoc3lzLmFyZ3ZbMF0sKSAqIDUpCislcyAtdyA8bmFtZT4gLi4uCisgICAgV3JpdGUgb3V0IHRoZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudAorICAgIGRpcmVjdG9yeS4gIElmIDxuYW1lPiBjb250YWlucyBhICclcycsIGl0IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4KKyIiIiAlIChjbWQsIG9zLnNlcCwgY21kLCBjbWQsIGNtZCwgY21kLCBvcy5zZXApCiAKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgY2xpKCkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6IGNsaSgpCisKKwo=