-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuniversal_decoder_updated.py
More file actions
1 lines (1 loc) 路 72.3 KB
/
Copy pathuniversal_decoder_updated.py
File metadata and controls
1 lines (1 loc) 路 72.3 KB
1
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKVW5pdmVyc2FsIFB5dGhvbiBPYmZ1c2NhdGlvbiBEZWNvZGVyCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIG1vc3QgY29tcHJlaGVuc2l2ZSBQeXRob24gZGVvYmZ1c2NhdGlvbiB0b29sLiBIYW5kbGVzIGRlZXBseSBuZXN0ZWQsCm11bHRpLWxheWVyIG9iZnVzY2F0aW9uIGNoYWlucyBpbmNsdWRpbmcgZW5jcnlwdGlvbiwgY29tcHJlc3Npb24sIG1hcnNoYWxsaW5nLAphbmQgY3VzdG9tIGVuY29kZXJzLgoKU3VwcG9ydGVkIHRlY2huaXF1ZXM6CiAgLSBSZXZlcnNlZCBoZXggZXhlYyAoQUlaRU4vWDlTVkUgZW5jb2RlcikKICAtIERpcmVjdCBoZXggZXhlYwogIC0gQmFzZTY0IGV4ZWMgKGlubGluZSBhbmQgdmFyaWFibGUtYmFzZWQpCiAgLSBMYW1iZGEgSUlGRSB3cmFwcGVycyAoZS5nLiAobGFtYmRhOiAnYjY0Li4uJykoKSB3aXRoIGZpbGUgd3JpdGUgKyBleGVjKQogIC0gUEJLREYyICsgWE9SIGVuY3J5cHRlZCBwYXlsb2FkcyAoTEVFRVVOSlUtc3R5bGUpCiAgLSBleGVjKHpsaWIuZGVjb21wcmVzcyhiJy4uLicpKQogIC0gZXhlYyhtYXJzaGFsLmxvYWRzKGInLi4uJykpIHdpdGggbmVzdGVkIHBheWxvYWQgZXh0cmFjdGlvbgogIC0gTWFyc2hhbCBjb2RlIG9iamVjdHMgd2l0aCBlbWJlZGRlZCBiYXNlNjQvemxpYi9YT1IgZGF0YQogIC0gVW5pY29kZSBzdGVnYW5vZ3JhcGh5IC8gaW50ZXJsZWF2ZWQta2V5IFhPUiAoTEVFRVVOSlVfZGVvYmZ1c2NhdGUpCiAgLSBleGVjKGNvbXBpbGUoLi4uKSkgd3JhcHBlcnMKICAtIGNocigpIGxpc3QgZXhlYwogIC0gZXZhbCgpIHdyYXBwZXJzCiAgLSBNdWx0aS1zdGVwIHRyYW5zZm9ybWF0aW9uIGNoYWlucyAoYmFzZTY0ICsgWE9SICsgcmV2ZXJzZSArIHpsaWIgKyBtYXJzaGFsKQogIC0gVmFyaWFibGUgY29uY2F0ZW5hdGlvbiBwYXR0ZXJucyAodmFyMSArIHZhcjIgKyAuLi4gPSBwYXlsb2FkKQogIC0gU2FmZSBzaW11bGF0aW9uIG9mIGRlY29kaW5nIGZ1bmN0aW9ucyAoaW50ZXJjZXB0cyBleGVjL21hcnNoYWwubG9hZHMpCiAgLSBNYXJzaGFsIGNvZGUgb2JqZWN0IGFuYWx5c2lzIChmdW5jdGlvbiBzaWduYXR1cmVzLCBzdHJpbmdzLCBzdHJ1Y3R1cmUpCiAgLSBTVEVJTi1zdHlsZSBtdWx0aS1wYXlsb2FkIGI4NStiejIremxpYiBjaGFpbnMgKHNwbGl0IGFjcm9zcyBtYW55IGInLi4uJyB2YXJzKQogIC0gWE9SLWxhbWJkYSBvYmZ1c2NhdGVkIGlkZW50aWZpZXJzICgobGFtYmRhIHgsczonJy5qb2luKGNocihjXngpZm9yIGMgaW4gcykpKEssW2J5dGVzXSkpCiAgLSAqKkBrb3pweSBvYmZ1c2NhdG9yKio6IGV4ZWMoYmFzZTY0LmI2NGRlY29kZSguLi4pKSB3cmFwcGluZyByZXZlcnNlZCtYT1Igc291cmNlIHdpdGgKICAgIDIwLWJ5dGUgcmVwZWF0aW5nIGtleSAoYidrb3pweXRvb2xza296Y29kZWxhYicpIGFuZCBzY2F0dGVyZWQganVuayBoaWdoIGJ5dGVzCiAgLSBNdWx0aS1sYXllciBhdXRvLXBlZWxpbmcgKHVubGltaXRlZCBkZXB0aCkKICAtICoqVW5pdmVyc2FsIHNhbmRib3hlZC1leGVjdXRpb24gZmFsbGJhY2sqKjogaGFuZGxlcyBBTlkgb2JmdXNjYXRpb24gY2hhaW4KICAgIChjdXN0b20gY2lwaGVycywgdW5rbm93biBlbmNvZGluZ3MsIG5vdmVsIHBhdHRlcm5zKSBieSBpbnRlcmNlcHRpbmcKICAgIGV4ZWMvZXZhbC9jb21waWxlL21hcnNoYWwubG9hZHMgd2hpbGUgYmxvY2tpbmcgZGFuZ2Vyb3VzIHNpZGUgZWZmZWN0cwogIC0gRW1iZWRkZWQgbmF0aXZlIGJpbmFyeSBwYXlsb2FkIGV4dHJhY3Rpb24gKHRhci54eiwgYnoyLCB6aXAsIEVMRiwgUEUpCiAgLSBDeXRob24gMy4wKyBgQ1lUSE9OX0NPTVBSRVNTX1NUUklOR1NgIGJsb2IgZXh0cmFjdGlvbiAoZGVjb21waWxlcyBjb21waWxlZCAuc28vLmV4ZSBzdHJpbmcgdGFibGVzKQogIC0gUHlJbnN0YWxsZXIgYnVuZGxlIGRldGVjdGlvbgogIC0gT3V0cHV0IHByZXR0eS1wcmludGluZyAoYXN0LnVucGFyc2UpIGZvciBtaW5pZmllZCBvbmUtbGluZSBvdXRwdXRzCgpVc2FnZToKICAgIHB5dGhvbiB1bml2ZXJzYWxfZGVjb2Rlci5weSA8ZW5jb2RlZF9maWxlPiBbLW8gb3V0cHV0X2ZpbGVdIFstLW1heC1sYXllcnMgTl0gWy12XQoiIiIKCmltcG9ydCBhcmdwYXJzZQppbXBvcnQgYXN0CmltcG9ydCBiYXNlNjQKaW1wb3J0IGJ6MgppbXBvcnQgZ3ppcAppbXBvcnQgaGFzaGxpYgppbXBvcnQgaG1hYwppbXBvcnQgbHptYQppbXBvcnQgbWFyc2hhbAppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IHR5cGVzCmltcG9ydCB6bGliCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojICBVdGlsaXR5IGhlbHBlcnMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX3NhZmVfbGl0ZXJhbF9ldmFsKGRhdGE6IGJ5dGVzKSAtPiBvYmplY3Q6CiAgICAiIiJQYXJzZSBhIFB5dGhvbiBieXRlcy9zdHJpbmcgbGl0ZXJhbCBmcm9tIHJhdyBmaWxlIGJ5dGVzLiIiIgogICAgcmV0dXJuIGFzdC5saXRlcmFsX2V2YWwoZGF0YS5kZWNvZGUoImxhdGluLTEiKSkKCgpkZWYgX3N0cmlwX2xlYWRpbmdfanVuayhkYXRhOiBieXRlcywgbWFya2VyOiBieXRlcyA9IGIiaW1wb3J0ICIpIC0+IGJ5dGVzOgogICAgIiIiUmVtb3ZlIHVwIHRvIDEwMCBnYXJiYWdlIGJ5dGVzIGJlZm9yZSB0aGUgZmlyc3QgJ2ltcG9ydCAnIGtleXdvcmQuIiIiCiAgICBpZHggPSBkYXRhLmZpbmQobWFya2VyKQogICAgaWYgMCA8IGlkeCA8IDEwMDoKICAgICAgICByZXR1cm4gZGF0YVtpZHg6XQogICAgcmV0dXJuIGRhdGEKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgTEVFRVVOSlUgZW5jcnlwdGlvbiBoZWxwZXJzIChQQktERjIgKyBITUFDLUNUUiBYT1IpCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIF9wYmtkZjIocHc6IHN0ciwgc2FsdDogYnl0ZXMsIGl0czogaW50ID0gMTAwMDAwKSAtPiBieXRlczoKICAgIHJldHVybiBoYXNobGliLnBia2RmMl9obWFjKCJzaGEyNTYiLCBwdy5lbmNvZGUoKSwgc2FsdCwgaXRzLCBka2xlbj0zMikKCgpkZWYgX2htYWNfa2V5c3RyZWFtKGtleTogYnl0ZXMsIG46IGludCkgLT4gYnl0ZXM6CiAgICBvdXQgPSBiIiIKICAgIGJsayA9IDAKICAgIHdoaWxlIGxlbihvdXQpIDwgbjoKICAgICAgICBjdHIgPSBibGsudG9fYnl0ZXMoOCwgImJpZyIpCiAgICAgICAgb3V0ICs9IGhtYWMubmV3KGtleSwgY3RyLCBoYXNobGliLnNoYTI1NikuZGlnZXN0KCkKICAgICAgICBibGsgKz0gMQogICAgcmV0dXJuIG91dFs6bl0KCgpkZWYgX3hvcl9kZWNyeXB0KGRhdGE6IGJ5dGVzLCBrZXk6IGJ5dGVzKSAtPiBieXRlczoKICAgIGtzID0gX2htYWNfa2V5c3RyZWFtKGtleSwgbGVuKGRhdGEpKQogICAgcmV0dXJuIGJ5dGVzKGEgXiBiIGZvciBhLCBiIGluIHppcChkYXRhLCBrcykpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIExFRUVVTkpVIFVuaWNvZGUgc3RlZ2Fub2dyYXBoeSAoaW50ZXJsZWF2ZWQta2V5IFhPUikKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX2xlZWV1bmp1X2Rlb2JmdXNjYXRlKGRhdGFfd2l0aF9rZXk6IHN0cikgLT4gc3RyOgogICAgaGFsZiA9IGxlbihkYXRhX3dpdGhfa2V5KSAvLyAyCiAgICBlbmNyeXB0ZWRfdGV4dCA9ICIiLmpvaW4oZGF0YV93aXRoX2tleVtpICogMl0gZm9yIGkgaW4gcmFuZ2UoaGFsZikpCiAgICBrZXkgPSAiIi5qb2luKGRhdGFfd2l0aF9rZXlbaSAqIDIgKyAxXSBmb3IgaSBpbiByYW5nZShoYWxmKSkKICAgIHJldHVybiAiIi5qb2luKAogICAgICAgIGNocihvcmQoYykgXiBvcmQoa2V5W2kgJSBsZW4oa2V5KV0pKQogICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShlbmNyeXB0ZWRfdGV4dCkKICAgICkKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgQmluYXJ5LWxldmVsIGRlY29kZXJzICh3b3JrIG9uIHJhdyBieXRlcykKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgX3RyeV9iaW5hcnlfZXhlY19wYXR0ZXJucyhkYXRhOiBieXRlcyk6CiAgICAiIiIKICAgIEhhbmRsZXMgcGF0dGVybnMgbGlrZToKICAgICAgaW1wb3J0IHpsaWJcXG5leGVjKHpsaWIuZGVjb21wcmVzcyhiJy4uLicpKQogICAgICBpbXBvcnQgbWFyc2hhbFxcbmV4ZWMobWFyc2hhbC5sb2FkcyhiJy4uLicpKQogICAgICBpbXBvcnQgYmFzZTY0XFxuZXhlYyhiYXNlNjQuYjY0ZGVjb2RlKGInLi4uJykpCiAgICBSZXR1cm5zIChkZWNvZGVkX2J5dGVzLCBkZXNjcmlwdGlvbikgb3IgTm9uZS4KICAgICIiIgogICAgZGF0YSA9IF9zdHJpcF9sZWFkaW5nX2p1bmsoZGF0YSkKCiAgICBwYXR0ZXJucyA9IFsKICAgICAgICAoYiJpbXBvcnQgemxpYlxuZXhlYyh6bGliLmRlY29tcHJlc3MoIiwgInpsaWIuZGVjb21wcmVzcyIpLAogICAgICAgIChiImltcG9ydCBtYXJzaGFsXG5leGVjKG1hcnNoYWwubG9hZHMoIiwgIm1hcnNoYWwubG9hZHMiKSwKICAgICAgICAoYiJpbXBvcnQgYmFzZTY0XG5leGVjKGJhc2U2NC5iNjRkZWNvZGUoIiwgImJhc2U2NC5iNjRkZWNvZGUiKSwKICAgIF0KCiAgICBmb3IgcHJlZml4LCBkZXNjIGluIHBhdHRlcm5zOgogICAgICAgIGlmIG5vdCBkYXRhLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgY29udGludWUKICAgICAgICByZW1haW5kZXIgPSBkYXRhW2xlbihwcmVmaXgpOl0KICAgICAgICBlbmQgPSByZW1haW5kZXIucmZpbmQoYiIpKSIpCiAgICAgICAgaWYgZW5kIDwgMDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBsaXRlcmFsID0gcmVtYWluZGVyWzplbmRdCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXlsb2FkID0gX3NhZmVfbGl0ZXJhbF9ldmFsKGxpdGVyYWwpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgaWYgZGVzYyA9PSAiemxpYi5kZWNvbXByZXNzIjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHpsaWIuZGVjb21wcmVzcyhwYXlsb2FkKSwgZGVzYwogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGVzYyA9PSAibWFyc2hhbC5sb2FkcyI6CiAgICAgICAgICAgIHJldHVybiBfZGVjb2RlX21hcnNoYWxfcGF5bG9hZChwYXlsb2FkLCBkZXNjKQogICAgICAgIGVsaWYgZGVzYyA9PSAiYmFzZTY0LmI2NGRlY29kZSI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjQuYjY0ZGVjb2RlKHBheWxvYWQpLCBkZXNjCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfZGVjb2RlX21hcnNoYWxfcGF5bG9hZChtYXJzaGFsbGVkOiBieXRlcywgcGFyZW50X2Rlc2M6IHN0cik6CiAgICAiIiIKICAgIERlY29kZSBhIG1hcnNoYWwubG9hZHMgcGF5bG9hZC4gVGhlIGNvZGUgb2JqZWN0IG9mdGVuIGRvZXM6CiAgICAgIC0gaW1wb3J0IHpsaWI7IGV4ZWMoemxpYi5kZWNvbXByZXNzKENPTlNUKSkKICAgICAgLSBpbXBvcnQgYmFzZTY0OyBleGVjKGJhc2U2NC5iNjRkZWNvZGUoQ09OU1QpKQogICAgICAtIGRlZmluZSBMRUVFVU5KVV9kZW9iZnVzY2F0ZSBhbmQgYXBwbHkgaXQgdG8gYSBVbmljb2RlIHBheWxvYWQKICAgICIiIgogICAgdHJ5OgogICAgICAgIGNvZGVfb2JqID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsbGVkKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvZGVfb2JqLCB0eXBlcy5Db2RlVHlwZSk6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBuYW1lcyA9IHR1cGxlKGNvZGVfb2JqLmNvX25hbWVzKQoKICAgICMgQ2hlY2sgZm9yIExFRUVVTkpVLXN0eWxlIFVuaWNvZGUgZGVvYmZ1c2NhdGlvbgogICAgaWYgIkxFRUVVTkpVX2Rlb2JmdXNjYXRlIiBpbiBuYW1lczoKICAgICAgICByZXR1cm4gX2RlY29kZV9sZWVldW5qdV9tYXJzaGFsKGNvZGVfb2JqKQoKICAgICMgRmluZCB0aGUgZGF0YSBjb25zdGFudCBhbmQgZGV0ZXJtaW5lIHdoYXQgdG8gZG8gd2l0aCBpdAogICAgZm9yIGMgaW4gY29kZV9vYmouY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoYywgYnl0ZXMpIGFuZCBsZW4oYykgPiA1MDoKICAgICAgICAgICAgIyBUcnkgYmFzZWQgb24gd2hhdCB0aGUgY29kZSBpbXBvcnRzCiAgICAgICAgICAgIGlmICJ6bGliIiBpbiBuYW1lczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKGMpLCBmIntwYXJlbnRfZGVzY30gLT4gemxpYiIKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiAiYmFzZTY0IiBpbiBuYW1lczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZShjKSwgZiJ7cGFyZW50X2Rlc2N9IC0+IGJhc2U2NCIKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAjIEZhbGxiYWNrIGF0dGVtcHRzCiAgICAgICAgICAgIGZvciBvcF9uYW1lLCBvcCBpbiBbKCJ6bGliIiwgemxpYi5kZWNvbXByZXNzKSwgKCJiYXNlNjQiLCBiYXNlNjQuYjY0ZGVjb2RlKV06CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wKGMpLCBmIntwYXJlbnRfZGVzY30gLT4ge29wX25hbWV9IChmYWxsYmFjaykiCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGMsIHN0cikgYW5kIGxlbihjKSA+IDUwOgogICAgICAgICAgICAjIFN0cmluZyBjb25zdGFudCDigJQgbWlnaHQgYmUgYmFzZTY0IG9yIFVuaWNvZGUtZW5jb2RlZAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZShjLmVuY29kZSgpKSwgZiJ7cGFyZW50X2Rlc2N9IC0+IGJhc2U2NCBzdHIiCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCgogICAgIyBDaGVjayBuZXN0ZWQgY29kZSBvYmplY3RzIGZvciBtb3JlIGNvbXBsZXggcGF0dGVybnMKICAgIGZvciBjIGluIGNvZGVfb2JqLmNvX2NvbnN0czoKICAgICAgICBpZiBpc2luc3RhbmNlKGMsIHR5cGVzLkNvZGVUeXBlKToKICAgICAgICAgICAgIyBSZWN1cnNpdmU6IGlubmVyIGNvZGUgb2JqZWN0IG1heSBhbHNvIGJlIGEgbWFyc2hhbCB3cmFwcGVyCiAgICAgICAgICAgIHBhc3MKCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfZGVjb2RlX2xlZWV1bmp1X21hcnNoYWwoY29kZV9vYmo6IHR5cGVzLkNvZGVUeXBlKToKICAgICIiIgogICAgSGFuZGxlIExFRUVVTkpVLXN0eWxlIG9iZnVzY2F0aW9uOgogICAgICAtIENvZGUgZGVmaW5lcyBMRUVFVU5KVV9kZW9iZnVzY2F0ZSAoaW50ZXJsZWF2ZWQta2V5IFhPUikKICAgICAgLSBBcHBsaWVzIGl0IHRvIGEgbGFyZ2UgVW5pY29kZSBzdHJpbmcgY29uc3RhbnQKICAgICAgLSBleGVjKGNvbXBpbGUocmVzdWx0KSkKICAgICIiIgogICAgZW5jcnlwdGVkID0gTm9uZQogICAgZm9yIGMgaW4gY29kZV9vYmouY29fY29uc3RzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoYywgc3RyKSBhbmQgbGVuKGMpID4gMTAwOgogICAgICAgICAgICBlbmNyeXB0ZWQgPSBjCiAgICAgICAgICAgIGJyZWFrCgogICAgaWYgZW5jcnlwdGVkIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gX2xlZWV1bmp1X2Rlb2JmdXNjYXRlKGVuY3J5cHRlZCkKICAgICAgICByZXR1cm4gcmVzdWx0LmVuY29kZSgidXRmLTgiKSwgIkxFRUVVTkpVIFVuaWNvZGUgWE9SIGRlb2JmdXNjYXRpb24iCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIFRleHQtbGV2ZWwgZGVjb2RlcnMgKHJlZ2V4IG9uIHNvdXJjZSBzdHJpbmdzKQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBfdHJ5X3JldmVyc2VkX2hleF9leGVjKHNvdXJjZTogc3RyKToKICAgICIiIlJldmVyc2VkIGhleCBleGVjIChBSVpFTi9YOVNWRSBzdHlsZSkuIiIiCiAgICBtID0gcmUuc2VhcmNoKAogICAgICAgIHIiIiJleGVjXHMqXChccypcKD9fK1wpP1xzKlwoXHMqWyciXShbMC05YS1mQS1GXSspWyciXVxzKlwpXHMqXCkiIiIsCiAgICAgICAgc291cmNlLAogICAgKQogICAgaWYgbToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlY29kZWQgPSBieXRlcy5mcm9taGV4KG0uZ3JvdXAoMSlbOjotMV0pLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAgICAgICAgICByZXR1cm4gZGVjb2RlZCwgInJldmVyc2VkLWhleCBleGVjIChsYW1iZGEpIgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICBtID0gcmUuc2VhcmNoKAogICAgICAgIHIiIiJleGVjXHMqXChccypieXRlc1wuZnJvbWhleFxzKlwoXHMqWyciXShbMC05YS1mQS1GXSspWyciXVxzKlxbXHMqOjpccyotMVxzKlxdXHMqXClccypcKSIiIiwKICAgICAgICBzb3VyY2UsCiAgICApCiAgICBpZiBtOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVjb2RlZCA9IGJ5dGVzLmZyb21oZXgobS5ncm91cCgxKVs6Oi0xXSkuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpCiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkLCAicmV2ZXJzZWQtaGV4IGV4ZWMgKGlubGluZSkiCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9kaXJlY3RfaGV4X2V4ZWMoc291cmNlOiBzdHIpOgogICAgIiIiRGlyZWN0IGhleCBleGVjLiIiIgogICAgZm9yIHBhdCBpbiBbCiAgICAgICAgciIiImV4ZWNccypcKFxzKmJ5dGVzXC5mcm9taGV4XHMqXChccypbJyJdKFswLTlhLWZBLUZdKylbJyJdXHMqXClccypcLmRlY29kZVxzKlwoLio/XClccypcKSIiIiwKICAgICAgICByIiIiZXhlY1xzKlwoXHMqYnl0ZXNcLmZyb21oZXhccypcKFxzKlsnIl0oWzAtOWEtZkEtRl0rKVsnIl1ccypcKVxzKlwpIiIiLAogICAgXToKICAgICAgICBtID0gcmUuc2VhcmNoKHBhdCwgc291cmNlKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBieXRlcy5mcm9taGV4KG0uZ3JvdXAoMSkpLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSwgImRpcmVjdCBoZXggZXhlYyIKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBOb25lCgoKZGVmIF90cnlfYmFzZTY0X2V4ZWMoc291cmNlOiBzdHIpOgogICAgIiIiQmFzZTY0IGV4ZWMgKGlubGluZSkuIiIiCiAgICBmb3IgcGF0IGluIFsKICAgICAgICByIiIiZXhlY1xzKlwoXHMqKD86YmFzZTY0XC4pP2I2NGRlY29kZVxzKlwoXHMqW2JdP1snIl0oW0EtWmEtejAtOSsvPVxuXSspWyciXVxzKlwpIiIiLAogICAgICAgIHIiIiJleGVjXHMqXChccypfX2ltcG9ydF9fXHMqXChccypbJyJdYmFzZTY0WyciXVxzKlwpXHMqXC5iNjRkZWNvZGVccypcKFxzKltiXT9bJyJdKFtBLVphLXowLTkrLz1cbl0rKVsnIl1ccypcKSIiIiwKICAgIF06CiAgICAgICAgbSA9IHJlLnNlYXJjaChwYXQsIHNvdXJjZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZShtLmdyb3VwKDEpKS5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIiksICJiYXNlNjQgZXhlYyIKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBOb25lCgoKZGVmIF90cnlfemxpYl9leGVjKHNvdXJjZTogc3RyKToKICAgICIiImV4ZWMoemxpYi5kZWNvbXByZXNzKC4uLikpLiIiIgogICAgbSA9IHJlLnNlYXJjaCgKICAgICAgICByIiIiZXhlY1xzKlwoXHMqemxpYlwuZGVjb21wcmVzc1xzKlwoXHMqKD86YmFzZTY0XC4pP2I2NGRlY29kZVxzKlwoXHMqW2JdP1snIl0oW0EtWmEtejAtOSsvPVxuXSspWyciXVxzKlwpIiIiLAogICAgICAgIHNvdXJjZSwKICAgICkKICAgIGlmIG06CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKGJhc2U2NC5iNjRkZWNvZGUobS5ncm91cCgxKSkpLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSwgInpsaWIrYmFzZTY0IGV4ZWMiCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIG0gPSByZS5zZWFyY2goCiAgICAgICAgciIiImV4ZWNccypcKFxzKnpsaWJcLmRlY29tcHJlc3NccypcKFxzKmJ5dGVzXC5mcm9taGV4XHMqXChccypbJyJdKFswLTlhLWZBLUZdKylbJyJdXHMqXClccypcKSIiIiwKICAgICAgICBzb3VyY2UsCiAgICApCiAgICBpZiBtOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHpsaWIuZGVjb21wcmVzcyhieXRlcy5mcm9taGV4KG0uZ3JvdXAoMSkpKS5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIiksICJ6bGliK2hleCBleGVjIgogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBOb25lCgoKZGVmIF90cnlfY29tcGlsZV9leGVjKHNvdXJjZTogc3RyKToKICAgICIiImV4ZWMoY29tcGlsZSgnLi4uJywgJy4uLicsICdleGVjJykpLiIiIgogICAgbSA9IHJlLnNlYXJjaCgKICAgICAgICByIiIiZXhlY1xzKlwoXHMqY29tcGlsZVxzKlwoXHMqWyciXXsxLDN9KC4qPylbJyJdezEsM31ccyosXHMqWyciXS4qP1snIl1ccyosXHMqWyciXWV4ZWNbJyJdXHMqXCkiIiIsCiAgICAgICAgc291cmNlLAogICAgICAgIHJlLkRPVEFMTCwKICAgICkKICAgIGlmIG06CiAgICAgICAgaW5uZXIgPSBtLmdyb3VwKDEpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWNvZGVkID0gYXN0LmxpdGVyYWxfZXZhbChmJyIiIntpbm5lcn0iIiInKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIGRlY29kZWQgPSBpbm5lcgogICAgICAgIHJldHVybiBkZWNvZGVkLCAiY29tcGlsZSBleGVjIgogICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9jaHJfam9pbl9leGVjKHNvdXJjZTogc3RyKToKICAgICIiImV4ZWMoJycuam9pbihjaHIoaSkgZm9yIGkgaW4gWy4uLl0pKS4iIiIKICAgIG0gPSByZS5zZWFyY2goCiAgICAgICAgciIiImV4ZWNccypcKFxzKlsnIl0oPzp8KVsnIl1cLmpvaW5ccypcKFxzKig/OmNoclxzKlwoXHMqaVxzKlwpXHMqZm9yXHMqaVxzKmlufG1hcFxzKlwoXHMqY2hyXHMqLClccypcWyhbMC05LFxzXSspXF0iIiIsCiAgICAgICAgc291cmNlLAogICAgKQogICAgaWYgbToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG51bXMgPSBbaW50KHguc3RyaXAoKSkgZm9yIHggaW4gbS5ncm91cCgxKS5zcGxpdCgiLCIpIGlmIHguc3RyaXAoKV0KICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oY2hyKG4pIGZvciBuIGluIG51bXMpLCAiY2hyLWxpc3QgZXhlYyIKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfdHJ5X2xhbWJkYV9paWZlX2Jhc2U2NChzb3VyY2U6IHN0cik6CiAgICAiIiIKICAgIExhbWJkYSBJSUZFIHBhdHRlcm46CiAgICAgIFZBUiA9IChsYW1iZGE6ICdCQVNFNjRfU1RSSU5HJykoKQogICAgZm9sbG93ZWQgYnkgZmlsZS13cml0ZSArIG9zLnN5c3RlbSBvciBleGVjLgogICAgIiIiCiAgICBtID0gcmUuc2VhcmNoKAogICAgICAgIHIiIiJcdytccyo9XHMqXChsYW1iZGFccyo6XHMqJyhbQS1aYS16MC05Ky89XG5dezEwMCx9KSdccypcKVxzKlwoXHMqXCkiIiIsCiAgICAgICAgc291cmNlLAogICAgKQogICAgaWYgbm90IG06CiAgICAgICAgbSA9IHJlLnNlYXJjaCgKICAgICAgICAgICAgciIiIlx3K1xzKj1ccypcKGxhbWJkYVxzKjpccyoiKFtBLVphLXowLTkrLz1cbl17MTAwLH0pIlxzKlwpXHMqXChccypcKSIiIiwKICAgICAgICAgICAgc291cmNlLAogICAgICAgICkKICAgIGlmIG06CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWNvZGVkID0gYmFzZTY0LmI2NGRlY29kZShtLmdyb3VwKDEpKS5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikKICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQsICJsYW1iZGEgSUlGRSBiYXNlNjQiCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9sZWVldW5qdV9lbmNyeXB0aW9uKHNvdXJjZTogc3RyKToKICAgICIiIgogICAgTEVFRVVOSlUtc3R5bGUgUEJLREYyK1hPUiBlbmNyeXB0aW9uOgogICAgICBwdyA9ICIuLi4iCiAgICAgIGEgPSAnQVNDSUk4NV9FTkNPREVEX0RBVEEnCiAgICAgIGIgPSBiYXNlNjQuYTg1ZGVjb2RlKGEuZW5jb2RlKCkpCiAgICAgIHNhbHQgPSBiWzoxNl07IGN0ID0gYlsxNjpdCiAgICAgIGtleSA9IF9wYmtkZjIocHcsIHNhbHQpCiAgICAgIHogPSBfeG9yKGN0LCBrZXkpCiAgICAgIHAgPSB6bGliLmRlY29tcHJlc3MoeikKICAgICAgbTEsIHMgPSBtYXJzaGFsLmxvYWRzKHApICBPUiBqdXN0IG1hcnNoYWwubG9hZHMocCkKICAgICIiIgogICAgcHdfbWF0Y2ggPSByZS5zZWFyY2gocidwd1xzKj1ccypbIlwnXShbXiJcJ10rKVsiXCddJywgc291cmNlKQogICAgaWYgbm90IHB3X21hdGNoOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBGaW5kIHRoZSBBU0NJSTg1IHBheWxvYWQKICAgIGFfbWF0Y2ggPSByZS5zZWFyY2gociJhXHMqPVxzKicoKD86W14nXFxdfFxcLikrKSciLCBzb3VyY2UsIHJlLkRPVEFMTCkKICAgIGlmIG5vdCBhX21hdGNoOgogICAgICAgIGFfbWF0Y2ggPSByZS5zZWFyY2gocidhXHMqPVxzKiIoKD86W14iXFxdfFxcLikrKSInLCBzb3VyY2UsIHJlLkRPVEFMTCkKICAgIGlmIG5vdCBhX21hdGNoOgogICAgICAgIHJldHVybiBOb25lCgogICAgcHcgPSBwd19tYXRjaC5ncm91cCgxKQogICAgYV9zdHIgPSBhX21hdGNoLmdyb3VwKDEpLnJlcGxhY2UoIlxcJyIsICInIikucmVwbGFjZSgiXFxcXCIsICJcXCIpCgogICAgdHJ5OgogICAgICAgIGIgPSBiYXNlNjQuYTg1ZGVjb2RlKGFfc3RyLmVuY29kZSgpKQogICAgICAgIHNhbHQgPSBiWzoxNl0KICAgICAgICBjdCA9IGJbMTY6XQogICAgICAgIGtleSA9IF9wYmtkZjIocHcsIHNhbHQsIGl0cz0xMDAwMDApCiAgICAgICAgeiA9IF94b3JfZGVjcnlwdChjdCwga2V5KQogICAgICAgIHAgPSB6bGliLmRlY29tcHJlc3MoeikKCiAgICAgICAgIyBUcnkgdG8gdW5wYWNrIG1hcnNoYWwgZGF0YQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVzdWx0ID0gbWFyc2hhbC5sb2FkcyhwKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgdHVwbGUpIGFuZCBsZW4ocmVzdWx0KSA9PSAyOgogICAgICAgICAgICAgICAgXywgcyA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpLCAiTEVFRVVOSlUgZW5jcnlwdGVkIChQQktERjIrWE9SK3psaWIrbWFyc2hhbCB0dXBsZSkiCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShyZXN1bHQsIHR5cGVzLkNvZGVUeXBlKToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lICAjIENhbid0IGRlY29tcGlsZSBjb2RlIG9iamVjdHMgZGlyZWN0bHkKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJlc3VsdCwgYnl0ZXMpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIiksICJMRUVFVU5KVSBlbmNyeXB0ZWQgKFBCS0RGMitYT1IremxpYittYXJzaGFsKSIKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAjIE1heWJlIHRoZSBkZWNvbXByZXNzZWQgZGF0YSBpcyBqdXN0IFB5dGhvbiBzb3VyY2UKICAgICAgICAgICAgcmV0dXJuIHAuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpLCAiTEVFRVVOSlUgZW5jcnlwdGVkIChQQktERjIrWE9SK3psaWIpIgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfdHJ5X2dlbmVyaWNfaGV4X3N0cmluZyhzb3VyY2U6IHN0cik6CiAgICAiIiJGYWxsYmFjazogYW55IHZlcnkgbG9uZyBoZXggc3RyaW5nLiIiIgogICAgZm9yIG0gaW4gcmUuZmluZGl0ZXIociJbJ1wiXShbMC05YS1mQS1GXXsxMDAsfSlbJ1wiXSIsIHNvdXJjZSk6CiAgICAgICAgaGV4X3N0ciA9IG0uZ3JvdXAoMSkKICAgICAgICBmb3IgYXR0ZW1wdF9yZXZlcnNlIGluIFtGYWxzZSwgVHJ1ZV06CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGggPSBoZXhfc3RyWzo6LTFdIGlmIGF0dGVtcHRfcmV2ZXJzZSBlbHNlIGhleF9zdHIKICAgICAgICAgICAgICAgIGRlY29kZWQgPSBieXRlcy5mcm9taGV4KGgpLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InN0cmljdCIpCiAgICAgICAgICAgICAgICBpZiBkZWNvZGVkLmlzcHJpbnRhYmxlKCkgb3IgIlxuIiBpbiBkZWNvZGVkOgogICAgICAgICAgICAgICAgICAgIGxhYmVsID0gImdlbmVyaWMgcmV2ZXJzZWQgaGV4IiBpZiBhdHRlbXB0X3JldmVyc2UgZWxzZSAiZ2VuZXJpYyBoZXgiCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQsIGxhYmVsCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfdHJ5X2V2YWxfd3JhcHBlcihzb3VyY2U6IHN0cik6CiAgICAiIiJldmFsKCcuLi4nKSB3cmFwcGVycy4iIiIKICAgIG0gPSByZS5zZWFyY2gociIiImV2YWxccypcKFxzKlsnIl0oLis/KVsnIl1ccypcKSIiIiwgc291cmNlLCByZS5ET1RBTEwpCiAgICBpZiBtOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW5uZXIgPSBhc3QubGl0ZXJhbF9ldmFsKGYnInttLmdyb3VwKDEpfSInKQogICAgICAgICAgICByZXR1cm4gaW5uZXIsICJldmFsIHdyYXBwZXIiCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9zaW11bGF0aW9uX2RlY29kZShzb3VyY2U6IHN0cik6CiAgICAiIiIKICAgIFNtYXJ0IHNpbXVsYXRpb246IHBhcnNlIHRoZSBQeXRob24gZmlsZSwgZXh0cmFjdCBzdHJpbmcgdmFyaWFibGVzLAogICAgZGV0ZWN0IHRyYW5zZm9ybWF0aW9uIGNoYWlucyAoYmFzZTY0L1hPUi9yZXZlcnNlL3psaWIpLCBhbmQgc2ltdWxhdGUKICAgIHRoZW0gdG8gcmVjb3ZlciB0aGUgcGF5bG9hZC4gSW50ZXJjZXB0cyBleGVjKCkgYW5kIG1hcnNoYWwubG9hZHMoKS4KCiAgICBIYW5kbGVzIHBhdHRlcm5zIGxpa2U6CiAgICAgIHZhcjEgPSAiYmFzZTY0Li4uIgogICAgICB2YXIyID0gImJhc2U2NC4uLiIKICAgICAgZCA9ICh2YXIxICsgdmFyMiArIC4uLikuZW5jb2RlKCkKICAgICAgZGVmIGYoKToKICAgICAgICAgIHQgPSBiYXNlNjQuYjY0ZGVjb2RlKGQpCiAgICAgICAgICB0ID0gYnl0ZXMoW2leS0VZIGZvciBpIGluIHRdKQogICAgICAgICAgLi4uCiAgICAgICAgICBleGVjKG1hcnNoYWwubG9hZHModCksIGdsb2JhbHMoKSkKICAgICIiIgogICAgIyBTdGVwIDE6IEZpbmQgYWxsIHN0cmluZyB2YXJpYWJsZSBhc3NpZ25tZW50cyAoaW5jbHVkaW5nIG11bHRpLWFzc2lnbiBsaW5lcykKICAgIGFsbF92YXJzID0ge30KICAgIGZvciBtIGluIHJlLmZpbmRpdGVyKHInKFx3Kylccyo9XHMqIihbXiJdKikiJywgc291cmNlKToKICAgICAgICBuYW1lLCB2YWwgPSBtLmdyb3VwKDEpLCBtLmdyb3VwKDIpCiAgICAgICAgaWYgbGVuKHZhbCkgPiA1MDoKICAgICAgICAgICAgYWxsX3ZhcnNbbmFtZV0gPSB2YWwKCiAgICBpZiBub3QgYWxsX3ZhcnM6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIFN0ZXAgMjogRmluZCB0aGUgY29uY2F0ZW5hdGlvbiBwYXR0ZXJuCiAgICBjb25jYXRfbWF0Y2ggPSByZS5zZWFyY2goCiAgICAgICAgcicoXHcrKVxzKj1ccypcKChbXHcrXHNdKylcKVwuZW5jb2RlXChcKScsCiAgICAgICAgc291cmNlLAogICAgKQogICAgaWYgbm90IGNvbmNhdF9tYXRjaDoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIHBhcnRzID0gW3Auc3RyaXAoKSBmb3IgcCBpbiBjb25jYXRfbWF0Y2guZ3JvdXAoMikuc3BsaXQoJysnKV0KICAgIG1pc3NpbmcgPSBbcCBmb3IgcCBpbiBwYXJ0cyBpZiBwIG5vdCBpbiBhbGxfdmFyc10KICAgIGlmIG1pc3Npbmc6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIFN0ZXAgMzogQnVpbGQgdGhlIGNvbmNhdGVuYXRlZCBwYXlsb2FkCiAgICBwYXlsb2FkID0gJycuam9pbihhbGxfdmFyc1twXSBmb3IgcCBpbiBwYXJ0cykuZW5jb2RlKCkKCiAgICAjIFN0ZXAgNDogRmluZCBhbmQgc2ltdWxhdGUgdGhlIHRyYW5zZm9ybWF0aW9uIGNoYWluCiAgICBmdW5jX21hdGNoID0gcmUuc2VhcmNoKAogICAgICAgIHInZGVmXHMrXHcrXChcKTpccypcbiguKj8pKD86XlthLXpBLVpdfFxaKScsCiAgICAgICAgc291cmNlLAogICAgICAgIHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTCwKICAgICkKICAgIGlmIG5vdCBmdW5jX21hdGNoOgogICAgICAgIHJldHVybiBOb25lCgogICAgZnVuY19ib2R5ID0gZnVuY19tYXRjaC5ncm91cCgxKQogICAgZGF0YSA9IHBheWxvYWQKICAgIHN0ZXBzID0gW10KCiAgICBmb3IgbGluZSBpbiBmdW5jX2JvZHkuc3BsaXQoJ1xuJyk6CiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIGxpbmUuc3RhcnRzd2l0aCgndHJ5OicpIG9yIGxpbmUuc3RhcnRzd2l0aCgnZXhjZXB0Jykgb3IgbGluZS5zdGFydHN3aXRoKCdwcmludCcpOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAjIGJhc2U2NC5iNjRkZWNvZGUKICAgICAgICBpZiByZS5tYXRjaChyJ1x3K1xzKj1ccypiYXNlNjRcLmI2NGRlY29kZVwoJywgbGluZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuYjY0ZGVjb2RlKGRhdGEpCiAgICAgICAgICAgICAgICBzdGVwcy5hcHBlbmQoJ2I2NCcpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAjIFhPUjogYnl0ZXMoW2leS0VZIGZvciBpIGluIFZBUl0pCiAgICAgICAgeG9yX20gPSByZS5tYXRjaChyJ1x3K1xzKj1ccypieXRlc1woXFtccyppXHMqXF5ccyooXGQrKVxzK2ZvclxzK2lccytpblxzK1x3K1xzKlxdXCknLCBsaW5lKQogICAgICAgIGlmIHhvcl9tOgogICAgICAgICAgICBrZXkgPSBpbnQoeG9yX20uZ3JvdXAoMSkpCiAgICAgICAgICAgIGRhdGEgPSBieXRlcyhbYiBeIGtleSBmb3IgYiBpbiBkYXRhXSkKICAgICAgICAgICAgc3RlcHMuYXBwZW5kKGYneG9yKHtrZXl9KScpCgogICAgICAgICMgUmV2ZXJzZTogdCA9IHRbOjotMV0KICAgICAgICBpZiByZS5tYXRjaChyJ1x3K1xzKj1ccypcdytcW1xzKjo6XHMqLTFccypcXScsIGxpbmUpOgogICAgICAgICAgICBkYXRhID0gZGF0YVs6Oi0xXQogICAgICAgICAgICBzdGVwcy5hcHBlbmQoJ3JldmVyc2UnKQoKICAgICAgICAjIHpsaWIuZGVjb21wcmVzcwogICAgICAgIGlmIHJlLm1hdGNoKHInXHcrXHMqPVxzKnpsaWJcLmRlY29tcHJlc3NcKCcsIGxpbmUpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkYXRhID0gemxpYi5kZWNvbXByZXNzKGRhdGEpCiAgICAgICAgICAgICAgICBzdGVwcy5hcHBlbmQoJ3psaWInKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBleGVjKG1hcnNoYWwubG9hZHModCkpIOKAlCBmaW5hbCBzdGVwCiAgICAgICAgaWYgJ21hcnNoYWwubG9hZHMnIGluIGxpbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvZGVfb2JqID0gbWFyc2hhbC5sb2FkcyhkYXRhKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb2RlX29iaiwgdHlwZXMuQ29kZVR5cGUpOgogICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzID0gX2FuYWx5emVfbWFyc2hhbF9jb2RlKGNvZGVfb2JqKQogICAgICAgICAgICAgICAgICAgIGRlc2MgPSBmInNpbXVsYXRpb24gKHsnIC0+ICcuam9pbihzdGVwcyl9IC0+IG1hcnNoYWwpIgogICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXNpcywgZGVzYwogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICBpZiBub3Qgc3RlcHM6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB0cnk6CiAgICAgICAgdGV4dCA9IGRhdGEuZGVjb2RlKCd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAgICAgICAgZGVzYyA9IGYic2ltdWxhdGlvbiAoeycgLT4gJy5qb2luKHN0ZXBzKX0pIgogICAgICAgIHJldHVybiB0ZXh0LCBkZXNjCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lCgoKZGVmIF9hbmFseXplX21hcnNoYWxfY29kZShjb2RlX29iajogdHlwZXMuQ29kZVR5cGUpIC0+IHN0cjoKICAgICIiIgogICAgUHJvZHVjZSBhIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMgb2YgYSBtYXJzaGFsIGNvZGUgb2JqZWN0OgogICAgaW1wb3J0cywgY3JlZGVudGlhbHMsIGZ1bmN0aW9uIHNpZ25hdHVyZXMsIHN0cmluZyBsaXRlcmFscywgYmVoYXZpb3IuCiAgICAiIiIKICAgIGluZm8gPSBfZXh0cmFjdF9jb2RlX3RyZWUoY29kZV9vYmopCiAgICB0b3BfbmFtZXMgPSBsaXN0KGNvZGVfb2JqLmNvX25hbWVzKQogICAgbGluZXMgPSBbXQoKICAgIGxpbmVzLmFwcGVuZCgnIyA9PT0gQVVUTy1ERUNPREVEIEZST00gTUFSU0hBTCBDT0RFIE9CSkVDVCA9PT0nKQogICAgbGluZXMuYXBwZW5kKGYnIyBDb21waWxlZCBmcm9tOiB7Y29kZV9vYmouY29fZmlsZW5hbWV9JykKICAgIGxpbmVzLmFwcGVuZCgnJykKCiAgICAjIEltcG9ydHMKICAgIGtub3duX21vZHMgPSB7CiAgICAgICAgJ29zJywgJ3N5cycsICd0aW1lJywgJ3JhbmRvbScsICd0aHJlYWRpbmcnLCAnc3RyaW5nJywgJ3V1aWQnLAogICAgICAgICd3ZWJicm93c2VyJywgJ3BhdGhsaWInLCAnZGF0ZXRpbWUnLCAncmVxdWVzdHMnLCAnY29sb3JhbWEnLAogICAgICAgICdqc29uJywgJ2hhc2hsaWInLCAnc29ja2V0JywgJ3N1YnByb2Nlc3MnLCAndXJsbGliJywgJ2h0dHAnLAogICAgICAgICdiYXNlNjQnLCAnemxpYicsICdtYXJzaGFsJywgJ3BpY2tsZScsICdzdHJ1Y3QnLCAncmUnLAogICAgICAgICdjb25jdXJyZW50LmZ1dHVyZXMnLCAnYXN5bmNpbycsICdhaW9odHRwJywgJ2h0dHB4JywKICAgIH0KICAgIGltcG9ydHMgPSBbbiBmb3IgbiBpbiB0b3BfbmFtZXMgaWYgbiBpbiBrbm93bl9tb2RzXQogICAgaWYgaW1wb3J0czoKICAgICAgICBsaW5lcy5hcHBlbmQoJyMgLS0tIEltcG9ydHMgLS0tJykKICAgICAgICBmb3IgbW9kIGluIGltcG9ydHM6CiAgICAgICAgICAgIGxpbmVzLmFwcGVuZChmJ2ltcG9ydCB7bW9kfScpCiAgICAgICAgbGluZXMuYXBwZW5kKCcnKQoKICAgICMgQ3JlZGVudGlhbHMgLyBVUkxzIC8gcGF0aHMKICAgIGNyZWRzID0gW10KICAgIGZvciBzIGluIGluZm9bJ3N0cmluZ3MnXToKICAgICAgICBpZiBhbnkoayBpbiBzIGZvciBrIGluICgnYXBpLnRlbGVncmFtLm9yZycsICd0b2tlbicsICdib3QnLCAnQUFHJywgJ0FBSCcpKToKICAgICAgICAgICAgY3JlZHMuYXBwZW5kKGYnIyBUb2tlbi9VUkw6IHtzIXJ9JykKICAgICAgICBlbGlmIHMuaXNkaWdpdCgpIGFuZCBsZW4ocykgPj0gNjoKICAgICAgICAgICAgY3JlZHMuYXBwZW5kKGYnIyBDaGF0L1VzZXIgSUQ6IHtzIXJ9JykKICAgICAgICBlbGlmICcvc3RvcmFnZS8nIGluIHMgb3IgJ0Rvd25sb2FkJyBpbiBzOgogICAgICAgICAgICBjcmVkcy5hcHBlbmQoZicjIEZpbGUgcGF0aDoge3Mhcn0nKQogICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCcuJykgYW5kIGxlbihzKSA8IDEwOgogICAgICAgICAgICBjcmVkcy5hcHBlbmQoZicjIEZpbGUgZXh0ZW5zaW9uOiB7cyFyfScpCiAgICBpZiBjcmVkczoKICAgICAgICBsaW5lcy5hcHBlbmQoJyMgLS0tIEVtYmVkZGVkIENyZWRlbnRpYWxzICYgUGF0aHMgLS0tJykKICAgICAgICBsaW5lcy5leHRlbmQoY3JlZHMpCiAgICAgICAgbGluZXMuYXBwZW5kKCcnKQoKICAgICMgRnVuY3Rpb25zCiAgICBsaW5lcy5hcHBlbmQoJyMgLS0tIEZ1bmN0aW9ucyAtLS0nKQogICAgZm9yIGZ1bmMgaW4gaW5mb1snZnVuY3Rpb25zJ106CiAgICAgICAgZm5hbWUgPSBmdW5jWyduYW1lJ10KICAgICAgICBpZiBmbmFtZSBpbiAoJzxnZW5leHByPicsICc8bGlzdGNvbXA+JywgJzxkaWN0Y29tcD4nLCAnPGxhbWJkYT4nLAogICAgICAgICAgICAgICAgICAgICAgJzxtb2R1bGU+JywgJzxzZXRjb21wPicpOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGFyZ3MgPSAnLCAnLmpvaW4oZnVuY1snYXJncyddKQogICAgICAgIGxpbmVzLmFwcGVuZChmJ2RlZiB7Zm5hbWV9KHthcmdzfSk6JykKICAgICAgICBsaW5lcy5hcHBlbmQoZicgICAgIyBVc2VzOiB7IiwgIi5qb2luKGZ1bmNbIm5hbWVzIl1bOjEyXSl9JykKICAgICAgICBmb3IgcyBpbiBmdW5jWydzdHJpbmdzJ106CiAgICAgICAgICAgIGlmIGxlbihzKSA+IDU6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZicgICAgIyBTdHJpbmc6IHtzWzoxMjBdIXJ9JykKICAgICAgICBsaW5lcy5hcHBlbmQoZicgICAgLi4uICAjIGNvbXBpbGVkIGJ5dGVjb2RlJykKICAgICAgICBsaW5lcy5hcHBlbmQoJycpCgogICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKCgpkZWYgX2V4dHJhY3RfY29kZV90cmVlKGNvOiB0eXBlcy5Db2RlVHlwZSkgLT4gZGljdDoKICAgICIiIlJlY3Vyc2l2ZWx5IGV4dHJhY3QgYWxsIGRhdGEgZnJvbSBhIGNvZGUgb2JqZWN0IHRyZWUuIiIiCiAgICBpbmZvID0gewogICAgICAgICduYW1lJzogY28uY29fbmFtZSwKICAgICAgICAnYXJncyc6IGxpc3QoY28uY29fdmFybmFtZXNbOmNvLmNvX2FyZ2NvdW50XSksCiAgICAgICAgJ25hbWVzJzogbGlzdChjby5jb19uYW1lcyksCiAgICAgICAgJ3N0cmluZ3MnOiBbXSwKICAgICAgICAnbnVtYmVycyc6IFtdLAogICAgICAgICdmdW5jdGlvbnMnOiBbXSwKICAgIH0KICAgIGZvciBjIGluIGNvLmNvX2NvbnN0czoKICAgICAgICBpZiBpc2luc3RhbmNlKGMsIHN0cikgYW5kIGxlbihjKSA+IDM6CiAgICAgICAgICAgIGluZm9bJ3N0cmluZ3MnXS5hcHBlbmQoYykKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYywgKGludCwgZmxvYXQpKSBhbmQgYyBub3QgaW4gKDAsIDEsIC0xLCBOb25lLCBUcnVlLCBGYWxzZSk6CiAgICAgICAgICAgIGluZm9bJ251bWJlcnMnXS5hcHBlbmQoYykKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYywgdHlwZXMuQ29kZVR5cGUpOgogICAgICAgICAgICBjaGlsZCA9IF9leHRyYWN0X2NvZGVfdHJlZShjKQogICAgICAgICAgICBpbmZvWydmdW5jdGlvbnMnXS5hcHBlbmQoY2hpbGQpCiAgICAgICAgICAgIGluZm9bJ3N0cmluZ3MnXS5leHRlbmQoY2hpbGRbJ3N0cmluZ3MnXSkKICAgIHJldHVybiBpbmZvCgoKZGVmIF90cnlfc2FuZGJveF9kZWNvZGUoc291cmNlOiBzdHIpOgogICAgIiIiCiAgICBTYW5kYm94ZWQtZXhlY3V0aW9uIGZhbGxiYWNrIGZvciBBTlkgb2JmdXNjYXRpb24gY2hhaW4uCgogICAgUnVucyB0aGUgb2JmdXNjYXRlZCBzb3VyY2UgaW4gYSBjb250cm9sbGVkIG5hbWVzcGFjZSB3aGVyZToKICAgICAgLSBleGVjLCBldmFsLCBjb21waWxlLCBtYXJzaGFsLmxvYWRzIGFyZSBpbnRlcmNlcHRlZCAoY2FwdHVyZSwgZG9uJ3QgcnVuKQogICAgICAtIF9faW1wb3J0X18gaXMgcmVzdHJpY3RlZCAoYmxvY2tzIHN1YnByb2Nlc3MsIHNvY2tldCwgdXJsbGliLCByZXF1ZXN0cywKICAgICAgICBjdHlwZXMsIGZ0cGxpYiwgc210cGxpYiwgbXVsdGlwcm9jZXNzaW5nLCBwaWNrbGUsIGh0dHAsIHRlbG5ldGxpYiwgZXRjLikKICAgICAgLSBmaWxlIEkvTyBpcyByZXN0cmljdGVkIChvcGVuKCkgcmV0dXJucyBhbiBlbXB0eSBmYWtlIGZpbGUpCiAgICAgIC0gYWxsIGRlY29tcHJlc3Npb24gLyBlbmNvZGluZyBtb2R1bGVzICh6bGliLCBiejIsIGx6bWEsIGd6aXAsIGJhc2U2NCwKICAgICAgICBjb2RlY3MsIGJpbmFzY2lpKSBhcmUga2VwdCByZWFsIHNvIHRoZSBvYmZ1c2NhdGlvbiBjYW4gZG8gaXRzIGRlY29kaW5nCgogICAgVGhlIG9iZnVzY2F0aW9uIGRvZXMgQUxMIG9mIGl0cyBvd24gd29yayAoYjg1ZGVjb2RlLCBiejIuZGVjb21wcmVzcywKICAgIHpsaWIuZGVjb21wcmVzcywgWE9SLCBrZXktZGVyaXZhdGlvbiwgbXVsdGktcGFzcyBjb25jYXQsIGV0Yy4pOyB3aGVuIGl0CiAgICBmaW5hbGx5IGNhbGxzIGV4ZWMoKS9tYXJzaGFsLmxvYWRzKCkvY29tcGlsZSgpIG9uIHRoZSBkZW9iZnVzY2F0ZWQKICAgIHBheWxvYWQsIHdlIGNhcHR1cmUgdGhhdCBwYXlsb2FkIGluc3RlYWQgb2YgcnVubmluZyBpdC4KCiAgICBUaGlzIGlzIHRoZSB1bml2ZXJzYWwgY2F0Y2gtYWxsIHRoYXQgaGFuZGxlcyBvYmZ1c2NhdGlvbiBwYXR0ZXJucyB3ZQogICAgaGF2ZW4ndCBzZWVuIGJlZm9yZS4KICAgICIiIgogICAgaWYgbGVuKHNvdXJjZSkgPCA1MDoKICAgICAgICByZXR1cm4gTm9uZQogICAgIyBRdWljayBndWFyZDogbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBpbmRpY2F0b3IgdGhhdCB0aGlzIGlzIG9iZnVzY2F0aW9uCiAgICBpbmRpY2F0b3JzID0gKCdleGVjKCcsICdldmFsKCcsICdjb21waWxlKCcsICdtYXJzaGFsLmxvYWRzJywgJ19faW1wb3J0X18oJywKICAgICAgICAgICAgICAgICAgJ2I4NWRlY29kZScsICdiNjRkZWNvZGUnLCAnemxpYi5kZWNvbXByZXNzJywgJ2J6Mi5kZWNvbXByZXNzJywKICAgICAgICAgICAgICAgICAgJ2x6bWEuZGVjb21wcmVzcycsICdnemlwLmRlY29tcHJlc3MnLCAnZ2V0YXR0cihfX2J1aWx0aW5zX18nLAogICAgICAgICAgICAgICAgICAnZnJvbWhleCcsICdjb2RlY3MuZGVjb2RlJykKICAgIGlmIG5vdCBhbnkocyBpbiBzb3VyY2UgZm9yIHMgaW4gaW5kaWNhdG9ycyk6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBjYXB0dXJlZCA9IFtdICAgICAgICAgICMgbGlzdCBvZiAoImtpbmQiLCBwYXlsb2FkLWFzLXRleHQpIHR1cGxlcwogICAgY2FwdHVyZWRfbWFyc2hhbCA9IFtdICAjIGNhcHR1cmVkIGNvZGUgb2JqZWN0cwogICAgYmxvY2tlZF9pbXBvcnRzID0gewogICAgICAgICdzdWJwcm9jZXNzJywgJ3NvY2tldCcsICdvcycsICd1cmxsaWInLCAndXJsbGliLnJlcXVlc3QnLCAndXJsbGliMicsCiAgICAgICAgJ3JlcXVlc3RzJywgJ2h0dHAnLCAnaHR0cC5jbGllbnQnLCAnZnRwbGliJywgJ3NtdHBsaWInLCAndGVsbmV0bGliJywKICAgICAgICAncGlja2xlJywgJ3NoZWx2ZScsICd3ZWJicm93c2VyJywgJ2N0eXBlcycsICdtdWx0aXByb2Nlc3NpbmcnLAogICAgICAgICd0aHJlYWRpbmcnLCAnYXN5bmNpbycsICdhaW9odHRwJywgJ2h0dHB4JywgJ3BhcmFtaWtvJywgJ3B0eScsCiAgICAgICAgJ2ZjbnRsJywgJ3Rlcm1pb3MnLCAncmVzb3VyY2UnLCAnc2lnbmFsJywgJ3NodXRpbCcsICdfd2luYXBpJywKICAgICAgICAnd2lucmVnJywgJ3dpbnNvdW5kJywgJ21zdmNydCcsCiAgICB9CiAgICBzYWZlX2ltcG9ydHMgPSB7CiAgICAgICAgIyBEZWNvZGVycy9lbmNvZGVyczoga2VlcCByZWFsCiAgICAgICAgJ2Jhc2U2NCcsICdiaW5hc2NpaScsICdjb2RlY3MnLCAnemxpYicsICdiejInLCAnbHptYScsICdnemlwJywKICAgICAgICAnbWFyc2hhbCcsICdzdHJ1Y3QnLCAnYXJyYXknLAogICAgICAgICMgUHVyZSBkYXRhOgogICAgICAgICdyZScsICdzdHJpbmcnLCAnanNvbicsICdoYXNobGliJywgJ2htYWMnLCAnc2VjcmV0cycsCiAgICAgICAgJ21hdGgnLCAncmFuZG9tJywgJ2l0ZXJ0b29scycsICdmdW5jdG9vbHMnLCAnb3BlcmF0b3InLAogICAgICAgICdjb2xsZWN0aW9ucycsICdjb2xsZWN0aW9ucy5hYmMnLCAnZW51bScsICdkYXRhY2xhc3NlcycsICdjb3B5JywKICAgICAgICAnZGF0ZXRpbWUnLCAndGltZScsICdjYWxlbmRhcicsCiAgICAgICAgJ3R5cGVzJywgJ3R5cGluZycsICdpbnNwZWN0JywgJ2FzdCcsICd0b2tlbml6ZScsICdrZXl3b3JkJywKICAgICAgICAnc3lzJywgJ3BsYXRmb3JtJywgJ3dhcm5pbmdzJywgJ3RyYWNlYmFjaycsICdjb250ZXh0bGliJywKICAgICAgICAnaW8nLCAncGF0aGxpYicsICAjIHdlJ2xsIHdyYXAgaW8vcGF0aGxpYiB0byBibG9jayByZWFsIGZzIHdyaXRlcwogICAgfQoKICAgIHJlYWxfaW1wb3J0ID0gX19idWlsdGluc19fLl9faW1wb3J0X18gaWYgaXNpbnN0YW5jZShfX2J1aWx0aW5zX18sIHR5cGUoc3lzKSkgZWxzZSBfX2J1aWx0aW5zX19bJ19faW1wb3J0X18nXQoKICAgIGRlZiBzYWZlX2ltcG9ydChuYW1lLCBnbG9icz1Ob25lLCBsb2NzPU5vbmUsIGZyb21saXN0PSgpLCBsZXZlbD0wKToKICAgICAgICByb290ID0gbmFtZS5zcGxpdCgnLicpWzBdCiAgICAgICAgaWYgcm9vdCBpbiBibG9ja2VkX2ltcG9ydHM6CiAgICAgICAgICAgICMgUmV0dXJuIGEgc3R1YiBtb2R1bGUgdGhhdCBkb2VzIG5vdGhpbmcKICAgICAgICAgICAgbW9kID0gdHlwZXMuTW9kdWxlVHlwZShuYW1lKQogICAgICAgICAgICBtb2QuX19nZXRhdHRyX18gPSBsYW1iZGEgYXR0cjogX05vb3BDYWxsYWJsZShmIntuYW1lfS57YXR0cn0iKQogICAgICAgICAgICByZXR1cm4gbW9kCiAgICAgICAgaWYgcm9vdCBpbiBzYWZlX2ltcG9ydHMgb3Igcm9vdC5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJldHVybiByZWFsX2ltcG9ydChuYW1lLCBnbG9icywgbG9jcywgZnJvbWxpc3QsIGxldmVsKQogICAgICAgICMgVW5rbm93biAtIGFsbG93IGJ1dCB3aXRoIHdhcm5pbmcgY2FwdHVyZQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHJlYWxfaW1wb3J0KG5hbWUsIGdsb2JzLCBsb2NzLCBmcm9tbGlzdCwgbGV2ZWwpCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICBtb2QgPSB0eXBlcy5Nb2R1bGVUeXBlKG5hbWUpCiAgICAgICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgcGF0Y2hlZF9leGVjKGNvZGUsIGdsb2JzPU5vbmUsIGxvY3M9Tm9uZSk6CiAgICAgICAga2luZCA9IHR5cGUoY29kZSkuX19uYW1lX18KICAgICAgICBpZiBpc2luc3RhbmNlKGNvZGUsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRleHQgPSBieXRlcyhjb2RlKS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICMgQ291bGQgYmUgbWFyc2hhbCBkYXRhCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgb2JqID0gbWFyc2hhbC5sb2FkcyhieXRlcyhjb2RlKSkKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZXMuQ29kZVR5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlZF9tYXJzaGFsLmFwcGVuZChvYmopCiAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoJ2V4ZWMobWFyc2hhbCknLCBfbWFyc2hhbF9jb2RlX3RvX3RleHQob2JqKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICB0ZXh0ID0gYnl0ZXMoY29kZSkuZGVjb2RlKCd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoJ2V4ZWMoYnl0ZXMpJywgdGV4dCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNvZGUsIHN0cik6CiAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoJ2V4ZWMoc3RyKScsIGNvZGUpKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShjb2RlLCB0eXBlcy5Db2RlVHlwZSk6CiAgICAgICAgICAgIGNhcHR1cmVkX21hcnNoYWwuYXBwZW5kKGNvZGUpCiAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoJ2V4ZWMoY29kZSknLCBfbWFyc2hhbF9jb2RlX3RvX3RleHQoY29kZSkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoZidleGVjKHtraW5kfSknLCByZXByKGNvZGUpKSkKICAgICAgICAjIERvbid0IGFjdHVhbGx5IHJ1biB0aGUgY29kZQoKICAgIGRlZiBwYXRjaGVkX2V2YWwoZXhwciwgZ2xvYnM9Tm9uZSwgbG9jcz1Ob25lKToKICAgICAgICBpZiBpc2luc3RhbmNlKGV4cHIsIHN0cik6CiAgICAgICAgICAgIGNhcHR1cmVkLmFwcGVuZCgoJ2V2YWwnLCBleHByKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIGFzdC5saXRlcmFsX2V2YWwoZXhwcikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgcGF0Y2hlZF9jb21waWxlKHNyYywgZmlsZW5hbWU9JzxzYW5kYm94PicsIG1vZGU9J2V4ZWMnLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3JjLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgICAgICB0ZXh0ID0gYnl0ZXMoc3JjKS5kZWNvZGUoJ3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykKICAgICAgICBlbHNlOgogICAgICAgICAgICB0ZXh0ID0gc3RyKHNyYykKICAgICAgICBjYXB0dXJlZC5hcHBlbmQoKCdjb21waWxlJywgdGV4dCkpCiAgICAgICAgIyBSZXR1cm4gYSBjb21waWxlZCBidXQgaGFybWxlc3MgY29kZSBvYmplY3Qgc28gdGhlIGNhbGxlciBjYW4gcGFzcyBpdAogICAgICAgICMgdG8gZXhlYygpICh3aGljaCB3ZSdsbCBhbHNvIGludGVyY2VwdCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjb21waWxlKCdwYXNzJywgZmlsZW5hbWUsIG1vZGUpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICByZWFsX21hcnNoYWxfbG9hZHMgPSBtYXJzaGFsLmxvYWRzCiAgICBkZWYgcGF0Y2hlZF9tYXJzaGFsX2xvYWRzKGRhdGEpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb2JqID0gcmVhbF9tYXJzaGFsX2xvYWRzKGJ5dGVzKGRhdGEpKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHR5cGVzLkNvZGVUeXBlKToKICAgICAgICAgICAgICAgICAgICBjYXB0dXJlZF9tYXJzaGFsLmFwcGVuZChvYmopCiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWQuYXBwZW5kKCgnbWFyc2hhbC5sb2FkcycsIF9tYXJzaGFsX2NvZGVfdG9fdGV4dChvYmopKSkKICAgICAgICAgICAgICAgIHJldHVybiBvYmoKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gTm9uZQoKICAgICMgUGF0Y2ggYSBmZXcgZXh0cmEgZGFuZ2Vyb3VzIHRoaW5ncyBpbnRvIHNhZmUgbm9vcHMKICAgIGRlZiBmYWtlX29wZW4oKmEsICoqa3cpOgogICAgICAgIHJldHVybiBfRmFrZUZpbGUoKQoKICAgIGRlZiBmYWtlX3N5c3RlbSgqYSwgKiprdyk6CiAgICAgICAgY2FwdHVyZWQuYXBwZW5kKCgnb3Muc3lzdGVtJywgcmVwcihhKSkpCiAgICAgICAgcmV0dXJuIDAKCiAgICAjIEJ1aWxkIHNhbmRib3ggYnVpbHRpbnMgKGEgcGxhaW4gZGljdCBzbyBldmFsL2V4ZWMgd29yayBwcm9wZXJseSkKICAgIHJlYWxfYnVpbHRpbnNfZGljdCA9ICgKICAgICAgICBfX2J1aWx0aW5zX18uX19kaWN0X18KICAgICAgICBpZiBpc2luc3RhbmNlKF9fYnVpbHRpbnNfXywgdHlwZShzeXMpKSBlbHNlIGRpY3QoX19idWlsdGluc19fKQogICAgKQogICAgc2FmZV9idWlsdGlucyA9IGRpY3QocmVhbF9idWlsdGluc19kaWN0KQogICAgc2FmZV9idWlsdGluc1snZXhlYyddID0gcGF0Y2hlZF9leGVjCiAgICBzYWZlX2J1aWx0aW5zWydldmFsJ10gPSBwYXRjaGVkX2V2YWwKICAgIHNhZmVfYnVpbHRpbnNbJ2NvbXBpbGUnXSA9IHBhdGNoZWRfY29tcGlsZQogICAgc2FmZV9idWlsdGluc1snX19pbXBvcnRfXyddID0gc2FmZV9pbXBvcnQKICAgIHNhZmVfYnVpbHRpbnNbJ29wZW4nXSA9IGZha2Vfb3BlbgogICAgc2FmZV9idWlsdGluc1snaW5wdXQnXSA9IGxhbWJkYSAqYSwgKiprdzogJycKICAgIHNhZmVfYnVpbHRpbnNbJ3ByaW50J10gPSBsYW1iZGEgKmEsICoqa3c6IE5vbmUKICAgIHNhZmVfYnVpbHRpbnNbJ2V4aXQnXSA9IGxhbWJkYSAqYSwgKiprdzogTm9uZQogICAgc2FmZV9idWlsdGluc1sncXVpdCddID0gbGFtYmRhICphLCAqKmt3OiBOb25lCiAgICBzYWZlX2J1aWx0aW5zWydicmVha3BvaW50J10gPSBsYW1iZGEgKmEsICoqa3c6IE5vbmUKICAgIHNhZmVfYnVpbHRpbnNbJ2hlbHAnXSA9IGxhbWJkYSAqYSwgKiprdzogTm9uZQoKICAgICMgU2F2ZSBvcmlnaW5hbCBtYXJzaGFsLmxvYWRzLCBtb25rZXktcGF0Y2ggZ2xvYmFsbHkgZm9yIHRoZSBkdXJhdGlvbgogICAgc2FuZGJveF9nbG9iYWxzID0gewogICAgICAgICdfX2J1aWx0aW5zX18nOiBzYWZlX2J1aWx0aW5zLAogICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCiAgICAgICAgJ19fZmlsZV9fJzogJzxzYW5kYm94PicsCiAgICAgICAgJ19fZG9jX18nOiBOb25lLAogICAgfQoKICAgIHNhdmVkX21hcnNoYWxfbG9hZHMgPSBtYXJzaGFsLmxvYWRzCiAgICBtYXJzaGFsLmxvYWRzID0gcGF0Y2hlZF9tYXJzaGFsX2xvYWRzCiAgICB0cnk6CiAgICAgICAgIyBDb21waWxlIHRoZSBzb3VyY2Ugb3Vyc2VsdmVzIChyZWFsIGNvbXBpbGUsIG5vdCBwYXRjaGVkKQogICAgICAgIHRyeToKICAgICAgICAgICAgY29kZV9vYmogPSBjb21waWxlKHNvdXJjZSwgJzxzYW5kYm94PicsICdleGVjJykKICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgUmVhbCBleGVjIGludG8gdGhlIHNhbmRib3ggbmFtZXNwYWNlIChvbmx5IHRoZSBzb3VyY2UncyB0b3AtbGV2ZWwKICAgICAgICAjIHN0YXRlbWVudHMgcnVuOyBhbnkgZXhlYy9ldmFsL2NvbXBpbGUvbWFyc2hhbC5sb2FkcyBpbnNpZGUgaXMKICAgICAgICAjIGNhcHR1cmVkKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVhbF9leGVjX2ZuID0gcmVhbF9idWlsdGluc19kaWN0WydleGVjJ10KICAgICAgICAgICAgcmVhbF9leGVjX2ZuKGNvZGVfb2JqLCBzYW5kYm94X2dsb2JhbHMpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIyBTYW5kYm94IGNyYXNoZWQgbWlkLWV4ZWN1dGlvbjsgd2UgbWF5IHN0aWxsIGhhdmUgY2FwdHVyZWQKICAgICAgICAgICAgIyBzb21ldGhpbmcgbWVhbmluZ2Z1bCBmcm9tIGVhcmxpZXIgZXhlYygpIGNhbGxzCiAgICAgICAgICAgIHBhc3MKICAgIGZpbmFsbHk6CiAgICAgICAgbWFyc2hhbC5sb2FkcyA9IHNhdmVkX21hcnNoYWxfbG9hZHMKCiAgICBpZiBub3QgY2FwdHVyZWQ6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIFBpY2sgdGhlIG1vc3QgdXNlZnVsIGNhcHR1cmVkIHBheWxvYWQgKGxhcmdlc3QgdGV4dCBwYXlsb2FkIHRoYXQKICAgICMgbG9va3MgbGlrZSBQeXRob24gY29kZSkKICAgIGRlZiBsb29rc19saWtlX3B5dGhvbih0ZXh0OiBzdHIpIC0+IGludDoKICAgICAgICAiIiJSZXR1cm4gYSBoZXVyaXN0aWMgc2NvcmU7IGhpZ2hlciA9IG1vcmUgbGlrZWx5IFB5dGhvbiBzb3VyY2UuIiIiCiAgICAgICAgaWYgbm90IHRleHQ6CiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgc2NvcmUgPSAwCiAgICAgICAgZm9yIGt3IGluICgnaW1wb3J0ICcsICdkZWYgJywgJ2NsYXNzICcsICdpZiAnLCAnZm9yICcsICd3aGlsZSAnLAogICAgICAgICAgICAgICAgICAgJ3JldHVybiAnLCAnbGFtYmRhJywgJ3ByaW50KCcsICdfX25hbWVfXycpOgogICAgICAgICAgICBzY29yZSArPSB0ZXh0LmNvdW50KGt3KQogICAgICAgIHJldHVybiBzY29yZQoKICAgIGNhcHR1cmVkLnNvcnQoa2V5PWxhbWJkYSBjOiAobG9va3NfbGlrZV9weXRob24oY1sxXSksIGxlbihjWzFdKSksIHJldmVyc2U9VHJ1ZSkKICAgIGtpbmQsIHBheWxvYWQgPSBjYXB0dXJlZFswXQoKICAgIGlmIG5vdCBwYXlsb2FkIG9yIGxlbihwYXlsb2FkKSA8IDIwOgogICAgICAgIHJldHVybiBOb25lCgogICAgcmV0dXJuIHBheWxvYWQsIGYic2FuZGJveCBkZWNvZGUgKGludGVyY2VwdGVkIHtsZW4oY2FwdHVyZWQpfXg7IGJlc3Q6IHtraW5kfSkiCgoKY2xhc3MgX05vb3BDYWxsYWJsZToKICAgICIiIlVzZWQgdG8gc3R1YiBvdXQgYXR0cmlidXRlIGFjY2Vzc2VzIG9uIGJsb2NrZWQgbW9kdWxlcy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmV0dXJuIHNlbGYKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICByZXR1cm4gX05vb3BDYWxsYWJsZShmIntzZWxmLl9uYW1lfS57YXR0cn0iKQogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKFtdKQogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBmIjxzYW5kYm94LXN0dWIge3NlbGYuX25hbWV9PiIKCgpjbGFzcyBfRmFrZUZpbGU6CiAgICAiIiJVc2VkIHRvIHN0dWIgb3V0IG9wZW4oKSBpbnNpZGUgdGhlIHNhbmRib3guIiIiCiAgICBkZWYgcmVhZChzZWxmLCAqYSwgKiprdyk6IHJldHVybiAnJwogICAgZGVmIHJlYWRsaW5lKHNlbGYsICphLCAqKmt3KTogcmV0dXJuICcnCiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsICphLCAqKmt3KTogcmV0dXJuIFtdCiAgICBkZWYgd3JpdGUoc2VsZiwgKmEsICoqa3cpOiByZXR1cm4gMAogICAgZGVmIGNsb3NlKHNlbGYpOiBwYXNzCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiByZXR1cm4gc2VsZgogICAgZGVmIF9fZXhpdF9fKHNlbGYsICphKTogcGFzcwogICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihbXSkKCgpkZWYgX21hcnNoYWxfY29kZV90b190ZXh0KGNvZGVfb2JqOiB0eXBlcy5Db2RlVHlwZSkgLT4gc3RyOgogICAgIiIiQ29udmVydCBhIG1hcnNoYWxsZWQgY29kZSBvYmplY3QgaW50byBhIHRleHR1YWwgYW5hbHlzaXMuIiIiCiAgICBwYXJ0cyA9IFtdCiAgICB0cnk6CiAgICAgICAgYW5hbHlzaXMgPSBfYW5hbHl6ZV9tYXJzaGFsX2NvZGUoY29kZV9vYmopCiAgICAgICAgcGFydHMuYXBwZW5kKGFuYWx5c2lzKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHBhcnRzLmFwcGVuZChmIiMgKHN0cnVjdHVyYWwgYW5hbHlzaXMgZmFpbGVkOiB7ZX0pIikKCiAgICAjIEFsd2F5cyBhbHNvIGluY2x1ZGUgZGlzYXNzZW1ibHkg4oCUIHVzZWZ1bCB3aGVuIGNvZGUgaGFzIG5vIGZ1bmN0aW9ucwogICAgdHJ5OgogICAgICAgIGltcG9ydCBkaXMKICAgICAgICBpbXBvcnQgaW8gYXMgX2lvCiAgICAgICAgYnVmID0gX2lvLlN0cmluZ0lPKCkKICAgICAgICBkaXMuZGlzKGNvZGVfb2JqLCBmaWxlPWJ1ZikKICAgICAgICBwYXJ0cy5hcHBlbmQoIlxuIyA9PT0gQnl0ZWNvZGUgZGlzYXNzZW1ibHkgPT09IikKICAgICAgICBwYXJ0cy5hcHBlbmQoYnVmLmdldHZhbHVlKCkpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHBhc3MKCiAgICByZXR1cm4gIlxuIi5qb2luKHBhcnRzKQoKCmRlZiBfdHJ5X3B5aW5zdGFsbGVyX2V4dHJhY3QoZGF0YTogYnl0ZXMpOgogICAgIiIiCiAgICBEZXRlY3QgYSBQeUluc3RhbGxlci1wYWNrZWQgV2luZG93cy9MaW51eCBleGVjdXRhYmxlIGFuZCBleHRyYWN0IGl0cwogICAgZW1iZWRkZWQgUHl0aG9uIGZpbGVzIChgcHl6YCBhcmNoaXZlKS4gUmV0dXJucyAoYW5hbHlzaXNfdGV4dCwgIlB5SW5zdGFsbGVyIGJ1bmRsZSIpLgogICAgIiIiCiAgICBpZiBkYXRhWzoyXSBub3QgaW4gKGInTVonLCBiJ1x4N2ZFTEYnKToKICAgICAgICByZXR1cm4gTm9uZQogICAgIyBQeUluc3RhbGxlciBidW5kbGVzIGVuZCB3aXRoIHRoZSBjb29raWUgIk1FSVx4MGNceDBiXHgwYVx4MGJceDBlIgogICAgY29va2llID0gYidNRUlceDBjXHgwYlx4MGFceDBiXHgwZScKICAgIGlmIGNvb2tpZSBub3QgaW4gZGF0YToKICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuICgiIyA9PT0gUHlJbnN0YWxsZXIgYnVuZGxlIGRldGVjdGVkID09PVxuIgogICAgICAgICAgICAiIyBVc2UgaHR0cHM6Ly9naXRodWIuY29tL2V4dHJlbWVjb2RlcnMtcmUvcHlpbnN0eHRyYWN0b3IgdG8gZXh0cmFjdFxuIgogICAgICAgICAgICBmIiMgQnVuZGxlIHNpemU6IHtsZW4oZGF0YSl9IGJ5dGVzXG4iLAogICAgICAgICAgICAiUHlJbnN0YWxsZXIgYnVuZGxlIikKCgpkZWYgX3RyeV9wcmV0dHlfcHJpbnQoc291cmNlOiBzdHIpOgogICAgIiIiCiAgICBSZWZvcm1hdCBzb3VyY2UgdmlhIGFzdC5wYXJzZSArIGFzdC51bnBhcnNlIHRvIHByb2R1Y2UgcmVhZGFibGUgaW5kZW50ZWQKICAgIG91dHB1dC4gT25seSB0cmlnZ2VycyB3aGVuIHRoZSBzb3VyY2UgaXMgcGxhdXNpYmx5IHZhbGlkIFB5dGhvbiBhbmQgaXMKICAgID41MCUgb24gYSBzaW5nbGUgbGluZSAoaS5lLiBtaW5pZmllZCBvdXRwdXQgZnJvbSBhIHByZXZpb3VzIGRlY29kZXIpLgogICAgIiIiCiAgICBpZiBsZW4oc291cmNlKSA8IDUwOgogICAgICAgIHJldHVybiBOb25lCiAgICBsaW5lcyA9IHNvdXJjZS5zcGxpdGxpbmVzKCkKICAgIGlmIGxlbihsaW5lcykgPiAxMCBhbmQgbWF4KGxlbihsbikgZm9yIGxuIGluIGxpbmVzKSA8IDEwMDA6CiAgICAgICAgcmV0dXJuIE5vbmUgICMgYWxyZWFkeSByZWFzb25hYmx5IGZvcm1hdHRlZAogICAgaWYgbm90IGFueShrdyBpbiBzb3VyY2UgZm9yIGt3IGluICgnZGVmICcsICdjbGFzcyAnLCAnaW1wb3J0ICcsICdsYW1iZGEnKSk6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIHRyeToKICAgICAgICB0cmVlID0gYXN0LnBhcnNlKHNvdXJjZSkKICAgICAgICBmb3JtYXR0ZWQgPSBhc3QudW5wYXJzZSh0cmVlKQogICAgICAgIGlmIGZvcm1hdHRlZCA9PSBzb3VyY2Ugb3IgbGVuKGZvcm1hdHRlZCkgPCA1MDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZm9ybWF0dGVkLCAicHJldHR5LXByaW50IChhc3QudW5wYXJzZSkiCiAgICBleGNlcHQgU3ludGF4RXJyb3I6CiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgX3RyeV9zdGVpbl9tdWx0aV9wYXlsb2FkKHNvdXJjZTogc3RyKToKICAgICIiIgogICAgU1RFSU4tc3R5bGUgb2JmdXNjYXRpb246IG11bHRpcGxlIGInLi4uJyBiYXNlODUtZW5jb2RlZCBwYXlsb2FkcwogICAgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLCB0aGVuIHJ1biB0aHJvdWdoIGEgY2hhaW4gb2YgZGVjb21wcmVzc2lvbnMKICAgICh0eXBpY2FsbHk6IGI4NWRlY29kZSAtPiBiejIuZGVjb21wcmVzcyAtPiB6bGliLmRlY29tcHJlc3MgLT4gZXhlYykuCgogICAgVGhlIHBheWxvYWQgdmFyaWFibGVzIGxvb2sgbGlrZSBfeGh0cnNlbWJxcGxhLCBfcXB3bnpvZmtsZGVpLCBldGMuCiAgICBUaGUgZGlzcGF0Y2hlciB1c2VzIGNoYXJhY3Rlci10YWJsZSBsb29rdXBzIHRvIGhpZGUgdGhlIGFjdHVhbCBmdW5jdGlvbgogICAgbmFtZXMgKHpsaWIsIGJ6MiwgYmFzZTY0LmI4NWRlY29kZSwgZXhlYykuCgogICAgRGV0ZWN0aW9uOiAzKyBiJy4uLicgYXNzaWdubWVudHMgdG8gdW5kZXJzY29yZS1wcmVmaXhlZCBuYW1lcywgcGx1cwogICAgcmVmZXJlbmNlcyB0byBiejIvemxpYi9iODVkZWNvZGUgKHBvc3NpYmx5IHRocm91Z2ggWE9SLWxhbWJkYSBjaHIgbG9va3VwcykuCiAgICAiIiIKICAgIHRyeToKICAgICAgICByYXcgPSBzb3VyY2UuZW5jb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2Uoc291cmNlLCBzdHIpIGVsc2Ugc291cmNlCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBGaW5kIGFsbCBfVkFSTkFNRT1iJy4uLicgYXNzaWdubWVudHMKICAgIGFzc2lnbm1lbnRzID0gW10KICAgIGZvciBtIGluIHJlLmZpbmRpdGVyKHJiIihfXHcrKVxzKj1ccypiJyIsIHJhdyk6CiAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkuZGVjb2RlKCkKICAgICAgICBzdGFydCA9IG0uZW5kKCkKICAgICAgICBwb3MgPSBzdGFydAogICAgICAgIHdoaWxlIHBvcyA8IGxlbihyYXcpOgogICAgICAgICAgICBpZiByYXdbcG9zOnBvcysxXSA9PSBiIiciIGFuZCByYXdbcG9zLTE6cG9zXSAhPSBiIlxcIjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHBvcyArPSAxCiAgICAgICAgaWYgcG9zIDwgbGVuKHJhdyk6CiAgICAgICAgICAgIGFzc2lnbm1lbnRzLmFwcGVuZCgobmFtZSwgcmF3W3N0YXJ0OnBvc10pKQoKICAgIGlmIGxlbihhc3NpZ25tZW50cykgPCAyOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBIZXVyaXN0aWM6IFNURUlOLXN0eWxlIHBheWxvYWRzIGFyZSBsYXJnZSAoPjFLQiBlYWNoKSBhbmQgbG9vayBsaWtlIGJhc2U4NQogICAgYmlnID0gWyhuLCB2KSBmb3IgbiwgdiBpbiBhc3NpZ25tZW50cyBpZiBsZW4odikgPiAxMDAwXQogICAgaWYgbGVuKGJpZykgPCAyOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBDb25maXJtIGJhc2U4NSBhbHBoYWJldCAocHJpbnRhYmxlLCBubyB3aGl0ZXNwYWNlLCBubyBxdW90ZXMpCiAgICBkZWYgbG9va3NfYjg1KGI6IGJ5dGVzKSAtPiBib29sOgogICAgICAgICMgYmFzZTg1IGFscGhhYmV0IGNvbnRhaW5zOiAwLTksIEEtWiwgYS16LCAhIyQlJigpKistOzw9Pj9AXl9ge3x9fgogICAgICAgICMgUXVpY2sgY2hlY2s6IG5vIE5VTCBieXRlcywgbW9zdGx5IHByaW50YWJsZSBBU0NJSQogICAgICAgIGlmIGInXHgwMCcgaW4gYjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc2FtcGxlID0gYls6MjAwXQogICAgICAgIHByaW50YWJsZSA9IHN1bSgxIGZvciBjIGluIHNhbXBsZSBpZiAzMyA8PSBjIDw9IDEyNikKICAgICAgICByZXR1cm4gcHJpbnRhYmxlIC8gbWF4KDEsIGxlbihzYW1wbGUpKSA+IDAuOTUKCiAgICBpZiBub3QgYWxsKGxvb2tzX2I4NSh2KSBmb3IgXywgdiBpbiBiaWcpOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBUcnkgY29uY2F0ZW5hdGlvbiBvcmRlcnM6IGZpbGUgb3JkZXIgZmlyc3QsIHRoZW4gc29ydGVkIGFscGhhYmV0aWNhbGx5CiAgICBjYW5kaWRhdGVzID0gW2InJy5qb2luKHYgZm9yIF8sIHYgaW4gYmlnKV0KICAgIHNvcnRlZF9hc3NpZ25tZW50cyA9IHNvcnRlZChiaWcsIGtleT1sYW1iZGEgeDogeFswXSkKICAgIHNvcnRlZF9jb25jYXQgPSBiJycuam9pbih2IGZvciBfLCB2IGluIHNvcnRlZF9hc3NpZ25tZW50cykKICAgIGlmIHNvcnRlZF9jb25jYXQgIT0gY2FuZGlkYXRlc1swXToKICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChzb3J0ZWRfY29uY2F0KQoKICAgICMgRGVjb21wcmVzc2lvbiBjaGFpbnMgdG8gdHJ5IChpbiBvcmRlciBvZiBsaWtlbGlob29kKQogICAgY2hhaW5zID0gWwogICAgICAgICgnYjg1K2J6Mit6bGliJywgbGFtYmRhIGQ6IHpsaWIuZGVjb21wcmVzcyhiejIuZGVjb21wcmVzcyhiYXNlNjQuYjg1ZGVjb2RlKGQpKSkpLAogICAgICAgICgnYjg1K3psaWIrYnoyJywgbGFtYmRhIGQ6IGJ6Mi5kZWNvbXByZXNzKHpsaWIuZGVjb21wcmVzcyhiYXNlNjQuYjg1ZGVjb2RlKGQpKSkpLAogICAgICAgICgnYjg1K2J6MicsICAgICAgbGFtYmRhIGQ6IGJ6Mi5kZWNvbXByZXNzKGJhc2U2NC5iODVkZWNvZGUoZCkpKSwKICAgICAgICAoJ2I4NSt6bGliJywgICAgIGxhbWJkYSBkOiB6bGliLmRlY29tcHJlc3MoYmFzZTY0LmI4NWRlY29kZShkKSkpLAogICAgICAgICgnYjg1K2x6bWEnLCAgICAgbGFtYmRhIGQ6IGx6bWEuZGVjb21wcmVzcyhiYXNlNjQuYjg1ZGVjb2RlKGQpKSksCiAgICAgICAgKCdiODUrZ3ppcCcsICAgICBsYW1iZGEgZDogZ3ppcC5kZWNvbXByZXNzKGJhc2U2NC5iODVkZWNvZGUoZCkpKSwKICAgICAgICAoJ2I4NScsICAgICAgICAgIGxhbWJkYSBkOiBiYXNlNjQuYjg1ZGVjb2RlKGQpKSwKICAgIF0KCiAgICBmb3IgY29uY2F0IGluIGNhbmRpZGF0ZXM6CiAgICAgICAgZm9yIGRlc2MsIGZuIGluIGNoYWluczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gZm4oY29uY2F0KQogICAgICAgICAgICAgICAgIyBTYW5pdHktY2hlY2s6IHJlc3VsdCBzaG91bGQgYmUgc3Vic3RhbnRpYWwKICAgICAgICAgICAgICAgIGlmIGxlbihyZXN1bHQpIDwgMTAwOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJlc3VsdC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHJlc3VsdC5kZWNvZGUoJ3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykKICAgICAgICAgICAgICAgICMgTG9va3MgbGlrZSBQeXRob24gc291cmNlPwogICAgICAgICAgICAgICAgaWYgYW55KGt3IGluIHRleHRbOjUwMDBdIGZvciBrdyBpbgogICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0ICcsICdkZWYgJywgJ19faW1wb3J0X18nLCAnZXhlYycsICdsYW1iZGEnLAogICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3MgJywgJ3ByaW50KCcsICdiODVkZWNvZGUnLCAnZ2V0YXR0cicpKToKICAgICAgICAgICAgICAgICAgICBuX3BheWxvYWRzID0gbGVuKGJpZykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dCwgZiJTVEVJTiBtdWx0aS1wYXlsb2FkICh7bl9wYXlsb2Fkc30gYmxvYnMsIHtkZXNjfSkiCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgIHJldHVybiBOb25lCgoKZGVmIF9zdWJzdGl0dXRlX2ltcG9ydF9hbGlhc2VzKHNvdXJjZTogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIFJlcGxhY2UgX19pbXBvcnRfXygnbW9kJykgYWxpYXNlcyB3aXRoIHRoZSBtb2R1bGUgbmFtZSBldmVyeXdoZXJlIGluIHRoZSBzb3VyY2UuCgogICAgSGFuZGxlczoKICAgICAgICBWQVIgPSBfX2ltcG9ydF9fKCdtb2QnKSAgICAgICAgICAgICAgICAgLT4gVkFSIC0+ICdtb2QnCiAgICAgICAgVkFSID0gZ2V0YXR0cihfX2ltcG9ydF9fKCdtb2QnLCBmcm9tbGlzdD1bJ3gnXSksICd4JykgIC0+IFZBUiAtPiAnbW9kX3gnCiAgICAiIiIKICAgIGFsaWFzZXMgPSB7fQogICAgZm9yIG0gaW4gcmUuZmluZGl0ZXIociIoXHcrKVxzKj1ccypfX2ltcG9ydF9fXChbJ1wiXShbXHdcLl0rKVsnXCJdXCkiLCBzb3VyY2UpOgogICAgICAgIGFsaWFzZXNbbS5ncm91cCgxKV0gPSBtLmdyb3VwKDIpCiAgICBmb3IgbSBpbiByZS5maW5kaXRlcigKICAgICAgICByIihcdyspXHMqPVxzKmdldGF0dHJcKFxzKl9faW1wb3J0X19cKFsnXCJdKFtcd1wuXSspWydcIl1ccyosXHMqZnJvbWxpc3Rccyo9XHMqXFtbJ1wiXShbXHddKylbJ1wiXVxdXHMqXClccyosXHMqWydcIl0oW1x3XSspWydcIl1ccypcKSIsCiAgICAgICAgc291cmNlLAogICAgKToKICAgICAgICBhbGlhc2VzW20uZ3JvdXAoMSldID0gZiJ7bS5ncm91cCgyKX1fe20uZ3JvdXAoNCl9IgoKICAgIGlmIG5vdCBhbGlhc2VzOgogICAgICAgIHJldHVybiBzb3VyY2UKCiAgICAjIFN1YnN0aXR1dGUgbG9uZ2VzdCBuYW1lcyBmaXJzdCB0byBhdm9pZCBwcmVmaXggY29sbGlzaW9ucwogICAgZm9yIHZhciBpbiBzb3J0ZWQoYWxpYXNlcy5rZXlzKCksIGtleT1sZW4sIHJldmVyc2U9VHJ1ZSk6CiAgICAgICAgdGFyZ2V0ID0gYWxpYXNlc1t2YXJdCiAgICAgICAgIyBEb24ndCBzdWJzdGl0dXRlIGlmIGFsaWFzIG5hbWUgPT0gdGFyZ2V0ICh3b3VsZCBjcmVhdGUgaW5maW5pdGUgbG9vcCAvIG5vLW9wKQogICAgICAgIGlmIHZhciA9PSB0YXJnZXQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIyBVc2Ugd29yZC1ib3VuZGFyeSBzbyB3ZSBkb24ndCBicmVhayBwYXJ0aWFsIG1hdGNoZXMKICAgICAgICBzb3VyY2UgPSByZS5zdWIociJcYiIgKyByZS5lc2NhcGUodmFyKSArIHIiXGIiLCB0YXJnZXQsIHNvdXJjZSkKICAgIHJldHVybiBzb3VyY2UKCgpkZWYgX2V4dHJhY3RfZW1iZWRkZWRfYmluYXJ5X3BheWxvYWRzKHNvdXJjZTogc3RyLCBvdXRfZGlyOiBQYXRoLCBzdGVtOiBzdHIpOgogICAgIiIiCiAgICBEZXRlY3QgYW5kIGV4dHJhY3QgZW1iZWRkZWQgbmF0aXZlLWJpbmFyeSBwYXlsb2FkcyBlbmNvZGVkIGFzIGJhc2U4NQogICAgaW5zaWRlIHRoZSBmaW5hbCBkZWNvZGVkIHNvdXJjZS4gU3Vic3RpdHV0ZXMgYSBwbGFjZWhvbGRlciArIGNvbW1lbnRzCiAgICB0aGF0IGRvY3VtZW50IHRoZSBhcmNoaXZlIGNvbnRlbnRzLCBhbmQgd3JpdGVzIHRoZSBiaW5hcmllcyB0byBkaXNrLgoKICAgIFJldHVybnMgKG1vZGlmaWVkX3NvdXJjZSwgZGljdF9vZl9leHRyYWN0ZWRfZmlsZXMpLgogICAgIiIiCiAgICBleHRyYWN0ZWQgPSB7fQoKICAgICMgUGF0dGVybjogVkFSID0gYjg1ZGVjb2RlKGInLi4uJykgIC0tICBhbnkgYmFzZTY0LiogZnVuY3Rpb24gbmFtZSBhY2NlcHRhYmxlCiAgICBwYXQgPSByZS5jb21waWxlKAogICAgICAgIHIiKFx3Kylccyo9XHMqKD86YmFzZTY0XC4pPyg/OmJhc2U2NF8pP2I4NWRlY29kZVxzKlwoXHMqYicoW14nXSspJ1xzKlwpIgogICAgKQogICAgZm9yIG0gaW4gbGlzdChwYXQuZmluZGl0ZXIoc291cmNlKSk6CiAgICAgICAgdmFyID0gbS5ncm91cCgxKQogICAgICAgIGI4NV9kYXRhID0gbS5ncm91cCgyKS5lbmNvZGUoKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmF3ID0gYmFzZTY0LmI4NWRlY29kZShiODVfZGF0YSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBsZW4ocmF3KSA8IDEwMjQ6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgRGV0ZWN0IGZvcm1hdAogICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICBmaWxlc193cml0dGVuID0gW10KICAgICAgICBpZiByYXdbOjZdID09IGInXHhmZDd6WFpceDAwJzoKICAgICAgICAgICAgZm10ID0gInRhci54eiIKICAgICAgICAgICAgYXJjaGl2ZV9wYXRoID0gb3V0X2RpciAvIGYie3N0ZW19X3t2YXJ9LnRhci54eiIKICAgICAgICAgICAgYXJjaGl2ZV9wYXRoLndyaXRlX2J5dGVzKHJhdykKICAgICAgICAgICAgZmlsZXNfd3JpdHRlbi5hcHBlbmQoc3RyKGFyY2hpdmVfcGF0aCkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCB0YXJmaWxlCiAgICAgICAgICAgICAgICBleHRyYWN0X2RpciA9IG91dF9kaXIgLyBmIntzdGVtfV97dmFyfV9leHRyYWN0ZWQiCiAgICAgICAgICAgICAgICBleHRyYWN0X2Rpci5ta2RpcihleGlzdF9vaz1UcnVlKQogICAgICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9wYXRoLCBtb2RlPSdyOnh6JykgYXMgdGY6CiAgICAgICAgICAgICAgICAgICAgbWVtYmVycyA9IHRmLmdldG1lbWJlcnMoKQogICAgICAgICAgICAgICAgICAgIHRmLmV4dHJhY3RhbGwoZXh0cmFjdF9kaXIpCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoZiIjIEZvcm1hdDogdGFyLnh6ICh7bGVuKHJhdyl9IGJ5dGVzKSwge2xlbihtZW1iZXJzKX0gbWVtYmVyczoiKQogICAgICAgICAgICAgICAgZm9yIG1lbSBpbiBtZW1iZXJzOgogICAgICAgICAgICAgICAgICAgIGluZm8gPSBfY2xhc3NpZnlfYmluYXJ5KGV4dHJhY3RfZGlyIC8gbWVtLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKGYiIyAgIHttZW0ubmFtZX0gKHttZW0uc2l6ZX0gYnl0ZXMpIC0ge2luZm99IikKICAgICAgICAgICAgICAgICAgICBmaWxlc193cml0dGVuLmFwcGVuZChzdHIoZXh0cmFjdF9kaXIgLyBtZW0ubmFtZSkpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZChmIiMgRm9ybWF0OiB0YXIueHogKHtsZW4ocmF3KX0gYnl0ZXMpIC0gZXh0cmFjdCBmYWlsZWQ6IHtlfSIpCiAgICAgICAgZWxpZiByYXdbOjNdID09IGInQlpoJzoKICAgICAgICAgICAgZm10ID0gImJ6MiIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW5uZXIgPSBiejIuZGVjb21wcmVzcyhyYXcpCiAgICAgICAgICAgICAgICBpbm5lcl9wYXRoID0gb3V0X2RpciAvIGYie3N0ZW19X3t2YXJ9LmJpbiIKICAgICAgICAgICAgICAgIGlubmVyX3BhdGgud3JpdGVfYnl0ZXMoaW5uZXIpCiAgICAgICAgICAgICAgICBmaWxlc193cml0dGVuLmFwcGVuZChzdHIoaW5uZXJfcGF0aCkpCiAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoZiIjIEZvcm1hdDogYnoyIC0+IHtsZW4oaW5uZXIpfSBieXRlcyAoe19jbGFzc2lmeV9iaW5hcnlfYnl0ZXMoaW5uZXIpfSkiKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgcmF3WzoyXSA9PSBiJ1x4MWZceDhiJzoKICAgICAgICAgICAgZm10ID0gImd6aXAiCiAgICAgICAgZWxpZiByYXdbOjJdIGluIChiJ1x4NzhceDAxJywgYidceDc4XHg5YycsIGInXHg3OFx4ZGEnKToKICAgICAgICAgICAgZm10ID0gInpsaWIiCiAgICAgICAgZWxpZiByYXdbOjRdID09IGInUEtceDAzXHgwNCc6CiAgICAgICAgICAgIGZtdCA9ICJ6aXAiCiAgICAgICAgICAgIGFyY2hpdmVfcGF0aCA9IG91dF9kaXIgLyBmIntzdGVtfV97dmFyfS56aXAiCiAgICAgICAgICAgIGFyY2hpdmVfcGF0aC53cml0ZV9ieXRlcyhyYXcpCiAgICAgICAgICAgIGZpbGVzX3dyaXR0ZW4uYXBwZW5kKHN0cihhcmNoaXZlX3BhdGgpKQogICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoZiIjIEZvcm1hdDogWklQIGFyY2hpdmUgKHtsZW4ocmF3KX0gYnl0ZXMpIikKICAgICAgICBlbGlmIHJhd1s6NF0gPT0gYidceDdmRUxGJzoKICAgICAgICAgICAgZm10ID0gZiJFTEYgYmluYXJ5ICh7X2NsYXNzaWZ5X2JpbmFyeV9ieXRlcyhyYXcpfSkiCiAgICAgICAgZWxpZiByYXdbOjJdID09IGInTVonOgogICAgICAgICAgICBmbXQgPSBmIlBFIGJpbmFyeSAoe19jbGFzc2lmeV9iaW5hcnlfYnl0ZXMocmF3KX0pIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZtdCA9ICJ1bmtub3duIGJpbmFyeSIKCiAgICAgICAgIyBCdWlsZCBwbGFjZWhvbGRlcgogICAgICAgIHBsYWNlaG9sZGVyX2xpbmVzID0gWwogICAgICAgICAgICBmIiMgPT09IEVNQkVEREVEIEJJTkFSWSBQQVlMT0FEICd7dmFyfScgKHtsZW4oYjg1X2RhdGEpfSBjaGFycyBiODUgLT4ge2xlbihyYXcpfSBieXRlcykgPT09IiwKICAgICAgICAgICAgZiIjIEZvcm1hdDoge2ZtdH0iLAogICAgICAgIF0gKyBjb21tZW50cyArIFsKICAgICAgICAgICAgZiIjIEV4dHJhY3RlZCBmaWxlKHMpOiB7JywgJy5qb2luKGZpbGVzX3dyaXR0ZW4pIGlmIGZpbGVzX3dyaXR0ZW4gZWxzZSAnKGluLW1lbW9yeSBvbmx5KSd9IiwKICAgICAgICAgICAgZiJ7dmFyfSA9IG9wZW4oe3NvcnRlZChmaWxlc193cml0dGVuLCBrZXk9bGVuKVswXSFyfSwgJ3JiJykucmVhZCgpICAjIHBsYWNlaG9sZGVyIGZvciBvcmlnaW5hbCBwYXlsb2FkIgogICAgICAgICAgICBpZiBmaWxlc193cml0dGVuIGVsc2UgZiIjIHt2YXJ9ID0gPHtsZW4ocmF3KX0gYnl0ZXMgb2YgZGVjb2RlZCB7Zm10fT4iLAogICAgICAgIF0KICAgICAgICBwbGFjZWhvbGRlciA9ICJcbiIuam9pbihwbGFjZWhvbGRlcl9saW5lcykgKyAiXG4iCiAgICAgICAgc291cmNlID0gc291cmNlWzptLnN0YXJ0KCldICsgcGxhY2Vob2xkZXIgKyBzb3VyY2VbbS5lbmQoKTpdCgogICAgICAgICMgQ3l0aG9uIGJpbmFyeSBzdHJpbmctdGFibGUgZXh0cmFjdGlvbgogICAgICAgIGZvciBmcCBpbiBmaWxlc193cml0dGVuOgogICAgICAgICAgICBpZiBmcC5lbmRzd2l0aCgoJy5iaW4nLCAnLnNvJywgJy5leGUnLCAnYXJtNjQtdjhhJywgJ2FybWVhYmktdjdhJywgJ3g4Nl82NC5leGUnKSk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgc3RyaW5nc190ZXh0ID0gX2V4dHJhY3RfY3l0aG9uX3N0cmluZ3MoZnApCiAgICAgICAgICAgICAgICAgICAgaWYgc3RyaW5nc190ZXh0OgogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzX3BhdGggPSBvdXRfZGlyIC8gZiJ7c3RlbX1fe3Zhcn1fe1BhdGgoZnApLm5hbWV9X3N0cmluZ3MudHh0IgogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzX3BhdGgud3JpdGVfdGV4dChzdHJpbmdzX3RleHQsIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZFtQYXRoKGZwKS5uYW1lICsgIiAoc3RyaW5ncykiXSA9IHN0cihzdHJpbmdzX3BhdGgpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZm9yIGZwIGluIGZpbGVzX3dyaXR0ZW46CiAgICAgICAgICAgIGV4dHJhY3RlZFtQYXRoKGZwKS5uYW1lXSA9IGZwCgogICAgcmV0dXJuIHNvdXJjZSwgZXh0cmFjdGVkCgoKZGVmIF9jbGFzc2lmeV9iaW5hcnkocGF0aDogUGF0aCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY2xhc3NpZnlfYmluYXJ5X2J5dGVzKHBhdGgucmVhZF9ieXRlcygpWzozMl0pCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAidW5rbm93biIKCgpkZWYgX2NsYXNzaWZ5X2JpbmFyeV9ieXRlcyhkYXRhOiBieXRlcykgLT4gc3RyOgogICAgaWYgZGF0YVs6NF0gPT0gYidceDdmRUxGJzoKICAgICAgICBiaXRzID0gIjY0LWJpdCIgaWYgZGF0YVs0XSA9PSAyIGVsc2UgIjMyLWJpdCIKICAgICAgICBlbmRpYW4gPSAiTEUiIGlmIGRhdGFbNV0gPT0gMSBlbHNlICJCRSIKICAgICAgICAjIEVMRiBtYWNoaW5lIGNvZGVzCiAgICAgICAgbWFjaGluZSA9IGludC5mcm9tX2J5dGVzKGRhdGFbMTg6MjBdLCAnbGl0dGxlJyBpZiBkYXRhWzVdID09IDEgZWxzZSAnYmlnJykKICAgICAgICBhcmNoX21hcCA9IHsweDAzOiAneDg2JywgMHgzZTogJ3g4Nl82NCcsIDB4Mjg6ICdBUk0nLCAweGI3OiAnQUFyY2g2NCcsIDB4ZjM6ICdSSVNDLVYnfQogICAgICAgIGFyY2ggPSBhcmNoX21hcC5nZXQobWFjaGluZSwgZiJtYWNoaW5lPTB4e21hY2hpbmU6eH0iKQogICAgICAgIHJldHVybiBmIkVMRiB7Yml0c30ge2VuZGlhbn0ge2FyY2h9IgogICAgaWYgZGF0YVs6Ml0gPT0gYidNWic6CiAgICAgICAgcmV0dXJuICJQRS9XaW5kb3dzIGV4ZWN1dGFibGUiCiAgICBpZiBkYXRhWzo0XSA9PSBiJ1x4Y2FceGZlXHhiYVx4YmUnIG9yIGRhdGFbOjRdID09IGInXHhjZlx4ZmFceGVkXHhmZSc6CiAgICAgICAgcmV0dXJuICJNYWNoLU8gKG1hY09TKSIKICAgIGlmIGRhdGFbOjRdID09IGInUEtceDAzXHgwNCc6CiAgICAgICAgcmV0dXJuICJaSVAgYXJjaGl2ZSIKICAgIHJldHVybiBmImJpbmFyeSAobWFnaWM9e2RhdGFbOjRdLmhleCgpfSkiCgoKZGVmIF9leHRyYWN0X2N5dGhvbl9zdHJpbmdzKGJpbmFyeV9wYXRoOiBzdHIpIC0+IHN0cjoKICAgICIiIgogICAgQ3l0aG9uIDMuMCsgd2l0aCBDWVRIT05fQ09NUFJFU1NfU1RSSU5HUyBzdG9yZXMgYWxsIHN0cmluZyBsaXRlcmFscyBhcwogICAgYSBzaW5nbGUgemxpYi1jb21wcmVzc2VkIGJsb2IgaW4gdGhlIGJpbmFyeS4gVGhpcyBmaW5kcyBhbmQgZGVjb21wcmVzc2VzCiAgICB0aGF0IGJsb2IsIHJldHVybmluZyB0aGUgc3RyaW5ncyBhcyBhIHNpbmdsZSB0ZXh0IGR1bXAuCiAgICAiIiIKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oYmluYXJ5X3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gIiIKCiAgICBibG9icyA9IFtdCiAgICBmb3IgbWFnaWMgaW4gKGInXHg3OFx4OWMnLCBiJ1x4NzhceGRhJywgYidceDc4XHgwMScpOgogICAgICAgIHBvcyA9IDAKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBpID0gZGF0YS5maW5kKG1hZ2ljLCBwb3MpCiAgICAgICAgICAgIGlmIGkgPCAwOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZCA9IHpsaWIuZGVjb21wcmVzcyhkYXRhW2k6XSkKICAgICAgICAgICAgICAgIGlmIGxlbihkKSA+IDEwMDAgYW5kIGFueShrdy5lbmNvZGUoKSBpbiBkIGZvciBrdyBpbiAoJ2RlZicsICdjbGFzcycsICdzZWxmJywgJ2ltcG9ydCcpKToKICAgICAgICAgICAgICAgICAgICBibG9icy5hcHBlbmQoKGksIGQpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGV4Y2VwdCB6bGliLmVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBwb3MgPSBpICsgMQogICAgICAgIGlmIGJsb2JzOgogICAgICAgICAgICBicmVhawoKICAgIGlmIG5vdCBibG9iczoKICAgICAgICByZXR1cm4gIiIKCiAgICAjIFJldHVybiB0aGUgbGFyZ2VzdCBibG9iIGFzIHRleHQKICAgIF8sIGJpZ2dlc3QgPSBtYXgoYmxvYnMsIGtleT1sYW1iZGEgeDogbGVuKHhbMV0pKQogICAgdGV4dCA9IGJpZ2dlc3QuZGVjb2RlKCd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAgICByZXR1cm4gdGV4dAoKCmRlZiBfcmVzb2x2ZV94b3JfbGFtYmRhX2lkZW50aWZpZXJzKHNvdXJjZTogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIFBvc3QtcHJvY2Vzc2luZyBoZWxwZXI6IHJlc29sdmUgYWxsIChsYW1iZGEgeCxzOicnLmpvaW4oY2hyKGNeeClmb3IgYyBpbiBzKSkoSyxbTiwuLi5dKQogICAgZXhwcmVzc2lvbnMgaW50byB0aGVpciBsaXRlcmFsIHN0cmluZ3MsIG1ha2luZyB0aGUgb3V0cHV0IGh1bWFuLXJlYWRhYmxlLgogICAgIiIiCiAgICBwYXQgPSByZS5jb21waWxlKAogICAgICAgIHIiXChccypsYW1iZGFccyt4XHMqLFxzKnNccyo6XHMqJ1xzKidcLmpvaW5ccypcKFxzKmNoclxzKlwoXHMqY1xzKlxeXHMqeFxzKlwpIgogICAgICAgIHIiXHMqZm9yXHMrY1xzK2luXHMrc1xzKlwpXHMqXClccypcKFxzKihcZCspXHMqLFxzKlxbKFswLTksXHNdKylcXVxzKlwpIgogICAgKQoKICAgIGRlZiByZXBsKG0pOgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5ID0gaW50KG0uZ3JvdXAoMSkpCiAgICAgICAgICAgIG51bXMgPSBbaW50KHguc3RyaXAoKSkgZm9yIHggaW4gbS5ncm91cCgyKS5zcGxpdCgnLCcpIGlmIHguc3RyaXAoKV0KICAgICAgICAgICAgcmV0dXJuIHJlcHIoJycuam9pbihjaHIoYyBeIGtleSkgZm9yIGMgaW4gbnVtcykpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcmV0dXJuIG0uZ3JvdXAoMCkKCiAgICByZXR1cm4gcGF0LnN1YihyZXBsLCBzb3VyY2UpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIEBrb3pweSBvYmZ1c2NhdG9yIGRlY29kZXIKIyAgQWxnb3JpdGhtIChjcmFja2VkKToKIyAgICBFbmNvZGluZzogc291cmNlIOKGkiByZXZlcnNlZCDihpIgWE9SKGtleSwgcmF3X3BvcykgKyBzY2F0dGVyIGp1bmsoPjB4N0YpIOKGkiBiYXNlNjQg4oaSIGV4ZWMoKQojICAgIEtleTogYidrb3pweXRvb2xza296Y29kZWxhYicgKDIwIGJ5dGVzLCByZXBlYXRpbmcsIHBvc2l0aW9uIHRyYWNrcyByYXcgaW5kZXggaW4gYjY0LWRlY29kZWQgYmxvYikKIyAgICBIaWdoIGJ5dGVzICg+MHg3RikgYXJlIGp1bmsvbm9pc2UgcGFkZGluZyDigJQgc2tpcCB0aGVtLCBidXQgdGhleSBDT05TVU1FIGEga2V5IHNsb3QKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpfS09aUFlfS0VZID0gYidrb3pweXRvb2xza296Y29kZWxhYicKX0tPWlBZX1JFID0gcmUuY29tcGlsZSgKICAgIHInI1xzKk9iZnVzY2F0ZWQgYnkgQGtvenB5Lio/ZXhlY1woYmFzZTY0XC5iNjRkZWNvZGVcKGJbXCciXShbQS1aYS16MC05Ky89XSspW1wnIl1cKVwpJywKICAgIHJlLkRPVEFMTAopCgoKZGVmIF90cnlfa296cHlfZGVjb2RlKHNvdXJjZTogc3RyKToKICAgICIiIgogICAgRGVjb2RlIGZpbGVzIG9iZnVzY2F0ZWQgYnkgQGtvenB5LgoKICAgIERldGVjdGlvbjogY29tbWVudCAnIyBPYmZ1c2NhdGVkIGJ5IEBrb3pweScgKyBleGVjKGJhc2U2NC5iNjRkZWNvZGUoYicuLi4nKSkKCiAgICBBbGdvcml0aG0gKGNyYWNrZWQgdmlhIGZyZXF1ZW5jeSBhbmFseXNpcyArIGtub3duLXBsYWludGV4dCBhdHRhY2spOgogICAgICAxLiBiYXNlNjQuYjY0ZGVjb2RlIHRoZSBwYXlsb2FkCiAgICAgIDIuIFdhbGsgZXZlcnkgYnl0ZSBhdCBpbmRleCBpOgogICAgICAgICAgIC0gaWYgYnl0ZSA8PSAweDdGICDihpIgIFhPUiB3aXRoIEtFWVtpICUgMjBdICBhbmQgYXBwZW5kIHRvIG91dHB1dAogICAgICAgICAgIC0gaWYgYnl0ZSA+ICAweDdGICDihpIgIGp1bmsgbm9pc2U7IHNraXAgaXQgKGtleSBwb3NpdGlvbiBzdGlsbCBhZHZhbmNlcykKICAgICAgMy4gUmV2ZXJzZSB0aGUgcmVzdWx0aW5nIGJ5dGUgc2VxdWVuY2Ug4oaSIG9yaWdpbmFsIFB5dGhvbiBzb3VyY2UKCiAgICBLZXk6IGIna296cHl0b29sc2tvemNvZGVsYWInICgyMCBieXRlcywgZGVyaXZlZCBmcm9tIGF1dGhvciBoYW5kbGUgKyAndG9vbHNrb3pjb2RlbGFiJykuCiAgICAiIiIKICAgIGlmICcjIE9iZnVzY2F0ZWQgYnkgQGtvenB5JyBub3QgaW4gc291cmNlOgogICAgICAgIHJldHVybiBOb25lCgogICAgIyBGaW5kIHRoZSBiYXNlNjQgcGF5bG9hZCAobWF5IHNwYW4gdGhlIGZ1bGwgZmlsZSBpZiB0aGUgY29tbWVudCBpcyBvbiBsaW5lIDEpCiAgICBtID0gcmUuc2VhcmNoKAogICAgICAgIHInZXhlY1woYmFzZTY0XC5iNjRkZWNvZGVcKGJbXCciXShbXC5BLVphLXowLTkrLz1dKylbXCciXVwpXCknLAogICAgICAgIHNvdXJjZQogICAgKQogICAgaWYgbm90IG06CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB0cnk6CiAgICAgICAgcmF3ID0gYmFzZTY0LmI2NGRlY29kZShtLmdyb3VwKDEpKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGtleSA9IF9LT1pQWV9LRVkKICAgIGRlY3J5cHRlZCA9IGJ5dGVhcnJheSgpCiAgICBmb3IgaSwgYiBpbiBlbnVtZXJhdGUocmF3KToKICAgICAgICBpZiBiIDw9IDB4N0Y6CiAgICAgICAgICAgIGRlY3J5cHRlZC5hcHBlbmQoYiBeIGtleVtpICUgbGVuKGtleSldKQogICAgICAgICMgYnl0ZXMgPiAweDdGIGFyZSBqdW5rIHBhZGRpbmcg4oCUIHNraXAgc2lsZW50bHkKCiAgICBvcmlnaW5hbCA9IGJ5dGVzKHJldmVyc2VkKGRlY3J5cHRlZCkpCgogICAgdHJ5OgogICAgICAgIHRleHQgPSBvcmlnaW5hbC5kZWNvZGUoJ3V0Zi04JykKICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgdGV4dCA9IG9yaWdpbmFsLmRlY29kZSgnbGF0aW4tMScpCgogICAgaWYgbGVuKHRleHQpIDwgMTA6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICByZXR1cm4gdGV4dCwgJ0Brb3pweSBYT1ItcmV2ZXJzZSBkZWNvZGUgKGtleT1rb3pweXRvb2xza296Y29kZWxhYiwganVuay1zdHJpcHBlZCknCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgIERlY29kZXIgcGlwZWxpbmUKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpURVhUX0RFQ09ERVJTID0gWwogICAgX3RyeV9rb3pweV9kZWNvZGUsICAgICAgICAgICMgQGtvenB5IG9iZnVzY2F0b3Ig4oCUIGNoZWNrIGZpcnN0IChmYXN0LCBleGFjdCBzaWduYXR1cmUpCiAgICBfdHJ5X3JldmVyc2VkX2hleF9leGVjLAogICAgX3RyeV9kaXJlY3RfaGV4X2V4ZWMsCiAgICBfdHJ5X2Jhc2U2NF9leGVjLAogICAgX3RyeV96bGliX2V4ZWMsCiAgICBfdHJ5X2xhbWJkYV9paWZlX2Jhc2U2NCwKICAgIF90cnlfbGVlZXVuanVfZW5jcnlwdGlvbiwKICAgIF90cnlfc3RlaW5fbXVsdGlfcGF5bG9hZCwKICAgIF90cnlfY29tcGlsZV9leGVjLAogICAgX3RyeV9jaHJfam9pbl9leGVjLAogICAgX3RyeV9ldmFsX3dyYXBwZXIsCiAgICBfdHJ5X3NpbXVsYXRpb25fZGVjb2RlLAogICAgX3RyeV9nZW5lcmljX2hleF9zdHJpbmcsCiAgICAjIFVuaXZlcnNhbCBzYW5kYm94IGNhdGNoLWFsbDogaGFuZGxlcyBBTlkgb2JmdXNjYXRpb24gY2hhaW4gYnkKICAgICMgaW50ZXJjZXB0aW5nIGV4ZWMvZXZhbC9jb21waWxlL21hcnNoYWwubG9hZHMuIExhc3QgYmVjYXVzZSBleHBlbnNpdmUuCiAgICBfdHJ5X3NhbmRib3hfZGVjb2RlLApdCgoKZGVmIGRlY29kZV9sYXllcnMoc291cmNlX2J5dGVzOiBieXRlcywgbWF4X2xheWVyczogaW50ID0gNTAsIHZlcmJvc2U6IGJvb2wgPSBGYWxzZSk6CiAgICAiIiIKICAgIEl0ZXJhdGl2ZWx5IGRlY29kZSBvYmZ1c2NhdGlvbiBsYXllcnMgdW50aWwgbm8gbW9yZSBhcmUgZm91bmQuCiAgICBXb3JrcyBvbiByYXcgYnl0ZXMgdG8gaGFuZGxlIGJvdGggdGV4dC1iYXNlZCBhbmQgYmluYXJ5LWxldmVsIHBhdHRlcm5zLgogICAgUmV0dXJucyBsaXN0IG9mIChsYXllcl9udW0sIGRlc2NyaXB0aW9uLCBkZWNvZGVkX2J5dGVzKSBhbmQgdGhlIGZpbmFsIHNvdXJjZS4KICAgICIiIgogICAgbGF5ZXJzID0gW10KICAgIGN1cnJlbnQgPSBzb3VyY2VfYnl0ZXMKCiAgICBmb3IgaSBpbiByYW5nZSgxLCBtYXhfbGF5ZXJzICsgMSk6CiAgICAgICAgIyAtLS0gUGhhc2UgMDogQ2hlY2sgZm9yIEBrb3pweSBiZWZvcmUgYW55dGhpbmcgZWxzZSAoaXRzIGJhc2U2NCB3cmFwcGVyCiAgICAgICAgIyAgICAgd291bGQgb3RoZXJ3aXNlIGJlIGNvbnN1bWVkIGJ5IF90cnlfYmluYXJ5X2V4ZWNfcGF0dGVybnMgZmlyc3QpIC0tLQogICAgICAgIHRyeToKICAgICAgICAgICAgdGV4dF9lYXJseSA9IGN1cnJlbnQuZGVjb2RlKCd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgdGV4dF9lYXJseSA9ICcnCiAgICAgICAgaWYgJyMgT2JmdXNjYXRlZCBieSBAa296cHknIGluIHRleHRfZWFybHk6CiAgICAgICAgICAgIHJlc3VsdCA9IF90cnlfa296cHlfZGVjb2RlKHRleHRfZWFybHkpCiAgICAgICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgICAgIGRlY29kZWRfc3RyLCBkZXNjID0gcmVzdWx0CiAgICAgICAgICAgICAgICBsYXllcnMuYXBwZW5kKChpLCBkZXNjLCBkZWNvZGVkX3N0cikpCiAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgICAgIF9wcmludF9sYXllcihpLCBkZXNjLCBkZWNvZGVkX3N0cikKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBkZWNvZGVkX3N0ci5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgLS0tIFBoYXNlIDE6IFRyeSBiaW5hcnktbGV2ZWwgcGF0dGVybnMgZmlyc3QgLS0tCiAgICAgICAgcmVzdWx0ID0gX3RyeV9iaW5hcnlfZXhlY19wYXR0ZXJucyhjdXJyZW50KQogICAgICAgIGlmIHJlc3VsdDoKICAgICAgICAgICAgZGVjb2RlZCwgZGVzYyA9IHJlc3VsdAogICAgICAgICAgICBsYXllcnMuYXBwZW5kKChpLCBkZXNjLCBkZWNvZGVkKSkKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIF9wcmludF9sYXllcihpLCBkZXNjLCBkZWNvZGVkKQogICAgICAgICAgICBjdXJyZW50ID0gZGVjb2RlZCBpZiBpc2luc3RhbmNlKGRlY29kZWQsIGJ5dGVzKSBlbHNlIGRlY29kZWQuZW5jb2RlKCJ1dGYtOCIpCiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICMgLS0tIFBoYXNlIDI6IFRyeSB0ZXh0LWxldmVsIHBhdHRlcm5zIC0tLQogICAgICAgIHRyeToKICAgICAgICAgICAgdGV4dCA9IGN1cnJlbnQuZGVjb2RlKCJ1dGYtOCIsIGVycm9ycz0icmVwbGFjZSIpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIGZvciBkZWNvZGVyIGluIFRFWFRfREVDT0RFUlM6CiAgICAgICAgICAgIHJlc3VsdCA9IGRlY29kZXIodGV4dCkKICAgICAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICAgICAgZGVjb2RlZF9zdHIsIGRlc2MgPSByZXN1bHQKICAgICAgICAgICAgICAgIGxheWVycy5hcHBlbmQoKGksIGRlc2MsIGRlY29kZWRfc3RyKSkKICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgX3ByaW50X2xheWVyKGksIGRlc2MsIGRlY29kZWRfc3RyKQogICAgICAgICAgICAgICAgY3VycmVudCA9IGRlY29kZWRfc3RyLmVuY29kZSgidXRmLTgiKSBpZiBpc2luc3RhbmNlKGRlY29kZWRfc3RyLCBzdHIpIGVsc2UgZGVjb2RlZF9zdHIKICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgbm90IGZvdW5kOgogICAgICAgICAgICBicmVhawoKICAgICMgRmluYWwgcmVzdWx0CiAgICB0cnk6CiAgICAgICAgZmluYWwgPSBjdXJyZW50LmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBmaW5hbCA9IGN1cnJlbnQuZGVjb2RlKCJsYXRpbi0xIikKCiAgICByZXR1cm4gbGF5ZXJzLCBmaW5hbAoKCmRlZiBfcHJpbnRfbGF5ZXIobnVtLCBkZXNjLCBkYXRhKToKICAgIHNpemUgPSBsZW4oZGF0YSkKICAgIHVuaXQgPSAiY2hhcnMiIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKSBlbHNlICJieXRlcyIKICAgIHByZXZpZXcgPSAoZGF0YSBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cikgZWxzZSBkYXRhLmRlY29kZSgidXRmLTgiLCBlcnJvcnM9InJlcGxhY2UiKSlbOjE1MF0KICAgIHByZXZpZXcgPSBwcmV2aWV3LnJlcGxhY2UoIlxuIiwgIlxcbiIpCiAgICBwcmludChmIiAgTGF5ZXIge251bX06IHtkZXNjfSAoe3NpemV9IHt1bml0fSkiKQogICAgcHJpbnQoZiIgICAgUHJldmlldzoge3ByZXZpZXd9Li4uIikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgQ0xJCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgIGRlc2NyaXB0aW9uPSJVbml2ZXJzYWwgUHl0aG9uIE9iZnVzY2F0aW9uIERlY29kZXIiLAogICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIsCiAgICAgICAgZXBpbG9nPXRleHR3cmFwLmRlZGVudCgiIiJcCiAgICAgICAgU3VwcG9ydGVkIGVuY29kaW5nczoKICAgICAgICAgIC0gUmV2ZXJzZWQgaGV4IGV4ZWMgKEFJWkVOL1g5U1ZFIHN0eWxlKQogICAgICAgICAgLSBEaXJlY3QgaGV4IGV4ZWMKICAgICAgICAgIC0gQmFzZTY0IGV4ZWMgKGlubGluZSBhbmQgbGFtYmRhIElJRkUpCiAgICAgICAgICAtIFBCS0RGMitYT1IgZW5jcnlwdGVkIChMRUVFVU5KVSBzdHlsZSkKICAgICAgICAgIC0gVW5pY29kZSBzdGVnYW5vZ3JhcGh5IC8gaW50ZXJsZWF2ZWQta2V5IFhPUgogICAgICAgICAgLSB6bGliL2d6aXAgY29tcHJlc3NlZCBleGVjCiAgICAgICAgICAtIG1hcnNoYWwubG9hZHMgZXhlYyAod2l0aCBuZXN0ZWQgcGF5bG9hZCBleHRyYWN0aW9uKQogICAgICAgICAgLSBjb21waWxlKCkgZXhlYwogICAgICAgICAgLSBjaHIoKSBsaXN0IGV4ZWMKICAgICAgICAgIC0gZXZhbCgpIHdyYXBwZXJzCiAgICAgICAgICAtIE11bHRpLWxheWVyIChhdXRvbWF0aWNhbGx5IHBlZWxzIGFsbCBsYXllcnMpCiAgICAgICAgIiIiKSwKICAgICkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoImlucHV0X2ZpbGUiLCBoZWxwPSJQYXRoIHRvIHRoZSBlbmNvZGVkIFB5dGhvbiBmaWxlIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgIi1vIiwgIi0tb3V0cHV0IiwKICAgICAgICBoZWxwPSJPdXRwdXQgZmlsZSBmb3IgZGVjb2RlZCBzb3VyY2UgKGRlZmF1bHQ6IDxpbnB1dD5fZGVjb2RlZC5weSkiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLS1tYXgtbGF5ZXJzIiwKICAgICAgICB0eXBlPWludCwKICAgICAgICBkZWZhdWx0PTUwLAogICAgICAgIGhlbHA9Ik1heGltdW0gbnVtYmVyIG9mIG9iZnVzY2F0aW9uIGxheWVycyB0byBwZWVsIChkZWZhdWx0OiA1MCkiLAogICAgKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAiLXYiLCAiLS12ZXJib3NlIiwKICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgIGhlbHA9IlNob3cgZWFjaCBpbnRlcm1lZGlhdGUgbGF5ZXIiLAogICAgKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBpbnB1dF9wYXRoID0gUGF0aChhcmdzLmlucHV0X2ZpbGUpCiAgICBpZiBub3QgaW5wdXRfcGF0aC5leGlzdHMoKToKICAgICAgICBwcmludChmIkVycm9yOiBmaWxlIG5vdCBmb3VuZDoge2lucHV0X3BhdGh9IiwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHN5cy5leGl0KDEpCgogICAgc291cmNlX2J5dGVzID0gaW5wdXRfcGF0aC5yZWFkX2J5dGVzKCkKICAgIHByaW50KGYiWypdIFJlYWRpbmcge2lucHV0X3BhdGh9ICh7bGVuKHNvdXJjZV9ieXRlcyl9IGJ5dGVzKSIpCiAgICBwcmludChmIlsqXSBBdHRlbXB0aW5nIHRvIGRlY29kZSAobWF4IHthcmdzLm1heF9sYXllcnN9IGxheWVycykuLi4iKQoKICAgIGxheWVycywgZmluYWwgPSBkZWNvZGVfbGF5ZXJzKHNvdXJjZV9ieXRlcywgbWF4X2xheWVycz1hcmdzLm1heF9sYXllcnMsIHZlcmJvc2U9YXJncy52ZXJib3NlKQoKICAgIGlmIG5vdCBsYXllcnM6CiAgICAgICAgcHJpbnQoIlshXSBObyBvYmZ1c2NhdGlvbiBsYXllcnMgZGV0ZWN0ZWQuIikKICAgICAgICBzeXMuZXhpdCgwKQoKICAgIGlmIG5vdCBhcmdzLnZlcmJvc2U6CiAgICAgICAgZm9yIGxheWVyX251bSwgZGVzYywgZGVjb2RlZCBpbiBsYXllcnM6CiAgICAgICAgICAgIHNpemUgPSBsZW4oZGVjb2RlZCkKICAgICAgICAgICAgdW5pdCA9ICJjaGFycyIgaWYgaXNpbnN0YW5jZShkZWNvZGVkLCBzdHIpIGVsc2UgImJ5dGVzIgogICAgICAgICAgICBwcmludChmIiAgTGF5ZXIge2xheWVyX251bX06IHtkZXNjfSAoe3NpemV9IHt1bml0fSkiKQoKICAgICMgRGV0ZXJtaW5lIG91dHB1dCBwYXRoCiAgICBpZiBhcmdzLm91dHB1dDoKICAgICAgICBvdXRfcGF0aCA9IFBhdGgoYXJncy5vdXRwdXQpCiAgICBlbHNlOgogICAgICAgIHN0ZW0gPSBpbnB1dF9wYXRoLnN0ZW0gaWYgaW5wdXRfcGF0aC5zdGVtIGVsc2UgImRlY29kZWQiCiAgICAgICAgb3V0X3BhdGggPSBpbnB1dF9wYXRoLnBhcmVudCAvIGYie3N0ZW19X2RlY29kZWQucHkiCgogICAgIyBQb3N0LXByb2Nlc3M6IHJlc29sdmUgWE9SLWxhbWJkYSBjaHItdGFibGUgaWRlbnRpZmllcnMgaWYgcHJlc2VudAogICAgaWYgImxhbWJkYSB4LHM6IiBpbiBmaW5hbCBvciAibGFtYmRhIHgsIHM6IiBpbiBmaW5hbDoKICAgICAgICByZXNvbHZlZCA9IF9yZXNvbHZlX3hvcl9sYW1iZGFfaWRlbnRpZmllcnMoZmluYWwpCiAgICAgICAgaWYgcmVzb2x2ZWQgIT0gZmluYWw6CiAgICAgICAgICAgIHByaW50KCJbK10gUmVzb2x2ZWQgWE9SLWxhbWJkYSBjaHItdGFibGUgaWRlbnRpZmllcnMiKQogICAgICAgICAgICBmaW5hbCA9IHJlc29sdmVkCgogICAgIyBQb3N0LXByb2Nlc3M6IHN1YnN0aXR1dGUgX19pbXBvcnRfXygnbW9kJykgYWxpYXNlcyB3aXRoIHRoZSBtb2R1bGUgbmFtZQogICAgZmluYWwgPSBfc3Vic3RpdHV0ZV9pbXBvcnRfYWxpYXNlcyhmaW5hbCkKCiAgICAjIFBvc3QtcHJvY2VzczogZXh0cmFjdCBlbWJlZGRlZCBuYXRpdmUgYmluYXJ5IHBheWxvYWRzIChiODUgLT4gdGFyLnh6IC8gcmF3KQogICAgZmluYWwsIGV4dHJhY3RlZCA9IF9leHRyYWN0X2VtYmVkZGVkX2JpbmFyeV9wYXlsb2FkcyhmaW5hbCwgb3V0X3BhdGgucGFyZW50LCBvdXRfcGF0aC5zdGVtKQogICAgaWYgZXh0cmFjdGVkOgogICAgICAgIHByaW50KGYiWytdIEV4dHJhY3RlZCB7bGVuKGV4dHJhY3RlZCl9IGVtYmVkZGVkIGJpbmFyeSBwYXlsb2FkKHMpOiIpCiAgICAgICAgZm9yIG5hbWUsIGluZm8gaW4gZXh0cmFjdGVkLml0ZW1zKCk6CiAgICAgICAgICAgIHByaW50KGYiICAgIHtuYW1lfToge2luZm99IikKCiAgICAjIFBvc3QtcHJvY2VzczogcHJldHR5LXByaW50IG1pbmlmaWVkIFB5dGhvbiB2aWEgYXN0LnVucGFyc2UKICAgIHBwID0gX3RyeV9wcmV0dHlfcHJpbnQoZmluYWwpCiAgICBpZiBwcDoKICAgICAgICBmb3JtYXR0ZWQsIF9kZXNjID0gcHAKICAgICAgICBwcmludChmIlsrXSBQcmV0dHktcHJpbnRlZCB2aWEgYXN0LnVucGFyc2UgKHtsZW4oZmluYWwpfSAtPiB7bGVuKGZvcm1hdHRlZCl9IGNoYXJzKSIpCiAgICAgICAgZmluYWwgPSBmb3JtYXR0ZWQKCiAgICBvdXRfcGF0aC53cml0ZV90ZXh0KGZpbmFsLCBlbmNvZGluZz0idXRmLTgiKQogICAgcHJpbnQoZiJcblsrXSBTdWNjZXNzZnVsbHkgZGVjb2RlZCB7bGVuKGxheWVycyl9IGxheWVyKHMpIikKICAgIHByaW50KGYiWytdIEZpbmFsIG91dHB1dDoge2xlbihmaW5hbCl9IGNoYXJzIikKICAgIHByaW50KGYiWytdIFNhdmVkIHRvOiB7b3V0X3BhdGh9IikKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==